之前写了一个nodejs的开源爬虫小项目,补上博客详细解析下代码。
PS:
共有上下两篇,第一篇讲从网站上抓取数据,第二篇讲将抓取的数据存入mongodb数据库。
我们快速开始吧
首先,安装nodejs,然后用npm工具初始化资源管理配置文件:package.json
新建spider文件夹,在该文件夹下面初始化package.json
然后用npm安装相关库文件:
1
| npm install --save-dev superagent cheerio eventproxy async
|
在文件夹下面新建spider.js, 在文件中引入需要用到的nodejs模块如下(具体用法请查询网上相关资料):
1 2 3 4 5
| let superagent = require('superagent'), cheerio = require('cheerio'), eventproxy = require('eventproxy'), assert = require('assert'), async = require('async');
|
用superagent请求豆瓣的某个接口,并把所有的页面链接放到一个数组里面,用eventproxy控制监听该请求结束之后才开始请求相应的详情页面。
1 2 3 4 5 6 7 8
| superagent.get(URL) .end((err, res) => { let _pageUrls = []; res.body.forEach((val) => { _pageUrls.push(val.url); }); ep.emit('pageUrls', _pageUrls); })
|
监听事件完成之后,执行请求相应的豆瓣电影详情页面.并用async控制请求的并发量,可以降低请求的频率和速度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| let ep = eventproxy.create('pageUrls', (pageUrls) => { let _http = (url, callback) => { let _delay = parseInt((Math.random() * 30000000) % 1000, 10); superagent.get(url) .end((err, res) => { var $ = cheerio.load(res.text); var _data = {title:'', type: '', directories: '', scriptwriter: '', actors: ''}; _data.title = $('#content h1 span').text(); _data.directories = $('#info .attrs').eq(0).text(); _data.scriptwriter = $('#info .attrs').eq(1).text(); _data.actors = $('#info .attrs').eq(2).text(); $('span[property="v:genre"]').each(function (index) { _data.type += ($(this).text() + (index == $('span[property="v:genre"]').length - 1 ? '' : '、')); }); console.log(_data); }); setTimeout(() => { callback(null, url); }, _delay); }; async.mapLimit(pageUrls, 3, (url, callback) => { _http(url, callback); }, (err, res) => { assert.equal(err, null); }) });
|
本章节结束,未完待续…下期是怎么将抓取的数据存入mongodb数据库!