使用Nodejs爬取图片音频视频与Python相比平分秋色

百度已收录   阅读次数: 109
2021-09-2020:30:53 发表评论
摘要

此前,伯衡君使用python爬取文字,图片乃至视频的文章对爬取信息有了一个大致的介绍,以及从入门到提高的科普文章,具体可以参看下方的前情提要。同时在最近的Easy Web TV这个项目中,使用代理服务解决CORS也就是跨域问题,也能实现实时爬取信息的目的,而这次,伯衡君则是介绍使用Nodejs来爬取信息,似乎更加强大,与python爬取信息时平分秋色,这篇文章以下载图片为例……

使用Nodejs爬取图片音频视频与Python相比平分秋色

开篇寄语

此前,伯衡君使用python爬取文字,图片乃至视频的文章对爬取信息有了一个大致的介绍,以及从入门到提高的科普文章,具体可以参看下方的前情提要。同时在最近的Easy Web TV这个项目中,使用代理服务解决CORS也就是跨域问题,也能实现实时爬取信息的目的,而这次,伯衡君则是介绍使用Nodejs来爬取信息,似乎更加强大,与python爬取信息时平分秋色,这篇文章以下载图片为例。

前情提要

内容详情

首先是在本机安装nodejs,支持Windows,MacOS,Linux等等,下载安装后,在调试命令窗口输入node -v,如果出现版本号,就说明安装成功啦,如下图所示。

使用Nodejs爬取图片音频视频与Python相比平分秋色

接下来,找到任意一个支持编辑js的IDE就可以啦,比如伯衡君使用的就是VScode。

打开VScode,新建一个文件夹,任意命名,之后在其文件夹下,新建一个文件,任意命名,比如伯衡君就将其命名为demo.js,打开demo.js开始进行编辑。

要想爬取图片并保存到文件夹,需要使用"request", "cheerio"和"fs"这三个依赖,前两个需要安装,调出VScode的命令调试窗口,分别输入npm install request和npm install cheerio,等待安装完成。

安装完成后,就可以直接使用了,在demo.js开头,先引用这三个库:

var request = require('request');
var cheerio = require('cheerio');
var fs = require('fs');

之后,要确定爬取的图片网站,比如伯衡君的目标就是之前在制作Easy Web TV时已经爬取的漫画源——啦啦漫画,网址是https://llmh27.com/default.php,那么就要分析其网站的代码构成,在其首页,点击右键,选择审查元素或者按下f12也能调出调试窗口,经过分析,其真正的内容被放置在了一个iframe里面,如下图所示:

在里面的src就是其真正的首页啦,那么首页网址就是https://llmh27.com/index.php,因为要伪装成浏览器访问,像真人一样,那么就需要设置请求头部信息,类似于下面这样,在demo.js接着输入:

const options = {
    uri: 'https://llmh27.com/index.php',
    method: 'GET',
    headers: {
        'Content-Type': 'text/html; charset=UTF-8',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
    }
};

既然要下载图片,可以先设置一个下载函数,类似于下面这样,也在demo.js接着输入:

var download = function(uri, filename, callback) {
    request.head(uri, function(err, res, body) {
        request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
    });
};

好了,基本上已经完成了前期的准备了,接下来是要找出要下载的图片位置,我们前往啦啦漫画,继续分析其代码组成,如下图所示:

使用Nodejs爬取图片音频视频与Python相比平分秋色

通过分析,每一组图片的位置都可以表示为div>ul>li>a>img中,这样,就可以使用cheerio来确定要寻找的图片位置,书写代码如下:

request(options, function(err, res, body) {
    if (err) {
        console.log(err);
    } else {
        const $ = cheerio.load(body);
        $('div>ul>li').each(function() {
            var title = $(this).find('img').attr('data-src');
            if (title) {
                var name = title.split("/")[title.split('/').length - 1];
                download(title, name, function() {
                    console.log('done');
                });
            } else {
                console.log(1);
            }
        });
    }
});

完整代码如下所示:

var request = require('request');
var cheerio = require('cheerio');
var fs = require('fs');

var download = function(uri, filename, callback) {
    request.head(uri, function(err, res, body) {
        request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
    });
};

const options = {
    uri: 'https://llmh27.com/index.php',
    method: 'GET',
    headers: {
        'Content-Type': 'text/html; charset=UTF-8',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
    }
};

request(options, function(err, res, body) {
    if (err) {
        console.log(err);
    } else {
        const $ = cheerio.load(body);
        $('div>ul>li').each(function() {
            var title = $(this).find('img').attr('data-src');//如果是attr('src')会获取到无效图片地址,故选择data-src
            if (title) {
                //banner的五张图片没有data-src故变成了undefined,所以加了if逻辑选择
                var name = title.split("/")[title.split('/').length - 1];
                download(title, name, function() {
                    console.log('done');
                });
            } else {
                console.log(1);
            }
        });
    }
});

在命令窗口,输入node demo.js,运行后,首页的封面就全部下载到文件夹内了,如下图所示:

使用Nodejs爬取图片音频视频与Python相比平分秋色

因为是爬虫嘛,运行速度太快,容易把对方的服务器搞崩溃,活着封锁你的ip,这样就不好了,所以你可以在运行的函数中,加入一个随机运行时间函数,也就是setInterval,设置每3秒下载一张,这样就有点像真人的样子了,或者加入代理ip,总之目的是避免爬虫来访就可以了。

除了爬取图片外,还能爬取音频,视频等,音频示例:

var request = require('request');
var fs = require('fs');

var download = function(uri, filename, callback) {
    request.head(uri, function(err, res, body) {
        request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
    });
};

download('http://m8.music.126.net/20210920215824/cd7b5ba14f8e10f3ff531372dab2f440/ymusic/ts/free/4abc611aa86e8ac698d49a7f15991eef.mp3', 'abc.mp3', function() {
    console.log('done');
});

视频示例:

var request = require('request');
var fs = require('fs');

var download = function(uri, filename, callback) {
    request.head(uri, function(err, res, body) {
        request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
    });
};

download('https://vod6.wenshibaowenbei.com/20210902/AJxcOg5e/index.m3u8', 'abc.m3u8', function() {
    console.log('done');
});
分享至:
  • 我的微信
  • 微信扫一扫加好友
  • weinxin
  • 我的微信公众号
  • 扫描关注公众号
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: