NodeJs爬蟲框架Spider基礎(chǔ)使用教程
gz-spider
一個基于Puppeteer和Axios的NodeJs爬蟲框架 源碼倉庫
為什么需要爬蟲框架
爬蟲框架可以簡化開發(fā)流程,提供統(tǒng)一規(guī)范,提升效率。一套優(yōu)秀的爬蟲框架會利用多線程,多進(jìn)程,分布式,IP池等能力,幫助開發(fā)者快速開發(fā)出易于維護(hù)的工業(yè)級爬蟲,長期受用。
特性
- 可配置代理
- 支持任務(wù)重試
- 支持Puppeteer
- 異步隊列服務(wù)友好
- 多進(jìn)程友好
安裝
npm i gz-spider --save
使用
const spider = require('gz-spider');
// 每個爬蟲是一個方法,需要通過setProcesser注冊
spider.setProcesser({
['getGoogleSearchResult']: async (fetcher, params) => {
// fetcher.page是原始的puppeteer page,可以直接用于打開頁面
let resp = await fetcher.axios.get(`https://www.google.com/search?q=${params}`);
// throw 'Retry', will retry this processer
// throw 'ChangeProxy', will retry this processer use new proxy
// throw 'Fail', will finish this processer with message(fail) Immediately
if (resp.status === 200) {
// Data processing start
let result = resp.data + 1;
// Data processing end
return result;
} else {
throw 'retry';
}
}
});
// 開始爬取
spider.getData('getGoogleSearchResult', params).then(userInfo => {
console.log(userInfo);
});配置
框架由三部分組成,fetcher、strategy、processer。
Fetcher
spider.setFetcher({
axiosTimeout: 5000,
proxyTimeout: 180 * 1000
proxy() {
// 支持返回Promise,可以從遠(yuǎn)端拉取代理的配置
return {
host: '127.0.0.1',
port: '9000'
}
}
});axiosTimeout: [Number] 每次爬蟲請求的超時時間proxyTimeout: [Number] 更新代理IP時間,代理IP有超時的場景使用,會重新執(zhí)行proxy function,使用新的代理IPproxy: [Object | Function] 當(dāng)proxy是[Function], 支持異步,可以從遠(yuǎn)端拉取代理的配置proxy.host[String]proxy.port[String]
Strategy
spider.setStrategy({
retryTimes: 2
});retryTimes: [Number] 最大重試次數(shù)
與任務(wù)隊列結(jié)合使用
流程獲取任務(wù) -> `spider.getData(processerKey, processerIn)` -> 完成任務(wù)并帶上處理好的數(shù)據(jù)
用MySql模擬任務(wù)隊列
- 創(chuàng)建
spider-task表, 至少包含'id', 'status', 'processer_key', 'processer_input', 'processer_output' - 寫一個拉取未完成任務(wù)的接口, 例如
GET /spider/task - 寫一個完成任務(wù)的接口, 例如
PUT /spider/task
const axios = require('axios');
while (true) {
// 獲取任務(wù)
let resp = await axios.get('http://127.0.0.1:8080/spider/task');
if (!resp.data.task) break;
let { id, processerKey, processerInput } = resp.data.task;
let processerOutput = await spider.getData(processerKey, processerInput);
// 完成任務(wù)并帶上處理好的數(shù)據(jù)
await axios.put('http://127.0.0.1:8080/spider/task', {
id, processerOutput,
status: 'success'
});
}對爬蟲的一些理解
爬蟲的運(yùn)行方式就決定了它無法做到長久穩(wěn)定和實時。在設(shè)計爬蟲框架的時候,圍繞的點(diǎn)是異步任務(wù)隊列。工程上爬蟲框架會提供一個高效的數(shù)據(jù)處理流水線,并可適配多種任務(wù)隊列。
gz-spider分為三個組成部分,fetcher,strategy和processer。
- fetcher抓取器,其中包含常用的http和puppeteer,并且可以掛各種類型的代理。
- strategy策略中心,負(fù)責(zé)配置爬取失敗后的各種策略。
- processer負(fù)責(zé)從原始數(shù)據(jù)結(jié)構(gòu)處理為目標(biāo)數(shù)據(jù)的過程,也是爬蟲框架用戶要寫的部分
License
以上就是NodeJs爬蟲框架Spider基礎(chǔ)使用教程的詳細(xì)內(nèi)容,更多關(guān)于NodeJs爬蟲框架Spider的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
nodejs微信開發(fā)之自動回復(fù)的實現(xiàn)
這篇文章主要介紹了nodejs微信開發(fā)之自動回復(fù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Node.js中npm 和 peerDependencies的使用
本文詳細(xì)介紹了npm中的peerDependencies和--legacy-peer-deps使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
如何設(shè)置process.env.NODE_ENV生產(chǎn)環(huán)境模式
process.env.NODE_ENV默認(rèn)只有兩種狀態(tài)即development和production,本文主要介紹了process.env.NODE_ENV設(shè)置生產(chǎn)環(huán)境模式,感興趣的可以了解一下2021-09-09
nodejs dgram模塊廣播+組播的實現(xiàn)示例
這篇文章主要介紹了nodejs dgram模塊廣播+組播的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Sequelize中用group by進(jìn)行分組聚合查詢
大家都知道在SQL查詢中,分組查詢是較常用的一種查詢方式。分組查詢是指通過GROUP BY關(guān)鍵字,將查詢結(jié)果按照一個或多個字段進(jìn)行分組,分組時字段值相同的會被分為一組。在Node.js基于Sequelize的ORM框架中,同樣支持分組查詢,使用非常簡單方便。下面來看看詳細(xì)的介紹。2016-12-12
nodejs執(zhí)行javaScript原理超詳細(xì)講解
Node.js是目前非常流行的JavaScript運(yùn)行環(huán)境,其背后有著強(qiáng)大的libuv庫支撐其非阻塞I/O操作,這篇文章主要介紹了nodejs執(zhí)行javaScript原理的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-11-11
Node.js web 應(yīng)用如何封裝到Docker容器中
這篇文章主要介紹了Node.js web 應(yīng)用如何封裝到Docker容器中,幫助大家更好的學(xué)習(xí)node.js和使用docker容器,感興趣的朋友可以了解下2020-09-09

