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

news/2024/7/19 11:30:45 标签: 爬虫, java, 大数据

有些人问,开发网络爬虫应该选择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









http://www.niftyadmin.cn/n/1338258.html

相关文章

耳机充电仓芯片-DLTAP602SC-杰力科创

方案基本组成5V输入, 一个电池;四个指示灯 方案产品功能此款C1耳机充电仓方案,主控芯片采用DLTAP602SC系列单片机,封装型号是14引脚SOP,通过设计电路,可以实现如下功能: 1、初次上电&#xff0c…

python:logistic,softmax函数

在学习时,经常会遇到分类的问题,简单的讲:分类就是设定一个阈值,将你想分类的对象与这个阈值进行比较,根据结果来进行决定分类。 最简单的分类函数是阶跃函数(简单粗暴) 但问题在于&#xff0…

负离子净化大雾量带无水检测芯片-DLTAP701SD-杰力科创

方案基本组成7个机械按键,一个2.4M WH-16-2.4BU超声波雾化片(12V),4颗RGB灯,一个DC-5010风扇,一个负离 子,2个喇叭,一个亮度键指示灯(黄光) 方案产品功能此款语音负离子RGB高频加湿器方案&…

机器学习资料

线性回归推荐书籍 线性回归分析导论梯度下降 http://blog.csdn.net/woxincd/article/details/7040944

GDKOI2016 爆零记

滚粗了非常伤心>_< day 0 老师通知能够去试机&#xff0c;于是非常愉快地将近三点半左右的时间到了二中。然后发现老师已经准备关机房了&#xff0c;说我怎么才来。。。喂喂喂不是说三点半到五点的么   晚上本来想背背板子。可是被某BOI鬼畜题给卡了几个小时 。。。官…

极简人体感应芯片-DLT8P68SA-杰力科创

方案基本组成一个机械按键&#xff0c;一个数字人体感应&#xff0c;一路PWM口输出&#xff1b; 方案产品功能此款人体感应壁灯方案&#xff0c;主控芯片采用DLT8P68SA系列单片机&#xff0c;封装型号是8引脚SOP&#xff0c;通过设计电路&#xff0c;可以实现如下功能&#xf…

LED太阳能射灯芯片-DLTAP703SA-杰力科创

方案基本组成一个机械按键&#xff0c;一个太阳能电压检测&#xff0c;一个电池电压检测&#xff0c;一路PWM口输出&#xff1b; 方案产品功能此款LED太阳能射灯方案&#xff0c;主控芯片采用DLTAP703SA系列单片机&#xff0c;封装型号是8引脚SOP&#xff0c;通过设计电路&…

NLP附录(终)

用到的技术 条件概率、动态规划、贝叶斯、最短路径&#xff08;viterbi&#xff09;、EM、MM、HMM、CRF、RNN大数定理 术语 语言模型 词向量 一阶HMM 二元模型 Term 词语 Chunk 词块 参考 《数学之美》&#xff0c;吴军 著 《统计自然语言处理》&#xff0c;宗成庆 著 《统计学…