老狗啃爬虫-爬虫方案选择之WebMagic
摘要:
网络爬虫是一个比较成熟的技术应用,目前,从技术角度说,市面上的爬虫框架有很多种选择,不同种开发语言又有许多不同的种类,这就让不少人在开发预研的时候陷入选择上的迷茫,接下来我们收集了一下市面上主流的开发语言中对一些主流的爬虫框架,并简单看下爬虫框架的优劣;希望在对我们在选择是用什么样的爬虫框架方案中有所帮助
网络爬虫是一个比较成熟的技术应用,目前,从技术角度说,市面上的爬虫框架有很多种选择,不同种开发语言又有许多不同的种类,这就让不少人在开发预研的时候陷入选择上的迷茫,接下来我们收集了一下市面上主流的开发语言中对一些主流的爬虫框架,并简单看下爬虫框架的优劣;希望在对我们在选择是用什么样的爬虫框架方案中有所帮助。
常用爬虫框架列表
JAVA | PYTHON | PHP | C# | C/C++ | javascript |
---|---|---|---|---|---|
Apache Nutch2 | scrapy | phpspider | DotnetSpider | open-source-search-engine | Request |
webmagic | Crawley | Beanbun | NWebCrawler | Cobweb | Cheerio |
Heritrix | Portia | php selenium | SmartSpider | upton | Osmosis |
WebCollector | PySpider | Abot | wombat | Puppeteer | |
crawler4j | grab | xNet | Spidr | Apify SDK | |
Spiderman | cola | AngleSharp | Larbin | ||
SeimiCrawler | python selenium | CSQuery | |||
jsoup | |||||
java selenium | |||||
htmlunit |

可以看到,各种语言各种技术应用,爬虫框架也是琳琅满目,接下来我们看看这些爬虫框架的特点。
常用爬虫框架介绍
A、 Java爬虫框架
Java是一种高性能、安全强健,主打面向对象性的编程语言,我们看看基于java的这几种爬虫框架:
Apache Nutch2Apache Nutch2
地址:http://nutch.apache.org/
Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。
Nutch 致力于让每个人能很容易, 同时花费很少就可以配置世界一流的Web搜索引擎. 为了完成这一宏伟的目标, Nutch必须能够做到:
每个月取几十亿网页
为这些网页维护一个索引
对索引文件进行每秒上千次的搜索
提供高质量的搜索结果
简单来说Nutch支持分布式,可以通过配置网站地址、规则、以及采集的深度(通用爬虫或全网爬虫)对网站进行采集,并提供了全文检索功能,可以对采集下来的海量数据进行全文检索;假如您想完成对站点所有内容进行采集,且不在乎采集和解析精度(不对特定页面特定字段内容采集)的需求,建议你使用Apache Nutch,假如您想对站点的指定内容板块指定字段采集,建议您使用垂直爬虫较为灵活。
webmgaic
地址: https://github.com/code4craft/webmagic
WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,你可以快速开发出一个高效、易维护的爬虫。
特性:
简单的API,可快速上手
模块化的结构,可轻松扩展
提供多线程和分布式支持
Heritrix
地址:https://github.com/internetarchive/heritrix3
Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。
WebCollector
地址:https://github.com/CrawlScript/WebCollector
WebCollector是一个无须配置、便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫。WebCollector-Hadoop是WebCollector的Hadoop版本,支持分布式爬取。
crawler4j
地址::https://github.com/yasserg/crawler4j
crawler4j是一款基于Java的轻量级单机开源爬虫框架,最大的一个特点就是简单。另外也支持多线程、支持代理、可以过滤重复URL
基本上从加载jar到工程里面 通过修改示例的代码就可以简单的实现一个爬虫的全部功能,而这一切动作加起来都不需要超过半个小时。
Spiderman
地址: https://gitee.com/l-weiwei/spiderman
Spiderman 是一个Java开源Web数据抽取工具。它能够收集指定的Web页面并从这些页面中提取有用的数据。 Spiderman主要是运用了像XPath、正则、表达式引擎等这些技术来实现数据抽取。
SeimiCrawler
地址: https://github.com/zhegexiaohuozi/SeimiCrawler
一个敏捷的,独立部署的,支持分布式的Java爬虫框架
SeimiCrawler是一个强大的,高效敏捷的,支持分布式的爬虫开发框架,希望能在最大程度上降低新手开发一个可用性高且性能不差的爬虫系统的门槛,以及提升开发爬虫系统的开发效率。在SeimiCrawler的世界里,绝大多数人只需关心去写抓取的业务逻辑就够了,其余的Seimi帮你搞定。
设计思想上SeimiCrawler受Python的爬虫框架Scrapy启发很大,同时融合了Java语言本身特点与Spring的特性,并希望在国内更方便且普遍的使用更有效率的XPath解析HTML,所以SeimiCrawler默认的HTML解析器是JsoupXpath,默认解析提取HTML数据工作均使用XPath来完成(当然,数据处理亦可以自行选择其他解析器)。
jsoup
地址:https://jsoup.org/
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
B、 Python爬虫框架
PHP是一种简单,入门快、标准库丰富的编程语言,我们看看基于PHP的这几种爬虫框架:
scrapy
地址:https://scrapy.org/
Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
Scrap,是碎片的意思,这个Python的爬虫框架叫Scrapy。
Crawley
地址:http://project.crawley-cloud.com/
高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为JSON、XML等
Portia
地址: https://github.com/scrapinghub/portia
Portia 是一个用 Python 编写无需任何编程知识,就能可视爬取网站数据的开源工具。无需下载或安装任何东西,因为,Portia 是运行在您的 Web 浏览器中。
Portia 是 scrapyhub 开源的一款可视化爬虫规则编写工具。Portia 提供了可视化的 Web 页面,只需通过简单点击,标注页面上需提取的相应数据,无需任何编程知识即可完成爬取规则的开发。这些规则还可在 Scrapy 中使用,用于抓取页面。
PySpider
地址: https://github.com/binux/pyspider
PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。
grab
地址:http://www.imscraping.ninja/posts/introducing-grab-framework-python-webscraping/
网络爬虫框架(基于pycurl/multicur)。
cola
地址:https://github.com/chineking/cola
一个分布式爬虫框架。项目整体设计有点糟,模块间耦合度较高,不过值得借鉴。
C、 PHP爬虫框架
PHP是一种语法简单,入门快、性能优越的编程语言,我们看看基于PHP的这几种爬虫框架:
phpspider
地址:https://github.com/owner888/phpspider
phpspider是一个爬虫开发框架。使用本框架,你不用了解爬虫的底层技术实现,爬虫被网站屏蔽、有些网站需要登录或验证码识别才能爬取等问题。简单几行PHP代码,就可以创建自己的爬虫,利用框架封装的多进程Worker类库,代码更简洁,执行效率更高速度更快。
Beanbun
地址: https://github.com/kiddyuchina/Beanbun
Beanbun 是用 PHP 编写的多进程网络爬虫框架,具有良好的开放性、高可扩展性。
支持守护进程与普通两种模式(守护进程模式只支持 Linux 服务器)
默认使用 Guzzle 进行爬取
支持分布式
支持内存、Redis 等多种队列方式
支持自定义URI过滤
支持广度优先和深度优先两种爬取方式
遵循 PSR-4 标准
爬取网页分为多步,每步均支持自定义动作(如添加代理、修改 user-agent 等)
灵活的扩展机制,可方便的为框架制作插件:自定义队列、自定义爬取方式…
D、c#爬虫框架
C#是一种精确、简单、类型安全、面向对象的语言,我们看看基于C#的这几种爬虫框架的:
DotnetSpider
地址: https://github.com/dotnetcore/DotnetSpider
DotnetSpider这是国人开源的一个跨平台、高性能、轻量级的爬虫软件,采用 C# 开发。目前是.Net开源爬虫最为优秀的爬虫之一。
NWebCrawler
地址:http://nwebcrawler.codeplex.com/
NWebCrawler是一款开源的C#网络爬虫程序更多NWebCrawler
SmartSpider
地址: https://github.com/smartbooks/SmartSpider
SmartSpider爬虫引擎内核版,全新的设计理念,真正的极简版本。
Abot
地址:https://github.com/sjdirect/abot
Abot是一个开源的.net爬虫,速度快,易于使用和扩展。
xNet
地址:https://github.com/X-rus/xNet
这个一个俄国牛人写的开源工具,为啥说他强悍了,因为他将所有Http协议的底层都实现了一遍,这有啥好处?只要你是写爬虫的,都会遇到一个让人抓狂的问题,就是明明知道自己Http请求头跟浏览器一模一样了,为啥还会获取不到自己想要的数据。这时你如果使用HttpWebReaquest,你只能调试到GetRespone,底层的字节流是调试不到了。所以必须得有个更深入的底层组件,方便自己调试。
AngleSharp
地址:http://anglesharp.github.io/
解析HTML利器AngleSharp介绍解析HTML利器AngleSharp介绍AngleSharp是基于.NET(C#)开发的专门为解析xHTML源码的DLL组件。
CSQuery
地址:https://github.com/jamietre/CsQuery
CSQuery 犀利的html代码分析库,像jq一样用c#处理html
E、C/C++爬虫框架
C语言是一种简洁紧凑、灵活方便的结构式编程语言,当然C++也有成熟的对象概念,我们看看基于C/C++的这几种爬虫框架:
open-source-search-engine
地址:https://github.com/gigablast/open-source-search-engine
基于C/C++开发的网络爬虫和搜索引擎.
Cobweb
地址:https://github.com/stewartmckee/cobweb
非常灵活,易于扩展的网络爬虫,可以单点部署使用.
upton
地址:https://github.com/propublica/upton
一个易于上手的爬虫框架集合,支持CSS选择器.
wombat
地址:https://github.com/felipecsl/wombat
基于Ruby天然的支持DSL的网络爬虫,易于提取网页正文数据.
Spidr
地址:https://github.com/postmodern/spidr
全站数据采集,支持无限的网站链接地址采集.
Larbin
地址:http://larbin.sourceforge.net/download.html
larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人Sébastien Ailleret独立开发,用c++语言实现。larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎提供广泛的数据来源。 Larbin只是一个爬虫,也就是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。
larbin最初的设计也是依据设计简单但是高度可配置性的原则,因此我们可以看到,一个简单的larbin的爬虫可以每天获取500万的网页,实在是非常高效。
利用larbin,我们可以轻易的获取/确定单个网站的所有联结,甚至可以镜像一个网站;也可以用它建立url 列表群,例如针对所有的网页进行 url retrive后,进行xml的联结的获取。或者是 mp3,或者定制larbin,可以作为搜索引擎的信息的来源。
F、javascript爬虫框架
这些年由于node.js之类的框架兴起,基于javascript这种编程语言也衍生了很多应用,我们看看基于javascript的这几种爬虫框架的特点:
Request
地址:https://github.com/request/request
Request又被称为HTTP客户机,它是一个极其简单但又高效的HTTP客户机,能使你快速而简单地进行HTTP调用。
支持HTTPS,默认情况下遵循重定向。
操作简易,可以直接使用,而无需花时间研究产品说明书。
例如,如果你想下拉一个页面的内容,这很简单:
const request = require('request');
request('http://stackabuse.com',function(err, res, body) {
console.log(body);
});
特点:
支持所有HTTP方法(GET、POST、DELETE等)
支持表单上传
支持流和回调接口
HTTP身份验证
代理支持
支持TLS/SSL协议
Cheerio
地址: https://github.com/cheeriojs/cheerio
Cheerio又被称为解析器,它提供了专为服务器设计的快速、灵活和精益的核心jQuery实现。
cheerio解析标记,并提供一个用于遍历/操作结果数据结构的API。
特点:
熟悉的语法:Cheerio实现了核心jQuery的一个子集。它删除了jQuery库中所有的DOM不一致性和浏览痕迹,充分展示了API的魅力。
快速:Cheerio使用非常简单、一致的DOM模型。因此,解析、操作和呈现非常高效。初步的端到端基准测试表明cheerio比JSDOM快8倍左右。
惊人的灵活性:Cheerio几乎可以解析任何HTML或XML文档。
Osmosis
地址: https://github.com/rchipka/node-osmosis
Osmosis又名解析器,它包括HTML/XML解析器和webscraper。
它是用node.js编写的,包含了css3/xpath选择器和轻量级http包装器。
没有像Cheerio这样的大型依赖项。
特点:
支持CSS 3.0和XPath1.0选择器的混合
加载和搜索AJAX内容
记录url、重定向和错误
cookie jar和自定义cookie /header /用户代理
登录/表单提交、会话cookie和基本验证
单个代理或多个代理,处理代理故障
重试和重定向限制
Puppeteer
地址: https://github.com/puppeteer/puppeteer
Puppeteer又称无头Chrome自动化浏览器,它是一个Node.js库,提供了一个简单但高效的API,使您能够控制谷歌的Chrome或Chromium浏览器。
它还能够在headless模式下运行Chromium(对于在服务器上运行浏览器非常有用),并且可以发送和接收请求,而不需要用户界面。
最棒的是其可在后台操作,按照API的指示执行操作。
特点:
单击按钮、链接和图像等元素
自动提交表单
导航页面
使用时间轴跟踪来找出问题所在
直接在浏览器中对用户界面和各种前端应用程序进行自动化测试
截屏
将网页转换为pdf文件
Apify SDK
地址: https://github.com/apify/apify-js
Apify SDK又称完整的Web抓取框架,是用于抓取和web爬行的开源Node.js库。
Apify SDK是独特的工具,其简化了web爬虫、抓取器、数据提取器和web自动化工作的开发。
提供了管理和自动扩展无头Chrome / Puppeteer实例池的工具,可以维护要抓取的url队列,将抓取结果存储到本地文件系统或云,旋转代理等等。
既可以在自己的应用程序中独立使用,也可以在运行在Apify云上的参与者中使用。
特点:
使用url的持久队列对整个网站进行深度抓取。
在CSV文件中运行包含100k个url的抓取代码,代码崩溃时不会丢失任何数据。
通过旋转代理来隐藏你的浏览器源。
定期调度代码运行并发送错误通知。
禁用网站使用的浏览器指纹保护。
结语
爬虫框架太多了,也许我们心血来潮,按照爬虫系统普遍的思路,使用自己擅长的语言,也能写一个。其实大多数爬虫框架也都大同小异,只是通过不同的编程语言进行实现而已,一般我们也无需从新造轮子,我们的目的是达成目的,当然这些现成的爬虫框架里有很多值得借鉴的思路,是完全值得学习了解的。
考虑到市面上使用的普遍性和社区成熟度上,python开发者我们推荐使用目前流行的scrapy爬虫框架,python语言在分析处理数据方面是非常有优势的,scrapy也是可以根据需求灵活修改的爬虫框架;
java开发者我们推荐使用webmagic爬虫框架,java语言就不赘述了,大型应用场景非常广泛,足以证明其优越的品质。WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,我们可以快速开发出一个高效、易维护且功能强大的爬虫系统。

一般来说,java方案中,针对大型爬虫项目,人们可能更倾向于Nutch和Heritrix框架,人们热衷于称赞其功能丰富,文档完整等等;但对于小型的爬虫项目,Crawler4j、WebCollector、WebMagic框架上手都比较简单,很容易基于其功能快速开发出爬虫程序。尤其是WebMagic框架的垂直、全栈式、模块化特点,更被推崇。WebMagic实现了下载、调度、持久化、处理页面等模块。每个模块相互独立,你可以选择它已经帮你实现好的方案,也可以按照自己的意愿重新实现,这就可以实现很强的定制性,也就更适合去写抓取特定领域信息的爬虫程序。
接下来,我们就WebMagic爬虫框架尝试进行开发,具体深入了解爬虫。