精华 轻量级定向爬虫light-crawler,轻松实现页面数据的抓取与资源下载
发布于 5 年前 作者 zhang2333 7504 次浏览 来自 分享

缘由

起初打算找个爬虫框架写点自己用的爬虫,但并没有在github上找到合适的(以crawler作为关键词)。 看过stack overflow上的一个问答之后,明白了原来crawler(通用爬虫)和scraper(数据提取)其实各有分工,所以很多crawler项目都只是通用爬虫,而几乎没有我想要的定向爬虫,scraper又只专注于页面数据的提取,无奈之下决定结合两者做出一个用于提取页面数据的爬虫,也就是定向爬虫(也有垂直爬虫的叫法,与通用的爬虫的区别可前往百度)。

依赖

  • bluebird,用于任务的队列化与流程控制,可并发请求
  • cheerio,用于页面数据的提取,主要是提供了一些常用函数,如getLinks()
  • request-promise(request的bluebird版本),用于发起http/https请求
  • lodash(鲁大师)

概要说明

  • 任务(url)队列化,任务置于队列中依次执行,可设置并发数量
  • 任务队列可暂停/继续
  • 任务驱动型,任务全部执行完毕会进入超时等待(drainAwait,默认0),超时时间内爬虫收到任务(url)就会继续运作,否则停止
  • 以url的分类(正则)来制定不同页面的数据提取规则
  • 支持所有request的请求option,默认自解压gzip
  • 为任务指定downloadTask: true即可便捷地下载资源
  • 支持自定义logger,默认是控制台输出log(可控制颜色)

具体使用详见中文文档 https://github.com/zhang2333/light-crawler/blob/master/README_zh_CN.md

写了有一段时间了,功能也比较完善了,自己用着写了些非常实用的爬虫(相信我,爬虫能做很多有趣的事),比如这个 爬取一个大型的BT站(有很多广告,也不能按大小排序),自定义排序并批量提取相关资源的磁链。截图在最下面

最后,毕竟这是一个人写的,肯定有些错误和不合理的地方,欢迎大家的建议与指正。

项目地址https://github.com/zhang2333/light-crawleraaa.jpg

(截图是基于light-crawler的一个实现,顺便问一下截图的位置是如何确定的)

19 回复

@yuu2lee4 不是,用的request

request-promise 竟然有这种东西!!!!

mark,过一阵子会研究爬虫

@reverland 谢谢。request-promise很好找啊,google一下"request bluebird"就找到了,是用bluebird重构的,实现了原request的绝大多数功能,不过也有没实现的需要注意一下,比如pipe部分

@zhang2333 嗯,谢谢,1.5.10 addRule支持的object真是方便。。。

@reverland 谢谢支持,欢迎提建议~

装个新版的nodejs,自己用es6的prmoise和generator撸就可以了,那些promise相关的库都只是过渡

@dlutwuwei 用原生promise的话很多东西就要自己实现了,用bluebird主要是考虑到了它还封装了一些非常实用的方法。

大赞~~~request-promise我也在用,挺好的…

rule支持css写法吗?

@yakczh rule好像不是这个rule。。。

@SHocker-Yu 看帖子你已经解决了?light-crawler实现了从html中抽取链接的方法,代码供参考https://github.com/zhang2333/light-crawler/blob/master/lib/utils.js

@yakczh rule是用于定制处理不同页面的规则,跟CSS无关。 如果你的rule的正则是'www.baidu.com/test/[0-9]+.html',那么这条rule将处理类似于'www.baidu.com/test/123.html'或者'www.baidu.com/test/666.html'这样的页面。 当然了,如果你觉得某些url的正则不好写,那么给rule再指定些其他的task属性也可以。以下取自light-crawler文档

// 从1.5.10开始,匹配规则得到了扩展,匹配规则将不局限于匹配任务的url属性
c.addTasks('http://www.baidu.com', { name: 'baidu', type: '搜索引擎' });
c.addTasks('http://www.google.com', { name: 'google', type: '搜索引擎' });
// 你可能已经注意到了,下面的两个正则是同样的,而name值却不同
c.addRule({ reg: 'www.**.com', name: 'baidu' }, function (r) {
    // 处理result.body
});
c.addRule({ reg: 'www.**.com', name: 'google' }, function (r) {
    // 处理result.body
});

跟最近做的一个 Nodejs爬虫很像

回到顶部