开发网络爬虫应该如何选择爬虫框架?

Posted yangykaifa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发网络爬虫应该如何选择爬虫框架?相关的知识,希望对你有一定的参考价值。

有些人问,开发网络爬虫应该选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector还是其它的?这里依照我的经验随便扯淡一下:

上面说的爬虫,基本能够分3类:

      1.分布式爬虫:Nutch

      2.JAVA单机爬虫:Crawler4j、WebMagic、WebCollector

      3. 非JAVA单机爬虫:scrapy

    

第一类:分布式爬虫

        爬虫使用分布式。主要是解决两个问题:

                1)海量URL管理

                2)网速

        如今比較流行的分布式爬虫,是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(用的人少、资料也少)。


能够增加网络爬虫技术社区一起讨论:

       http://nutcher.org








以上是关于开发网络爬虫应该如何选择爬虫框架?的主要内容,如果未能解决你的问题,请参考以下文章

爬虫,有啥框架比httpclient更快

Python 3网络爬虫开发实战书籍

开源爬虫框架各有什么优缺点?

解析3类开源爬虫框架的优缺点

怎么样使用Python的Scrapy爬虫框架

如何学习python知乎