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

第一步:安装 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

试试看

这是下载后的目录结构

本地目录结构

第二步:写自己的解析器

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

在新建项目时, 在 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

查找下载地址

查看等待队列

$ crawl-pet -l queue

查看等待队列

查看已下载的文件列表

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

已下载的文件

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

$ crawl-pet -l page

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

$ 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 的,那就这样了。

本站下载地址:点击下载

nodejs和python爬虫 哪个好_简单好用的nodejs 爬虫框架分享相关推荐

  1. python爬虫ip限制_简单爬虫,突破IP访问限制和复杂验证码,小总结

    简单爬虫,突破复杂验证码和IP访问限制 好吧,看题目就知道我是要写一个爬虫,这个爬虫的目标网站有一些反爬取意识,所以就有了本文了. 我先说说场景吧: 由于工作需要,平时有一大堆数据需要在网上查询,并归 ...

  2. python中输入字符串_简单讲解Python中的字符串与字符串的输入输出

    简单讲解Python中的字符串与字符串的输入输出 发布于 2016-03-26 14:35:42 | 110 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向 ...

  3. Mysql数据库的简单备份与还原_简单的MySQL备份与还原方法分享

    为了安全起见,需要经常对数据库作备份,或者还原.对于 MySQL 而言,最方便的方法可能就是用 phpMyAdmin 的导出.导入功能了,但如果你的数据库体积比较大,作为 Web 应用的 phpMyA ...

  4. python如何爬虫股票数据_简单爬虫:东方财富网股票数据爬取(python_017)

    需求:将东方财富网行情中心的股票数据爬取下来,包括上证指数.深圳指数.上证A股.深圳A股.新股.中小板.创业板 等 一.目标站点分析 东方财富网的行情中心页面包含了所有股票信息.在左侧的菜单栏中包含了 ...

  5. python爬取站_简单python爬虫练习 E站本爬取

    必备条件: 一台能上404的机子.. 过程: 由于也只是初学爬虫,个中技巧也不熟练,写的过程中的语法用法参考了很多文档和博客,我是对于当前搜索页用F12看过去..找到每个本子的地址再一层层下去最后下载 ...

  6. python简单的爬虫程序代码_简单的电子邮件爬虫Python代码

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import requests import re try: from urllib.pa ...

  7. python批量爬取图片_【原创开源】快手爬虫,根据id批量爬取用户的所有图集和视频...

    更新日志 所有版本更新日志会记录在这里 v0.4.0(2020-03-23) 修复id转eid的一些bug 从该版本开始,爬取视频均为无水印 v0.3.0(2020-03-10) 修复一些因为用户昵称 ...

  8. 用pycharm进行python爬虫的步骤_使用Pycharm写一个网络爬虫

    在初步了解网络爬虫之后,我们接下来就要动手运用Python来爬取网页了. 我们知道,网络爬虫应用一般分为两个步骤: 1.通过网页链接获取内容: 2.对获得的网页内容进行处理 这两个步骤需要分别使用不同 ...

  9. python建立回归模型_简单线性回归的Python建模方法

    简单线性回归,就是两个随机变量存在一定大小的相关系数的前提下,结合散点图观察,采用最小二乘OLS方法,尝试建立一条回归直线,使得误差平方和SSE最小.OLS是一种参数方法,通过确定直线的斜率b和截距a ...

最新文章

  1. 阿里云安全肖力:安全基础建设是企业数字化转型的基石
  2. 基于比特币现金的Token逐梦而来
  3. java设计模式5--原型模式(Prototype)
  4. 02_clickhouse安装,卸载,启动/关闭服务,交互式命令(数据库创建,数据导入,查询),批模式数据导入,MySQL接口操作ClickHouse,DBeaver可视化工具安装与使用(学习笔记)
  5. 18 个 Python 高效编程技巧,Mark!
  6. 多线程队列的算法优化
  7. 论文浅尝 | 基于知识图谱中图卷积神经网络的推荐系统
  8. mysql web界面 Linux_部署WEB项目到服务器(三)安装mysql5或者mysql8到linux服务器(Ubuntu)详解...
  9. adb启动app_adb命令实战十三步
  10. 为什么 Kubernetes 要替换 Docker
  11. Unity3D占用内存太大的解决方法【先转,慢慢看】
  12. 想起JDK1.4的死机事故
  13. matlab学习技巧
  14. 【从0开始音乐demo的制作:预计耗时15小时(二)】简单的页面
  15. 搜索引擎工作原理解析
  16. 计算机学院嘉年华标题,“芯动盛夏 AI创南航” 计算机学院举办第八届计算机嘉年华...
  17. 看完涨薪2K+_____2019 JAVA 必刷面试题
  18. 富文本编辑器 禁止改变文本内容
  19. 硬核开源:动漫生成器让照片秒变手绘日漫风!!!
  20. Hadoop国内镜像下载地址

热门文章

  1. php用while循环做出1到10的乘积,php 数组
  2. 各种格式SSH 公钥和私钥之间的转换
  3. 《layui宇宙版教程》:扫描二维码加2000人QQ群交流学习
  4. 天猫积分自动抽奖Javascript代码
  5. 云平台系统如何进行资源纳管
  6. Office安装出错的解决方法,如“Microsoft Office Professional Plus 2013在安装过程中出错”。
  7. 带linux系统的arm开发板配置无线网络遇到的问题
  8. spark 算子 详解
  9. java用JBarcode组件生成条形码(支持自定义字体及颜色),图文详解之2-1
  10. 云计算快感不长久,瘦终端才是王道