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,使用新的代理IP
  • proxy: [Object | Function] 当 proxy是[Function], 支持异步,可以从远端拉取代理的配置
    • proxy.host [String]
    • proxy.port [String]

Strategy

spider.setStrategy({retryTimes: 2
});
  • retryTimes: [Number] 最大重试次数

与任务队列结合使用

流程

获取任务 -> `spider.getData(processerKey, processerIn)` -> 完成任务并带上处理好的数据

用MySql模拟任务队列

  1. 创建spider-task表, 至少包含'id', 'status', 'processer_key', 'processer_input', 'processer_output'
  2. 写一个拉取未完成任务的接口, 例如 GET /spider/task
  3. 写一个完成任务的接口, 例如 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相关推荐

  1. nodejs和python爬虫 哪个好_简单好用的nodejs 爬虫框架分享

    这个就是一篇介绍爬虫框架的文章,开头就不说什么剧情了.什么最近一个项目了,什么分享新知了,剧情是挺好,但介绍的很初级,根本就没有办法应用,不支持队列的爬虫,都是耍流氓. 所以我就先来举一个例子,看一下 ...

  2. nodeJS爬虫框架puppeteer初识

    昨天我刷b站时无意看到了人工智能方面的应用展示视频,感觉十分的优美如果可以应用在游戏开发会有哪些成果呢?正好我也是游戏研发者 这是一个计算机图形处理的技术名字叫GAN算法技术,但是我对人工智能没有一点 ...

  3. nodejs和python爬虫 哪个好_nodejs有哪些爬虫框架?

    nodejs有哪些爬虫框架?下面本篇文章给大家介绍几款nodejs爬虫框架.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. node-spider 基于nodejs的通用爬虫框架,得 ...

  4. python好用-Python有哪些常见的、好用的爬虫框架?

    在这里推荐几个值得关注的异步爬虫库,给你的爬虫提速.看看有没有你没听过的? 类似 Requests 的库为什么要推荐类似 Requests 的库呢?Requests 不够好吗? 虽然 Requests ...

  5. Python爬虫5.3 — scrapy框架spider[Request和Response]模块的使用

    Python爬虫5.3 - scrapy框架spider[Request和Response]模块的使用 综述 Request对象 scrapy.Request()函数讲解: Response对象 发送 ...

  6. nodejs爬虫puppeteer框架设计思想与应用

    先说明一下技术栈的应用,使用typescript进行编写基于nodeJS环境的爬虫,也就是说puppeteer建立在nodeJS中,而开发者进行编写typescript代码,这样比较优美一点也有良好的 ...

  7. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师 ...

  8. Python 爬虫框架 - PySpider

    Python爬虫进阶四之PySpider的用法:http://cuiqingcai.com/2652.html 网络爬虫剖析,以Pyspider为例:http://python.jobbole.com ...

  9. python创建scrapy_Python爬虫教程-31-创建 Scrapy 爬虫框架项目

    首先说一下,本篇是在 Anaconda 环境下,所以如果没有安装 Anaconda 请先到官网下载安装 Scrapy 爬虫框架项目的创建0.打开[cmd] 1.进入你要使用的 Anaconda 环境1 ...

最新文章

  1. 如何在您HTML中嵌入视频和音频
  2. Linux运维笔记-文档总结-NFS文件共享(网络文件系统)
  3. sql sum条件求和_SQL进阶7外连接(outer join)
  4. 【LeetCode】LeetCode之跳跃游戏——动态规划+贪心算法
  5. css2.1中 firefox 与IE 对margin-top的不同解释
  6. SDRAM控制器设计
  7. 计算机不定时黑屏,联想一体机电脑不定时黑屏是怎么回事?
  8. 电脑安装python3.74_在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
  9. #C++初学记录(素数判断)
  10. Struts2第一天课堂笔记
  11. 关于vb.net初学者,倒计时器的开发
  12. mix2线刷开发板救砖_小米MIX 2S手机开不了机_线刷救砖教程_安卓刷机工具_一键刷机...
  13. 怎么用几何画板画底数a在变化的指数函数图像
  14. Google账号找回通用方法(尤其是知道账号密码仍无法登录和找回的)
  15. java 抓图程序的实现
  16. devops学习(十一) 构建主分支--触发器--钉钉通知
  17. 股票入门浅学20210721
  18. Springboot过滤器中注入Bean
  19. Systemverilog中static、automatic区别
  20. 地址栏中输入网址后发生了什么?

热门文章

  1. 自寅舍得分享:腾讯自媒体之QQ认证空间重新开放申请 ?
  2. mvc npoi导出excel ajax,ASP.Net MVC利用NPOI导入导出Excel
  3. disabled和readonly 以及焦点问题
  4. 开源SpringBoot快速开发框架
  5. 【云栖大会】英国气象局联手阿里云寻找最聪明智能算法为“反重力无人飞行器”护航...
  6. 阿卡索获近亿元B轮融资,少儿在线英语为什么这么火?
  7. 块元素和行内元素及其元素转换
  8. Python实现京东抢秒杀!过年薅了不少羊毛!
  9. 6款强大免费电脑录屏软件,好用给力
  10. wps或word中文字环绕方式,四周型和紧密型的区别?