如果我们想:如果能够获取翻页数据,那数据不就丰富了。这里也可以解决这个问题。
本程序在上一篇文章爬虫程序写入mongodb中的程序依赖中增加eventproxy
包,请自行创建node项目并安装,推荐使用webstorm直接创建一个node.js express App。
eventproxy是管理异步操作的一个npm包,
1.引入依赖模块
1 2 3 4 5 6 7 8 9 10 11 12
| const http = require("http"); const path = require("path"); const url = require("url"); const fs = require("fs");
const eventproxy = require('eventproxy'); const mongoose = require("mongoose"); const superagent = require("superagent"); const cheerio = require("cheerio");
const ep = eventproxy();
|
2.连接数据库,建数据模型
推荐使用MongoDB可视化工具Studio 3T,安装MongoDB数据库自行参考网上资料。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var mongourl = 'mongodb://localhost/DBBook'; mongoose.connect(mongourl); var Schema = mongoose.Schema;
var topBookSchema = new Schema({ title: String, enTitle: String, bookId: Number, copyrightInfo: String, grade: String, remark: String, bookImg: String, description: String }); var TopBook = mongoose.model('topBook', topBookSchema, 'topbooklist');
|
3.初始化结果数组和url数组
1 2 3 4 5 6 7 8 9
| let resultArr = []; let desUrlList = [];
for (let i = 1; i <= 10; i++){ let pageIndex = 25*(i-1); desUrlList.push(`https://book.douban.com/top250?start=${pageIndex}`); }
|
4.遍历url数组,调用superagent的get方法和end方法处理
get(): 此方法参数为获取数据的链接
end(): 此方法第一的参数为error对象,第二个参数为get中页面的所有DOM结果
1 2 3 4 5 6 7
| for (let desUrl of desUrlList){ superagent .get(desUrl) .end((error, response)=>{ }) }
|
5.分析结构,提取相应的数据,派发异步事件
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| if(error) console.log(error);
var content = response.text;
var $ = cheerio.load(content);
$(".indent table").each(function(index,value){
var address = $(value).find(".item td a").attr("href"); var bookId = address.replace(/[^0-9]/ig,"");
var oneBook = { title: $(value).find(".item td .pl2 a").text().replace(/\ +/g,"").replace(/[\r\n]/g,""), enTitle: $(value).find(".item td .pl2 span").text(), bookId: bookId, copyrightInfo: $(value).find(".item td p.pl").text(), grade: $(value).find(".item td .star .rating_nums").text(), remark: $(value).find(".item td .star .pl").text().replace(/\ +/g,"").replace(/[\r\n]/g,""), bookImg: $(value).find(".item td .nbg img").attr("src").replace(/^https:/g,""), description: $(value).find(".item td .quote .inq").text() };
resultArr.push(oneBook); var topBook = new TopBook(oneBook);
topBook.save(function(err){ if(err){ console.log('保存失败:'+ err); return; } console.log("OK!"); });
ep.emit('allBooks',oneBook);
});
|
ep是eventproxy的实例,这里通过emit()
方法派发一个事件allBooks
,用来监测oneBook
数据,当一个oneBook
数据源抓取完毕,就会告诉ep一个数据源抓取完成。
6.在所以异步操作执行完后执行某些处理
1 2 3 4
| ep.after('allBooks',desUrlList.length,function () { });
|
完整代码请参考:https://github.com/joydezhong/SimpleCrawler/blob/master/pageEventproxy.js