首页 > 编程知识 正文

通用的爬虫架构,简述网络爬虫的优点

时间:2023-05-05 08:27:11 阅读:160547 作者:638

3359 blog.csdn.net/csdn _ af/article/details/7088852

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

作者:老夏

开发网络爬虫需要选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector或其他吗? 这里根据我的经验随便胡说八道:

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

1 .分散爬行动物: Nutch

2.JAVA独立爬行动物: Crawler4j、WebMagic、WebCollector

非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 ),以及为搜索引擎提供易于提取的网页信息(网页元信息、文本)。

4 )用Nutch进行爬行动物二次开发。 创建和调试爬行动物所需的时间往往是独立爬行动物所需时间的10倍以上。 理解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 )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(用的人少、资料也少)

End.

本文转载自 http://chuansong.me/n/1899650
相关版权请与原作者联系


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。