Node.js Request+Cheerio实现一个小爬虫-基础功能实现1:内容抓取
Node.js Request+Cheerio实现一个小爬虫-基础功能实现2:文件写入
Node.js Request+Cheerio实现一个小爬虫-基础功能实现3:流程控制及并发控制
Node.js Request+Cheerio实现一个小爬虫-番外篇:代理设置
前段时间,正好有一个做爬虫的小任务。因为一直都是用js再加之Node.js的崛起,就打算使用Node来完成这个任务。自然,在实现的过程中也遇到了许多问题。所以就打算写出来当作是回顾和整理。
既然是爬虫,那么自然要和http的request, get, post 这一些方法相关了。至于这些知识,可以请教谷鸽或者度娘。除了http相关的知识,对于抓取到的内容,我们就需要进行提取,提取可以使用万能的正则表达式当然也可以使用node丰富的包了。下面就是这一次小项目中用到的node的包了。
利用到的包
Request
Request 模块是一个用起来十分方便的 http 模块。具体的用法可以参照官方的GitHub主页。
官方主页Cheerio
Cheerio 是一个可以使用 jQuery语法来对获取内容进行提取的一个模块。尤其是对于从网页上抓取的的东西。因为采用和jQuery一样的语法,所以特别适合前端来使用。
官方主页
介绍了包和模块之后,那么就可以动手试一试了。那么下面就上代码吧!
const request = require('request');
const cheerio = require('cheerio');
var shopLists = [];
var option = {
url: url,
// 不加入headers的话很可能会被拒绝访问
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.6',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Mobile Safari/537.36',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive'
}
};
request(option, function(error, response, body) {
if (!error && response.statusCode == 200) {
// 使用Cheerio对抓取到的内容进行解析
var $ = cheerio.load(body, {
ignoreWhitespace: true,
xmlMode: true
});
var shopInfo = {
pageNo: option.url.match(/g\d+p(\d+)/)[1],
pageURL: option.url,
info: []
};
var shopList = $('div#shop-all-list').find('a[data-hippo-type = "shop"]');
shopList.each(function(no, shop) {
let info = {};
info.no = no + 1;
info.name = $(shop).attr('title');
info.url = $(shop).attr('href');
shopInfo.info.push(info);
});
shopLists.push(shopInfo);
}
});
这样以来就可以抓取到想要的网站内容了。当然,问题自然是解决一个又来一个的。既然抓到了内容,就总想要保存到一个地方去。就以保存到本地为例,于是我们可以利用到Node自带的fs模块来进行文件的读取。fs模块的使用方法,就还请参照官方文档或者向谷鸽度娘请教啦。
const fs = require('fs');
...
// 刚才的爬虫代码
...
fs.writeFile(FILE_PATH + FILE_NAME, shopLists, 'utf-8', function(err) {
if (err) {
console.error("文件生成时发生错误.");
throw err;
}
console.info('文件已经成功生成.');
});
好了,看似是解决了一个问题。那么到底行不行还是需要经过实践的。跑一下,问题果然出现了。文件是0件,那么是怎么回事呢?就在下一篇文章中解决吧。