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) Immediatelyif (resp.status === 200) {// Data processing startlet result = resp.data + 1;// Data processing endreturn result;} else {throw 'retry';}}
});// 开始爬取
spider.getData('getGoogleSearchResult', params).then(userInfo => {console.log(userInfo);
});
配置
框架由三部分组成,fetcher、strategy、processer。
Fetcher
spider.setFetcher({axiosTimeout: 5000,proxyTimeout: 180 * 1000proxy() {// 支持返回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
MIT
NodeJs爬虫框架-Spider相关推荐
- nodejs和python爬虫 哪个好_简单好用的nodejs 爬虫框架分享
这个就是一篇介绍爬虫框架的文章,开头就不说什么剧情了.什么最近一个项目了,什么分享新知了,剧情是挺好,但介绍的很初级,根本就没有办法应用,不支持队列的爬虫,都是耍流氓. 所以我就先来举一个例子,看一下 ...
- nodeJS爬虫框架puppeteer初识
昨天我刷b站时无意看到了人工智能方面的应用展示视频,感觉十分的优美如果可以应用在游戏开发会有哪些成果呢?正好我也是游戏研发者 这是一个计算机图形处理的技术名字叫GAN算法技术,但是我对人工智能没有一点 ...
- nodejs和python爬虫 哪个好_nodejs有哪些爬虫框架?
nodejs有哪些爬虫框架?下面本篇文章给大家介绍几款nodejs爬虫框架.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. node-spider 基于nodejs的通用爬虫框架,得 ...
- python好用-Python有哪些常见的、好用的爬虫框架?
在这里推荐几个值得关注的异步爬虫库,给你的爬虫提速.看看有没有你没听过的? 类似 Requests 的库为什么要推荐类似 Requests 的库呢?Requests 不够好吗? 虽然 Requests ...
- Python爬虫5.3 — scrapy框架spider[Request和Response]模块的使用
Python爬虫5.3 - scrapy框架spider[Request和Response]模块的使用 综述 Request对象 scrapy.Request()函数讲解: Response对象 发送 ...
- nodejs爬虫puppeteer框架设计思想与应用
先说明一下技术栈的应用,使用typescript进行编写基于nodeJS环境的爬虫,也就是说puppeteer建立在nodeJS中,而开发者进行编写typescript代码,这样比较优美一点也有良好的 ...
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
[DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师 ...
- Python 爬虫框架 - PySpider
Python爬虫进阶四之PySpider的用法:http://cuiqingcai.com/2652.html 网络爬虫剖析,以Pyspider为例:http://python.jobbole.com ...
- python创建scrapy_Python爬虫教程-31-创建 Scrapy 爬虫框架项目
首先说一下,本篇是在 Anaconda 环境下,所以如果没有安装 Anaconda 请先到官网下载安装 Scrapy 爬虫框架项目的创建0.打开[cmd] 1.进入你要使用的 Anaconda 环境1 ...
最新文章
- 如何在您HTML中嵌入视频和音频
- Linux运维笔记-文档总结-NFS文件共享(网络文件系统)
- sql sum条件求和_SQL进阶7外连接(outer join)
- 【LeetCode】LeetCode之跳跃游戏——动态规划+贪心算法
- css2.1中 firefox 与IE 对margin-top的不同解释
- SDRAM控制器设计
- 计算机不定时黑屏,联想一体机电脑不定时黑屏是怎么回事?
- 电脑安装python3.74_在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
- #C++初学记录(素数判断)
- Struts2第一天课堂笔记
- 关于vb.net初学者,倒计时器的开发
- mix2线刷开发板救砖_小米MIX 2S手机开不了机_线刷救砖教程_安卓刷机工具_一键刷机...
- 怎么用几何画板画底数a在变化的指数函数图像
- Google账号找回通用方法(尤其是知道账号密码仍无法登录和找回的)
- java 抓图程序的实现
- devops学习(十一) 构建主分支--触发器--钉钉通知
- 股票入门浅学20210721
- Springboot过滤器中注入Bean
- Systemverilog中static、automatic区别
- 地址栏中输入网址后发生了什么?
热门文章
- 自寅舍得分享:腾讯自媒体之QQ认证空间重新开放申请 ?
- mvc npoi导出excel ajax,ASP.Net MVC利用NPOI导入导出Excel
- disabled和readonly 以及焦点问题
- 开源SpringBoot快速开发框架
- 【云栖大会】英国气象局联手阿里云寻找最聪明智能算法为“反重力无人飞行器”护航...
- 阿卡索获近亿元B轮融资,少儿在线英语为什么这么火?
- 块元素和行内元素及其元素转换
- Python实现京东抢秒杀!过年薅了不少羊毛!
- 6款强大免费电脑录屏软件,好用给力
- wps或word中文字环绕方式,四周型和紧密型的区别?