[原创]手把手教你写网络爬虫(3):开源爬虫框架对比

 

手把手教你写网络爬虫(3)git

做者:拓海 (https://github.com/tuohai666)github

摘要:从零开始写爬虫,初学者的速成指南!web

封面:算法

 

 

介绍

你们好!咱们从今天开始学习开源爬虫框架Scrapy,若是你看过《手把手》系列的前两篇,那么今天的内容就很是容易理解了。细心的读者也许会有疑问,为何不学出身名门的Apache顶级项目Nutch,或者人气飙升的国内大神开发的Pyspider等框架呢?缘由很简单,咱们来看一下主流爬虫框架在GitHub上的活跃度:shell

Project数据库

Language后端

Star缓存

Watchcookie

Fork网络

Nutch

Java

1111

195

808

webmagic

Java

4216

618

2306

WebCollector

Java

1222

255

958

heritrix3

Java

773

141

428

crawler4j

Java

1831

242

1136

Pyspider

Python

8581

687

2273

Scrapy

Python

19642

1405

5261

看到了吗?星星数排名第一的Scrapy比其余全部的加起来都要多,我仿佛听到他这样说:

 

 

好了,以上纯属玩笑,切莫认真,否则要引起口水战了!这些框架都很优秀,都有不少用户,活跃度相对低的并不说明技术低,活跃度相对高的也许只是多知足了一些用户需求。接下来咱们仍是要理性的对主流爬虫框架作一个对比分析。

 

开源框架大PK

各路英雄已经到齐了, PK如今开始!

 

Nutch

介绍:

Nutch是一个开源的Java实现的搜索引擎。它提供了咱们运行本身的搜索引擎所需的所有工具,包括全文搜索和网络爬虫。

尽管搜索是上网的基本要求,可是现有的搜索引擎的数目却在降低。而且这颇有可能进一步演变成为一个公司垄断了几乎全部的网页搜索为其谋取商业利益。这显然不利于广大Internet用户。

Nutch为咱们提供了这样一个不一样的选择。相对于那些商用的搜索引擎,Nutch做为开放源代码的搜索引擎将会更加透明,从而更值得你们信赖。如今全部主要的搜索引擎都采用私有的排序算法, 而不会解释为何一个网页会排在一个特定的位置。除此以外, 有的搜索引擎依照网站所付的费用, 而不是根据它们自己的价值进行排序。与它们不一样,Nutch没有什么须要隐瞒,也没有动机去扭曲搜索的结果。Nutch将尽本身最大的努力为用户提供最好的搜索结果。

 

优势:

Nutch支持分布式抓取,并有Hadoop支持,能够进行多机分布抓取,存储和索引。另外很吸引人的一点在于,它提供了一种插件框架,使得其对各类网页内容的解析、各类数据的采集、查询、集群、过滤等功能可以方便的进行扩展。正是因为有此框架,使得 Nutch 的插件开发很是容易,第三方的插件也层出不穷,极大的加强了 Nutch 的功能和声誉。

 

缺点:

对于大多数用户来讲,通常是想作一个精确数据爬取的爬虫,就像第一篇里爬歌单那个“主题爬虫”。而第二篇介绍的“通用爬虫”适合作搜索引擎,这种需求就比较少。若是以此为标准,那么为搜索引擎而生的Nutch就有着天生缺点。Nutch的架构里大部分为搜索引擎而设计的,对精确爬取没有特别的考虑。也就是说,用Nutch作主题爬虫,会浪费不少的时间在没必要要的计算上。并且若是你试图经过对Nutch进行二次开发来扩展其定制能力,基本上就要破坏Nutch的框架,反而不如本身写了。

 

Pyspider

介绍:

Pyspider是一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。

 

Pyspider的主要功能包括,抓取、更新调度多站点的特定的页面;须要对页面进行结构化信息提取;灵活可扩展,稳定可监控。知足了绝大多数Python爬虫的需求 —— 定向抓取,结构化化解析。可是面对结构迥异的各类网站,单一的抓取模式并不必定能知足,灵活的抓取控制是必须的。为了达到这个目的,单纯的配置文件每每不够灵活,因而,经过脚本去控制抓取成为了最后的选择。而去重调度,队列,抓取,异常处理,监控等功能做为框架,提供给抓取脚本,并保证灵活性。最后加上web的编辑调试环境,以及web任务监控,即成为了最终的框架。

 

优势:

  1. 支持分布式部署。
  2. 彻底可视化,对用户很是友好:WEB 界面编写调试脚本,起停脚本,监控执行状态,查看活动历史,获取结果产出。
  3. 简单,五分钟就能上手。脚本规则简单,开发效率高。
  4. 支持抓取JavaScript的页面。

总之,Pyspider很是强大,强大到更像一个产品而不是一个框架。

 

缺点:

  1. URL去重使用数据库而不是布隆过滤器,亿级存储的db io将致使效率急剧下降。
  2. 使用上的人性化牺牲了灵活度,定制化能力下降。

 

Scrapy

介绍:

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 能够应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。Scrapy 使用 Twisted这个异步网络库来处理网络通信,架构清晰,而且包含了各类中间件接口,能够灵活的完成各类需求。Scratch,是抓取的意思,这个Python的爬虫框架叫Scrapy,大概也是这个意思吧。

 

优势:

  1. 极其灵活的定制化爬取。
  2. 社区人数多、文档完善。
  3. URL去重采用布隆过滤器方案。
  4. 能够处理不完整的HTML,Scrapy已经提供了selectors(一个在lxml的基础上提供了更高级的接口),能够高效地处理不完整的HTML代码。

 

缺点:

  1. 不支持分布式部署。
  2. 原生不支持抓取JavaScript的页面。
  3. 全命令行操做,对用户不友好,须要必定学习周期。

 

结论

篇幅有限,就先选择这三个最有表明性的框架进行PK。他们都有远超别人的优势,好比:Nutch天生的搜索引擎解决方案、Pyspider产品级的WebUI、Scrapy最灵活的定制化爬取。也都各自致命的缺点,好比Scrapy不支持分布式部署,Pyspider不够灵活,Nutch和搜索绑定。究竟该怎么选择呢?

咱们的目标是作纯粹的爬虫,不是搜索引擎,因此先把Nutch排除掉,剩下人性化的Pyspider和高可定制的Scrapy。Scrapy的灵活性几乎可以让咱们完成任何苛刻的抓取需求,它的“难用”也让咱们不知不觉的研究爬虫技术。如今还不是享受Pyspider的时候,目前的当务之急是打好基础,应该学习最接近爬虫本质的框架,了解它的原理,因此把Pyspider也排除掉。

最终,理性的从我的的需求角度对比,仍是Scrapy胜出!其实Scrapy还有更多优势:

  1. HTML, XML源数据选择及提取的原生支持。
  2. 提供了一系列在spider之间共享的可复用的过滤器(即 Item Loaders),对智能处理爬取数据提供了内置支持。
  3. 经过 feed导出 提供了多格式(JSON、CSV、XML),多存储后端(FTP、S三、本地文件系统)的内置支持。
  4. 提供了media pipeline,能够 自动下载 爬取到的数据中的图片(或者其余资源)。
  5. 高扩展性。您能够经过使用 signals ,设计好的API(中间件, extensions, pipelines)来定制实现您的功能。
  6. 内置的中间件及扩展为下列功能提供了支持:
    1. cookies and session 处理
    2. HTTP 压缩
    3. HTTP 认证
    4. HTTP 缓存
    5. user-agent模拟
    6. robots.txt
    7. 爬取深度限制
  7. 针对非英语语系中不标准或者错误的编码声明, 提供了自动检测以及健壮的编码支持。
  8. 支持根据模板生成爬虫。在加速爬虫建立的同时,保持在大型项目中的代码更为一致。
  9. 针对多爬虫下性能评估、失败检测,提供了可扩展的 状态收集工具 。
  10. 提供 交互式shell终端 , 为您测试XPath表达式,编写和调试爬虫提供了极大的方便。
  11. 提供 System service, 简化在生产环境的部署及运行。
  12. 内置 Telnet终端 ,经过在Scrapy进程中钩入Python终端,使您能够查看而且调试爬虫。
  13. Logging 为您在爬取过程当中捕捉错误提供了方便。
  14. 支持 Sitemaps 爬取。
  15. 具备缓存的DNS解析器。

 

下一步

吹了半天的Scrapy,时间也到了,若是你们可以喜欢上它,学习的效率必定会成倍提高!下次我会为你们带来满满的干货,并完成更具挑战性的爬虫任务,咱们下期再见!

相关文章
相关标签/搜索