网络爬虫按照系统结构和实现技术分为哪几类,常见的分布式网络爬虫架构有

  网络爬虫按照系统结构和实现技术分为哪几类,常见的分布式网络爬虫架构有

  blog.csdn.net/csdn 3359号

  

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

  作者:老夏

  开发网络爬虫需要选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector还是其他?在这里,根据我的经验,只是瞎说:

  以上爬行动物基本上可以分为三类:

  1.分散的爬行动物;坚果

  独立爬行动物在2。JAVA: Crawler4j,WebMagic,WebCollector

  依赖JAVA的爬行动物:scrapy

  第一类:分布式爬虫使用分布式,主要解决两个问题。

  1)庞大的URL管理

  2)网速

  现在流行的分布式爬行动物是阿帕奇的Nutch。但是对于很多用户来说,Nutch是这些爬虫中最差的选择。原因如下。

  1) Nutch是为搜索引擎设计的爬虫,大部分用户需要获取(精确提取)精确数据。在Nutch执行的一系列流程中,三分之二是为搜索引擎设计的。精细提取没有意义。这意味着用Nutch提取数据会浪费大量时间进行徒劳的计算。然后通过重新开发Nutch,并尝试应用到复杂的业务中,基本具备了破坏Nutch框架,彻底改变Nutch,修改Nutch的能力。真的比自己重新编写分布式爬虫的框架要好。

  2) Nutch依靠hadoop工作,hadoop本身消耗大量时间。如果集群机器数量少,攀爬速度并不比单个爬行动物快。

  3)虽然Nutch有插件机制,但是作为亮点宣传。您可以看到几个提供复杂提取功能的开源Nutch插件。但是,开发过Nutch插件的人都知道Nutch插件系统有多烂。由于使用反射机制来加载和调用插件,程序的编写和调试非常困难,无法在此基础上开发复杂的精提取系统。此外,Nutch没有提供合适的插件挂载点来缩小范围。Nutch插件只有五六个加载点,但这五六个加载点是为搜索引擎服务的,并不提供加载点的精准提取。大多数Nutch精提取插件都安装在一个名为“解析器”的安装点上。这个挂载点实际上是用来分析链接)和为后续搜索提供URL),为搜索引擎提供易于提取的网页信息(网页元信息,文本)。

  4)爬行动物的二次发育。创建和调试爬虫所需的时间往往是独立爬虫的10倍以上。理解Nutch源代码需要学习成本。更重要的是,我们需要确保团队中的每个人都能阅读Nutch源代码。在调试的过程中,会出现程序本身以外的各种问题(hadoop问题,hbase问题)。

  5) Nutch2有gora。很多人说数据可以永久保存在avro文件,hbase,mysql等。很多人其实是误解了。这里的持久数据是指在avro、hbase、mysql中存储URL信息(管理URL所需的数据)。不是要提取的结构化数据。其实对于很多人来说,网址信息存在哪里并不重要。

  6)nutch 2的版本目前不适合开发。目前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》的作者是道格卡丁)。当然,最后的结果往往是项目延期。

  如果想做搜索引擎,Nutch1.x是一个非常好的选择。Nutch1.x可以和solr、es合作,组成一个非常强大的搜索引擎。如果无论如何都要用Nutch2,建议等到Nutch2.3发布,现在Nutch2是一个非常不稳定的版本。

  第二类:JAVA独立爬虫。这里之所以把JAVA爬虫单独分类,是因为JAVA在网络爬虫的生态圈里是完美的。相关信息也是最充实的。这里可能会有争论。我只是在胡说八道。

  其实开源网络爬虫(框架)的开发很简单,难的复杂的问题都是前人解决的(比如定位为DOM树分析,字符集检测,海量URL删除)。可以说没有什么技术含量。包括Nutch,其实Nutch的技术难点是开发hadoop,本身代码很简单。从某种意义上说,网络爬虫就像遍历一个原生文件,在文件中寻找信息。没什么难的。选择开源爬虫框架是为了省事。比如爬虫的URL管理、线程池等模块,谁都可以做,但是需要时间调试修改才能稳定。

  对于爬行动物的功能。在大多数情况下,用户感兴趣的问题包括:

  1 )1) ) )。

  爬虫是否支持多线程,爬虫能否使用代理,爬虫能否抓取重复数据,爬虫能否抓取JS生成的信息?不支持多线程、代理、重复URL过滤的不叫开源爬虫。它们被称为循环http请求。

  爬行js产生的信息和爬虫本身关系不大。爬虫主要负责遍历网站和下载页面。js抓取产生的信息与网页信息提取模块有关,往往需要通过模拟浏览器(htmlunit,selenium)来完成。这些模拟浏览器处理一个页面通常需要很长时间。因此,一种策略是利用这些爬虫遍历网站,当遇到需要解析的页面时,将页面的相关信息提交给模拟浏览器,完成JS生成信息的提取。

  2)爬虫可以抓取ajax信息吗?网页上有一些异步加载的数据。抓取这些数据有两种方法:使用模拟浏览器(问题1中描述的),或者分析ajax的http请求,自己生成ajax请求的url,获取返回的数据。如果是自己生成ajax请求,那么使用开源爬虫的意义何在?其实就是利用开源爬虫的线程池和URL管理功能(比如断点抓取)。

  如果我已经可以生成我需要的ajax请求(列表),我该如何使用这些爬虫来抓取这些请求呢?

  爬虫通常被设计成以广度或深度的方式遍历静态或动态页面。爬行ajax信息属于deep web的范畴,虽然大部分爬虫并不直接支持。但也可以通过一些方法做到。例如,WebCollector使用广度遍历来遍历网站。爬虫的第一次抓取是抓取种子中的所有URL。简单来说,就是将生成的ajax请求播种到爬虫中。使用crawler遍历这些深度为1的种子(默认为广度遍历)。

  3)爬虫如何抓取要登陆的网站?这些开源爬虫在爬行时都支持指定cookie,模拟登录主要依靠cookie。至于如何获取cookies,就不是爬虫的事了。您可以手动获取cookie,使用http请求模拟登录,或者使用模拟浏览器自动登录。

  4)爬虫如何从网页中提取信息?开源爬虫一般集成了网页提取工具。支持两个主要规范:CSS选择器和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(用户少,信息量少)。

  结束。

  这篇文章转载自http://chuansong.me/n/1899650.

  版权请联系原作者。

网络爬虫按照系统结构和实现技术分为哪几类,常见的分布式网络爬虫架构有