还在测试阶段哦,大家多提issues哦
npm install node-sr-crawler
var SrCrawler = require('node-sr-crawler');
var Store = SrCrawler.Store; //仓库类
var Request = SrCrawler.Request; //请求类
var s1 = new Store(config);
var requset = new Request(requsetConfig);
var p = s1.queue(requset); //返回请求的promise实例
s1.startRequest(); //仓库开始发出请求
发出请求
s1.on('request',function(request){
//store 实例
})
仓库中的请求全部处于完成状态
s1.on('complete',function(store){
//store 实例
})
这里有两个概念需要你了解一下,1.请求实例 2.请求调度仓库
生成一个请求实例
var req = new Request(config);
发送这个请求
var p = req.request(); //返回请求的Promise对象
p.then(function(htmlText){}); //then中返回网页文本
p.catch(function(error){}); //catch中返回错误
配置对象(标准模式)
{
url: 'http://www.xxx.com/',
retry: 0, //默认0,重试次数(次)
retryTimeout: 0, //默认0,判定请求超时的依据(ms)
pageMode: false, //开启分页爬取模式,默认false
charSet: 'UTF-8', //请求压面的字符编码,默认utf-8
}
生成一个仓库
var store = new Store(config);
请求入库
var p = store.queue(req); //返回入库请求的Promise对象
配置对象(标准模式)
{
name: 'store1', //请求仓库的名字,可以通过config.name调用
sendRate: 2000, //请求的发送间隔(ms),默认2000
retry: 0, //仓库中请求的重试次数,默认0
retryTimeout: 0, //仓库中请求的超时判定依据(ms),默认0
pageMode: false //是否开启分页模式,默认false
}
在一些需求场景下你可能需要多个仓库的请求串行运行 比如分页爬取一个网站的多个类别,此时若依然采用仓库并行机制很有可能被封锁IP
var result = Store.combine([store1,store2,store3]); //返回Promise对象
使用Store.combine后会自动从store1开始运行,直到store3达到complete状态
一个分页模式的应用必须是双向的,也就是说,仓库和请求必须同时开启该请求才会开启分页模式,如想使用分页模式仓库必须开启pageMode,仓库中的请求可以选择性地开启
仓库 分页模式所需配置项
{
pageMode: true,
url: 'http://www.xxx.com/page=1', //分页爬取第1页的地址,地址中的页码必须是单数
pagePattern: /page=1/g, //能匹配上述(page=1)的正则表达式
}
请求 分页模式所需配置项
开启分页爬取模式后会忽略单独请求配置对象中的url字段,请求地址是结合调度仓库配置对象url字段和请求配置对象中pageIndex
{
pageMode: true,
pageIndex: 1, //请求页码,会替换上面pagePattern中数字部分
}
自身重试
在请求配置项中指定
retryMode:0
根据请求配置项中的retry,retryTimeout,自动重新发送请求,与仓库队列无关。
{
retryMode: 0, //0为自身重试,1为仓库重试,默认为0
retry:0,//0为默认值,即重试次数
retryTimeout:3000,//默认3s,超时时间
}
仓库重试
在请求配置项中指定
retryMode:1
忽略retryTimeout配置项,会将请求放在仓库琴秋队列的队尾。
retryMode: 1