简单好用的nodejs 爬虫框架分享


Posted in NodeJs onMarch 26, 2017

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

第一步:安装 Crawl-pet

nodejs 就不用多介绍吧,用 npm 安装 crawl-pet

$ npm install crawl-pet -g --production

运行,程序会引导你完成配置,首次运行,会在项目目录下生成 info.json 文件

$ crawl-pet

> Set project dir: ./test-crawl-pet
> Create crawl-pet in ./test-crawl-pet [y/n]: y
> Set target url: http://foodshot.co/
> Set save rule [url/simple/group]: url
> Set file type limit: 
> The limit: not limit
> Set parser rule module:
> The module: use default crawl-pet.parser

这里使用的测试网站 http://foodshot.co/ 是一个自由版权的,分享美食图片的网站,网站里的图片质量非常棒,这里用它只是为测试学习用,大家可以换其它网站测试

如果使用默认解析器的话,已经可以运行,看看效果:

$ crawl-pet -o ./test-crawl-pet

简单好用的nodejs 爬虫框架分享

试试看

这是下载后的目录结构

简单好用的nodejs 爬虫框架分享

本地目录结构

 第二步:写自己的解析器

现在我们来看一看如何写自己的解析器,有三种方法来生成我们自己的解析器

在新建项目时, 在 Set parser rule module 输入自己的解释器路径。修改 info.json 下的 parser 项这个最简单,直接在项目录下新建一个 parser.js 文件

使用 crawl-pet, 新建一个解析器模板

$ crawl-pet --create-parser ./test-crawl-pet/parser.js

打开 ./test-crawl-pet/parser.js 文件

// crawl-pet 支持使用 cheerio,来进行页面分析,如果你有这个需要
const cheerio = require("cheerio")

/*
 * header 函数是在请求发送前调用,可以配置请求的头信息,如果返回 false,则中断请求
 *
 * 参数:
 *  options:   详细设置请看 https://github.com/request/request
 *  crawler_handle: 与队列通信的对象,详情见下
 *
 * header 函数是可选的,可不写
 */
exports.header = function(options, crawler_handle) {  
}

/*
 * body 函数是在请求返回后调用,用来解析返回结果
 *
 * 参数:
 *  url:   请求的 url
 *  body:   请求返回结果, string 类型
 *  response:  请求的响应,详情请看: https://github.com/request/request
 *  crawler_handle: 与队列通信的对象,该对象包含以下方法
 *   .info    : crawl-pet 的配置信息
 *   .uri     : 当前请求的 uri 信息
 *   .addPage(url)  : 向队列里添加一个待解析页面
 *   .addDown(url)  : 向队列里添加一个待下载文件
 *   .save(content, ext) : 保存文本到本地,ext 设置保存文件的后缀名
 *   .over()    : 结束当前队列,取出下一条队列数据
 */

exports.body = function(url, body, response, crawler_handle) {
 const re = /\b(href|src)\s*=\s*["']([^'"#]+)/ig
 var m = null
 while (m = re.exec(body)){
  let href = m[2]
  if (/\.(png|gif|jpg|jpeg|mp4)\b/i.test(href)) {
    // 这理添加了一条下载
   crawler_handle.addDown(href)
  }else if(!/\.(css|js|json|xml|svg)/.test(href)){
    // 这理添加了一个待解析页面
   crawler_handle.addPage(href)
  }
 }
  // 记得在解析结束后一定要执行
 crawler_handle.over()
}

在最后会有一个分享,懂得的请往下看

第三步:查看爬取下来的数据

根据以下载到本地的文件,查找下载地址

$ crawl-pet -f ./test-crawl-pet/photos.foodshot.co/*.jpg

简单好用的nodejs 爬虫框架分享
查找下载地址

查看等待队列

$ crawl-pet -l queue

简单好用的nodejs 爬虫框架分享
查看等待队列

查看已下载的文件列表

$ crawl-pet -l down # 查看已下载列表中第 0 条后的5条数据 $ crawl-pet -l down,0,5 # --json 参数表示输出格式为 json $ crawl-pet -l down,0,5 --json

简单好用的nodejs 爬虫框架分享
已下载的文件

查看已解析页面列表,参数与查看已下载的相同

$ crawl-pet -l page

基本功能就这些了,看一下它的帮助吧

该爬虫框架是开源的,GIthub 地址在这里:https://github.com/wl879/Crawl-pet

$ crawl-pet --help

 Crawl-pet options help:

 -u, --url  string    Destination address
 -o, --outdir string    Save the directory, Default use pwd
 -r, --restart      Reload all page
 --clear        Clear queue
 --save   string    Save file rules following options
          = url: Save the path consistent with url
          = simple: Save file in the project path
          = group: Save 500 files in one folder
 --types   array    Limit download file type
 --limit   number=5   Concurrency limit
 --sleep   number=200   Concurrent interval
 --timeout  number=180000  Queue timeout
 --proxy   string    Set up proxy
 --parser  string    Set crawl rule, it's a js file path!
          The default load the parser.js file in the project path
 --maxsize  number    Limit the maximum size of the download file
 --minwidth  number    Limit the minimum width of the download file
 --minheight  number    Limit the minimum height of the download file
 -i, --info       View the configuration file
 -l, --list  array    View the queue data 
          e.g. [page/down/queue],0,-1
 -f, --find  array    Find the download URL of the local file
 --json        Print result to json format
 -v, --version      View version
 -h, --help       View help

最后分享一个配置

$ crawl-pet -u https://www.reddit.com/r/funny/ -o reddit --save group

info.json

{
 "url": "https://www.reddit.com/r/funny/",
 "outdir": ".",
 "save": "group",
 "types": "",
 "limit": "5",
 "parser": "my_parser.js",
 "sleep": "200",
 "timeout": "180000",
 "proxy": "",
 "maxsize": 0,
 "minwidth": 0,
 "minheight": 0,


 "cookie": "over18=1"
}

my_parser.js

exports.body = function(url, body, response, crawler_handle) {
 const re = /\b(data-url|href|src)\s*=\s*["']([^'"#]+)/ig
 var m = null
 while (m = re.exec(body)){
  let href = m[2]
  if (/thumb|user|icon|\.(css|json|js|xml|svg)\b/i.test(href)) {
   continue
  }
  if (/\.(png|gif|jpg|jpeg|mp4)\b/i.test(href)) {
   crawler_handle.addDown(href)
   continue
  }
  if(/reddit\.com\/r\//i.test(href)){
   crawler_handle.addPage(href)
  }
 }
 crawler_handle.over()
}

如果你是了解 reddit 的,那就这样了。

GIthub 地址在这里:https://github.com/wl879/Crawl-pet

本站下载地址:点击下载

NodeJs 相关文章推荐
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
Nov 18 NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
NodeJs form-data格式传输文件的方法
Dec 13 NodeJs
NodeJs 文件系统操作模块fs使用方法详解
Nov 26 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 NodeJs
Nodejs + Websocket 指定发送及群聊的实现
Jan 09 NodeJs
如何利用nodejs自动定时发送邮件提醒(超实用)
Dec 01 NodeJs
nodejs开发——express路由与中间件
Mar 24 #NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 #NodeJs
NodeJS学习笔记之Module的简介
Mar 24 #NodeJs
详解nodejs中的process进程
Mar 19 #NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 #NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 #NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 #NodeJs
You might like
PHP字符转义相关函数小结(php下的转义字符串)
2007/04/12 PHP
php生成图形验证码几种方法小结
2013/08/15 PHP
PHP中的Streams详细介绍
2014/11/12 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
Python Tkinter GUI编程入门介绍
2015/03/10 Python
浅谈MySQL中的触发器
2015/05/05 Python
python最长回文串算法
2018/06/04 Python
Python获取时间范围内日期列表和周列表的函数
2019/08/05 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
2019/11/07 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
python 将列表里的字典元素合并为一个字典实例
2020/09/01 Python
python Pexpect模块的使用
2020/12/25 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
2014年十一国庆节活动方案
2014/09/16 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书