有些人问,开发网络爬虫应该选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector仍是其它的?这里依照个人经验随便扯淡一下:javascript
上面说的爬虫,基本可以分3类:php
1.分布式爬虫:Nutchhtml
2.JAVA单机爬虫:Crawler4j、WebMagic、WebCollectorjava
3. 非JAVA单机爬虫:scrapy
python
第一类:分布式爬虫mysql
爬虫使用分布式。主要是解决两个问题:web
1)海量URL管理ajax
2)网速sql
现在比較流行的分布式爬虫,是Apache的Nutch。数据库
但是对于大多数用户来讲,Nutch是这几类爬虫里,最很差的选择,理由例如如下:
1)Nutch是为搜索引擎设计的爬虫,大多数用户是需要一个作精准数据爬取(精抽取)的爬虫。Nutch执行的一套流程里,有三分之二是为了搜索引擎而设计的。对精抽取没有太大的意义。
也就是说,用Nutch作数据抽取。会浪费很是多的时间在没必要要的计算上。而且假设你试图经过对Nutch进行二次开发,来使得它适用于精抽取的业务。基本上就要破坏Nutch的框架,把Nutch改的面目全非。有改动Nutch的能力,真的不如本身又一次写一个分布式爬虫框架了。
2)Nutch依赖hadoop执行,hadoop自己会消耗很是多的时间。假设集群机器数量较少。爬取速度反而不如单机爬虫快。
3)Nutch尽管有一套插件机制,而且做为亮点宣传。可以看到一些开源的Nutch插件。提供精抽取的功能。但是开发过Nutch插件的人都知道。Nutch的插件系统有多蹩脚。
利用反射的机制来载入和调用插件。使得程序的编写和调试都变得异常困难,更别说在上面开发一套复杂的精抽取系统了。而且Nutch并无为精抽取提供对应的插件挂载点。
Nutch的插件有仅仅有五六个挂载点,而这五六个挂载点都是为了搜索引擎服务的。并无为精抽取提供挂载点。
大多数Nutch的精抽取插件,都是挂载在“页面解析”(parser)这个挂载点的,这个挂载点事实上是为了解析连接(为兴许爬取提供URL),以及为搜索引擎提供一些易抽取的网页信息(网页的meta信息、text文本)。
4)用Nutch进行爬虫的二次开发,爬虫的编写和调试所需的时间,每每是单机爬虫所需的十倍时间不止。了解Nutch源代码的学习成本很是高,况且是要让一个团队的人都读懂Nutch源代码。调试过程当中会出现除程序自己以外的各类问题(hadoop的问题、hbase的问题)。
5)很是多人说Nutch2有gora。可以持久化数据到avro文件、hbase、mysql等。
很是多人事实上理解错了。这里说的持久化数据。是指将URL信息(URL管理所需要的数据)存放到avro、hbase、mysql。并不是你要抽取的结构化数据。事实上对大多数人来讲,URL信息存在哪里无所谓。
6)Nutch2的版本号眼下并不适合开发。
官方现在稳定的Nutch版本号是nutch2.2.1,但是这个版本号绑定了gora-0.3。假设想用hbase配合nutch(大多数人用nutch2就是为了用hbase)。仅仅能使用0.90版本号左右的hbase,对应的就要将hadoop版本号降到hadoop 0.2左右。而且nutch2的官方教程比較有误导做用,Nutch2的教程有两个,各自是Nutch1.x和Nutch2.x,这个Nutch2.x官网上写的是可以支持到hbase 0.94。
但是实际上。这个Nutch2.x的意思是Nutch2.3以前、Nutch2.2.1以后的一个版本号,这个版本号在官方的SVN中不断更新。而且很不稳定(一直在改动)。
因此。假设你不是要作搜索引擎。尽可能不要选择Nutch做为爬虫。有些团队就喜欢跟风,非要选择Nutch来开发精抽取的爬虫,事实上是冲着Nutch的名气(Nutch做者是Doug Cutting),固然最后的结果每每是项目延期完毕。
假设你是要作搜索引擎。Nutch1.x是一个很好的选择。Nutch1.x和solr或者es配合,就可以构成一套很强大的搜索引擎了。假设非要用Nutch2的话。建议等到Nutch2.3公布再看。眼下的Nutch2是一个很不稳定的版本号。
第二类:JAVA单机爬虫
这里把JAVA爬虫单独分为一类,是因为JAVA在网络爬虫这块的生态圈是很无缺的。
相关的资料也是最全的。这里可能有争议,我仅仅是随便扯淡。
事实上开源网络爬虫(框架)的开发很easy,难问题和复杂的问题都被曾经的人攻克了(比方DOM树解析和定位、字符集检測、海量URL去重),可以说是毫无技术含量。包含Nutch,事实上Nutch的技术难点是开发hadoop,自己代码很easy。网络爬虫从某种意义来讲。相似遍历本机的文件,查找文件里的信息。
没有不论什么难度可言。之因此选择开源爬虫框架。就是为了省事。比方爬虫的URL管理、线程池之类的模块。谁都能作,但是要作稳定也是需要一段时间的调试和改动的。
对于爬虫的功能来讲。
用户比較关心的问题每每是:
1)爬虫支持多线程么、爬虫能用代理么、爬虫会爬取反复数据么、爬虫能爬取JS生成的信息么?
不支持多线程、不支持代理、不能过滤反复URL的。那都不叫开源爬虫,那叫循环运行http请求。
能不能爬js生成的信息和爬虫自己没有太大关系。爬虫主要是负责遍历站点和下载页面。爬js生成的信息和网页信息抽取模块有关,每每需要经过模拟浏览器(htmlunit,selenium)来完毕。这些模拟浏览器,每每需要耗费很是多的时间来处理一个页面。因此一种策略就是,使用这些爬虫来遍历站点,遇到需要解析的页面,就将网页的相关信息提交给模拟浏览器,来完毕JS生成信息的抽取。
2)爬虫可以爬取ajax信息么?
网页上有一些异步载入的数据。爬取这些数据有两种方法:使用模拟浏览器(问题1中描写叙述过了)。或者分析ajax的http请求,本身生成ajax请求的url,获取返回的数据。假设是本身生成ajax请求,使用开源爬虫的意义在哪里?事实上是要用开源爬虫的线程池和URL管理功能(比方断点爬取)。
假设我已经可以生成我所需要的ajax请求(列表)。怎样用这些爬虫来对这些请求进行爬取?
爬虫每每都是设计成广度遍历或者深度遍历的模式,去遍历静态或者动态页面。
爬取ajax信息属于deep web(深网)的范畴,尽管大多数爬虫都不直接支持。但是也可以经过一些方法来完毕。比方WebCollector使用广度遍从来遍历站点。爬虫的第一轮爬取就是爬取种子集合(seeds)中的所有url。简单来讲,就是将生成的ajax请求做为种子,放入爬虫。用爬虫对这些种子,进行深度为1的广度遍历(默认就是广度遍历)。
3)爬虫怎么爬取要登录的站点?
这些开源爬虫都支持在爬取时指定cookies,模拟登录主要是靠cookies。至于cookies怎么获取,不是爬虫管的事情。你可以手动获取、用http请求模拟登录或者用模拟浏览器本身主动登录获取cookie。
4)爬虫怎么抽取网页的信息?
开源爬虫通常都会集成网页抽取工具。主要支持两种规范:CSS SELECTOR和XPATH。至于哪一个好,这里不评价。
5)爬虫怎么保存网页的信息?
有一些爬虫,自带一个模块负责持久化。比方webmagic。有一个模块叫pipeline。经过简单地配置。可以将爬虫抽取到的信息,持久化到文件、数据库等。另外一些爬虫。并无直接给用户提供数据持久化的模块。比方crawler4j和webcollector。
让用户本身在网页处理模块中加入提交数据库的操做。
至于使用pipeline这样的模块好很差。就和操做数据库使用ORM好很差这个问题相似,取决于你的业务。
6)爬虫被站点封了怎么办?
爬虫被站点封了,通常用多代理(随机代理)就可以解决。
但是这些开源爬虫通常没有直接支持随机代理的切换。因此用户每每都需要本身将获取的代理,放到一个全局数组中。本身写一个代理随机获取(从数组中)的代码。
7)网页可以调用爬虫么?
爬虫的调用是在Web的服务端调用的,平时怎么用就怎么用,这些爬虫都可以使用。
8)爬虫速度怎么样?
单机开源爬虫的速度。基本都可以讲本机的网速用到极限。
爬虫的速度慢。每每是因为用户把线程数开少了、网速慢。或者在数据持久化时,和数据库的交互速度慢。而这些东西,每每都是用户的机器和二次开发的代码决定的。这些开源爬虫的速度,都很是可以。
9)明明代码写对了,爬不到数据,是否是爬虫有问题。换个爬虫能解决么?
假设代码写对了。又爬不到数据,换其它爬虫也是同样爬不到。遇到这样的状况,要么是站点把你封了,要么是你爬的数据是javascript生成的。
爬不到数据经过换爬虫是不能解决的。
10)哪一个爬虫可以推断站点是否爬完、那个爬虫可以依据主题进行爬取?
爬虫没法推断站点是否爬完。仅仅能尽量覆盖。
至于依据主题爬取,爬虫以后把内容爬下来才知道是什么主题。因此通常都是整个爬下来。而后再去筛选内容。假设嫌爬的太泛,可以经过限制URL正则等方式,来缩小一下范围。
11)哪一个爬虫的设计模式和构架比較好?
设计模式纯属扯淡。说软件设计模式好的,都是软件开发完,而后总结出几个设计模式。
设计模式对软件开发没有指导性做用。用设计模式来设计爬虫,仅仅会使得爬虫的设计更加臃肿。
至于构架,开源爬虫眼下主要是细节的数据结构的设计,比方爬取线程池、任务队列,这些你们都能控制好。爬虫的业务太简单,谈不上什么构架。
因此对于JAVA开源爬虫,我认为。随便找一个用的顺手的就可以。假设业务复杂,拿哪一个爬虫来,都是要通过复杂的二次开发,才干够知足需求。
第三类:非JAVA单机爬虫
在非JAVA语言编写的爬虫中,有很是多优秀的爬虫。
这里单独提取出来做为一类。并不是针对爬虫自己的质量进行讨论,而是针对larbin、scrapy这类爬虫,对开发成本的影响。
先说python爬虫。python可以用30行代码。完毕JAVA 50行代码干的任务。python写代码的确快,但是在调试代码的阶段,python代码的调试每每会耗费远远多于编码阶段省下的时间。使用python开发,要保证程序的正确性和稳定性,就需要写不少其它的測试模块。
固然假设爬取规模不大、爬取业务不复杂。使用scrapy这样的爬虫也是蛮不错的。可以轻松完毕爬取任务。
对于C++爬虫来讲,学习成本会比較大。
而且不能仅仅计算一我的的学习成本,假设软件需要团队开发或者交接,那就是很是多人的学习成本了。软件的调试也不是那么easy。
另外一些ruby、php的爬虫。这里很少评价。的确有一些很是小型的数据採集任务,用ruby或者php很是方便。但是选择这些语言的开源爬虫,一方面要调研一下相关的生态圈,还有就是,这些开源爬虫可能会出一些你搜不到的BUG(用的人少、资料也少)。
可以增长网络爬虫技术社区一块儿讨论: