有些人问,开发网络爬虫应该选择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在网络爬虫这块的生态圈是很是完善的。相关的资料也是最全的。这里可能有争议,我只是随便扯淡。
其实开源网络爬虫(框架)的开发很是简单,难问题和复杂的问题都被之前的人解决了(好比DOM树解析和定位、字符集检测、海量URL去重),能够说是毫无技术含量。包括Nutch,其实Nutch的技术难点是开发hadoop,自己代码很是简单。网络爬虫从某种意义来讲,相似遍历本机的文件,查找文件中的信息。没有任何难度可言。之因此选择开源爬虫框架,就是为了省事。好比爬虫的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++爬虫来讲,学习成本会比较大。并且不能只计算一我的的学习成本,若是软件须要团队开发或者交接,那就是不少人的学习成本了。软件的调试也不是那么容易。
还有一些ruby、php的爬虫,这里很少评价。的确有一些很是小型的数据采集任务,用ruby或者php很方便。可是选择这些语言的开源爬虫,一方面要调研一下相关的生态圈,还有就是,这些开源爬虫可能会出一些你搜不到的BUG(用的人少、资料也少)。
能够加入网络爬虫技术社区一块儿讨论: