开篇寄语
此前,伯衡君使用python爬取文字,图片乃至视频的文章对爬取信息有了一个大致的介绍,以及从入门到提高的科普文章,具体可以参看下方的前情提要。同时在最近的Easy Web TV这个项目中,使用代理服务解决CORS也就是跨域问题,也能实现实时爬取信息的目的,而这次,伯衡君则是介绍使用Nodejs来爬取信息,似乎更加强大,与python爬取信息时平分秋色,这篇文章以下载图片为例。
前情提要
- 《来和伯衡君一起快速入门Python爬虫——Beautifulsoup篇(一)》
- 《一起用python批量制作表情包吧,使用imgflip API》
- 《来和伯衡君一起快速入门Python爬虫——Beautifulsoup篇(三)》
- 《Easy Web TV版本到了8.0.1,汇总一下目前的功能及以后的规划》
内容详情
首先是在本机安装nodejs,支持Windows,MacOS,Linux等等,下载安装后,在调试命令窗口输入node -v,如果出现版本号,就说明安装成功啦,如下图所示。
接下来,找到任意一个支持编辑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); }); };
好了,基本上已经完成了前期的准备了,接下来是要找出要下载的图片位置,我们前往啦啦漫画,继续分析其代码组成,如下图所示:
通过分析,每一组图片的位置都可以表示为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,运行后,首页的封面就全部下载到文件夹内了,如下图所示:
因为是爬虫嘛,运行速度太快,容易把对方的服务器搞崩溃,活着封锁你的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'); });ArrayArrayArray
- 我的微信
- 微信扫一扫加好友
- 我的微信公众号
- 扫描关注公众号