Nodejs爬虫--抓取豆瓣电影网页数据(上)

之前写了一个nodejs的开源爬虫小项目,补上博客详细解析下代码。

PS:共有上下两篇,第一篇讲从网站上抓取数据,第二篇讲将抓取的数据存入mongodb数据库。

我们快速开始吧

首先,安装nodejs,然后用npm工具初始化资源管理配置文件:package.json

新建spider文件夹,在该文件夹下面初始化package.json

1
npm init

然后用npm安装相关库文件:

1
npm install --save-dev superagent cheerio eventproxy async

在文件夹下面新建spider.js, 在文件中引入需要用到的nodejs模块如下(具体用法请查询网上相关资料):

1
2
3
4
5
let superagent = require('superagent'), //nodejs里面一个非常方便的客户端代理请求模块,支持get,post,put,delete等
cheerio = require('cheerio'), //类似于jQuery的DOM操作模块,可以提取html中想要的信息
eventproxy = require('eventproxy'), //控制异步请求并发,可以监听请求,使得某些请求完毕之后在发送请求
assert = require('assert'), //异常抛出判断模块,assert.equal(err, null); 如果err不为null,则直接抛出异常
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); //监听相关实例,完成之后告诉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); //用cheerio获取整个页面DOM对象
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) => { //用async 的 mapLimit(arr, limit, iterator, callback) 接口控制请求并发量为3
_http(url, callback);
}, (err, res) => {
assert.equal(err, null);
})
});

本章节结束,未完待续…下期是怎么将抓取的数据存入mongodb数据库!

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2018 前端博客 All Rights Reserved.

chenghao 保留所有权利