NodeJs爬虫框架-Spider
gz-spider
一个基于Puppeteer和Axios的NodeJs爬虫框架 源码仓库
为什么需要爬虫框架
爬虫框架可以简化开发流程,提供统一规范,提升效率。一套优秀的爬虫框架会利用多线程,多进程,分布式,IP池等能力,帮助开发者快速开发出易于维护的工业级爬虫,长期受用。
特性
- 可配置代理
- 支持任务重试
- 支持Puppeteer
- 异步队列服务友好
- 多进程友好
安装
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,可以从远端拉取代理的配置
return {
host: '127.0.0.1',
port: '9000'
}
}
});
axiosTimeout
: [Number] 每次爬虫请求的超时时间proxyTimeout
: [Number] 更新代理IP时间,代理IP有超时的场景使用,会重新执行proxy function,使用新的代理IPproxy
: [Object | Function] 当proxy
是[Function], 支持异步,可以从远端拉取代理的配置proxy.host
[String]proxy.port
[String]
Strategy
spider.setStrategy({
retryTimes: 2
});
retryTimes
: [Number] 最大重试次数
与任务队列结合使用
流程
获取任务 -> `spider.getData(processerKey, processerIn)` -> 完成任务并带上处理好的数据
用MySql模拟任务队列
- 创建
spider-task
表, 至少包含'id', 'status', 'processer_key', 'processer_input', 'processer_output'
- 写一个拉取未完成任务的接口, 例如
GET /spider/task
- 写一个完成任务的接口, 例如
PUT /spider/task
const axios = require('axios');
while (true) {
// 获取任务
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);
// 完成任务并带上处理好的数据
await axios.put('http://127.0.0.1:8080/spider/task', {
id, processerOutput,
status: 'success'
});
}
对爬虫的一些理解
爬虫的运行方式就决定了它无法做到长久稳定和实时。在设计爬虫框架的时候,围绕的点是异步任务队列。工程上爬虫框架会提供一个高效的数据处理流水线,并可适配多种任务队列。
gz-spider分为三个组成部分,fetcher,strategy和processer。
fetcher抓取器,其中包含常用的http和puppeteer,并且可以挂各种类型的代理。
strategy策略中心,负责配置爬取失败后的各种策略。
processer负责从原始数据结构处理为目标数据的过程,也是爬虫框架用户要写的部分
License
前端随想
hi,我是geoffzhu,前端开发者,专栏主要用于记录一些前端技术学习笔记。也会有一些自己的翻译的技术博客。
推荐阅读
「多图预警」完美实现一个@功能
一天产品大大向 boss 汇报完研发成果和产品业绩产出,若有所思的走出来,劲直向我走过来,嘴角微微上扬。产品大大:boss 对我们的研发成果挺满意的,balabala...(内心 OS:不听,讲重点)产品大大:咱们的客服 I...
wuwhs赞 40阅读 4.8k评论 5
ESlint + Stylelint + VSCode自动格式化代码(2023)
安装插件 ESLint,然后 File -> Preference-> Settings(如果装了中文插件包应该是 文件 -> 选项 -> 设置),搜索 eslint,点击 Edit in setting.json
谭光志赞 34阅读 20.8k评论 9
安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...
边城赞 32阅读 7.3k评论 5
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...
chokcoco赞 24阅读 2.3k评论 3
在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...
边城赞 17阅读 2k
过滤/筛选树节点
又是树,是我跟树杠上了吗?—— 不,是树的问题太多了!🔗 相关文章推荐:使用递归遍历并转换树形数据(以 TypeScript 为例)从列表生成树 (JavaScript/TypeScript) 过滤和筛选是一个意思,都是 filter。对于列表来...
边城赞 18阅读 7.9k评论 3
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...
原谅我一生不羁放歌搞文艺赞 14阅读 20.1k评论 9
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。