简单好用的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(三)--- Node.js模块
May 25 NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
Jan 01 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
Jan 12 NodeJs
Nodejs中Express 常用中间件 body-parser 实现解析
May 22 NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 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
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
Python中的引用和拷贝浅析
2014/11/22 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
香港个人化生活购物网站:Ballyhoo Limited
2016/09/10 全球购物
科室工作个人总结的自我评价
2013/10/29 职场文书
实习指导老师评语
2014/04/26 职场文书
党员“四风”方面存在问题及整改措施
2014/09/24 职场文书
2014年应急工作总结
2014/12/11 职场文书
作弊检讨书
2015/01/27 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript