开源爬虫框架各有哪些优缺点
优采云 发布时间: 2020-05-04 08:06首先爬虫框架有三种
分布式爬虫:Nutch
JAVA单机爬虫:Crawler4j,WebMagic,WebCollector
非JAVA单机爬虫:scrapy
海量URL管理
网速快
Nutch是为搜索引擎设计的爬虫,大多数用户是须要一个做精准数据爬取(精抽取)的爬虫。Nutch运行的一套流程里,有三分之二是为了搜索引擎而设计的。对精抽取没有很大的意义。
用Nutch做数据抽取,会浪费好多的时间在不必要的估算上。而且假如你企图通过对Nutch进行二次开发,来促使它适用于精抽取的业务,基本上就要破坏Nutch的框架,把Nutch改的面目全非。
Nutch依赖hadoop运行,hadoop本身会消耗好多的时间。如果集群机器数目较少,爬取速率反倒不如单机爬虫。
Nutch似乎有一套插件机制,而且作为亮点宣传。可以看见一些开源的Nutch插件,提供精抽取的功能。但是开发过Nutch插件的人都晓得,Nutch的插件系统有多拙劣。利用反射的机制来加载和调用插件,使得程序的编撰和调试都显得异常困难,更别说在里面开发一套复杂的精抽取系统了。
Nutch并没有为精抽取提供相应的插件挂载点。Nutch的插件有只有五六个挂载点,而这五六个挂载点都是为了搜索引擎服务的开源爬虫框架,并没有为精抽取提供挂载点。大多数Nutch的精抽取插件,都是挂载在“页面解析”(parser)这个挂载点的,这个挂载点虽然是为了解析链接(为后续爬取提供URL),以及为搜索引擎提供一些易抽取的网页信息(网页的meta信息、text)
用Nutch进行爬虫的二次开发,爬虫的编撰和调试所需的时间,往往是单机爬虫所需的十倍时间不止。了解Nutch源码的学习成本很高,何况是要使一个团队的人都看懂Nutch源码。调试过程中会出现除程序本身之外的各类问题(hadoop的问题、hbase的问题)。
Nutch2的版本目前并不适宜开发。官方如今稳定的Nutch版本是nutch2.2.1,但是这个版本绑定了gora-0.3。Nutch2.3之前、Nutch2.2.1以后的一个版本,这个版本在官方的SVN中不断更新。而且十分不稳定(一e799bee5baa6e997aee7ad94e78988e69d8331333363396465直在更改)。
支持多线程。
支持代理。
能过滤重复URL的。
负责遍历网站和下载页面。爬js生成的信息和网页信息抽取模块有关,往往须要通过模拟浏览器(htmlunit,selenium)来完成。
先说python爬虫,python可以用30行代码,完成JAVA
50行代码干的任务。python写代码的确快开源爬虫框架,但是在调试代码的阶段,python代码的调试常常会花费远远少于编码阶段市下的时间。
使用python开发,要保证程序的正确性和稳定性,就须要写更多的测试模块。当然若果爬取规模不大、爬取业务不复杂,使用scrapy这些爬虫也是挺不错的,可以轻松完成爬取任务。
bug较多,不稳定。
网页上有一些异步加载的数据,爬取这种数据有两种方式:使用模拟浏览器(问题1中描述过了),或者剖析ajax的http请求,自己生成ajax恳求的url,获取返回的数据。如果是自己生成ajax恳求,使用开源爬虫的意义在那里?其实是要用开源爬虫的线程池和URL管理功能(比如断点爬取)。
爬虫常常都是设计成广度遍历或则深度遍历的模式,去遍历静态或则动态页面。爬取ajax信息属于deepweb(深网)的范畴,虽然大多数爬虫都不直接支持。但是也可以通过一些方式来完成。比如WebCollector使用广度遍历来遍历网站。爬虫的第一轮爬取就是爬取*敏*感*词*集合(seeds)中的所有url。简单来说,就是将生成的ajax恳求作为*敏*感*词*,放入爬虫。用爬虫对那些*敏*感*词*,进行深度为1的广度遍历(默认就是广度遍历)。
这些开源爬虫都支持在爬取时指定cookies,模拟登录主要是靠cookies。至于cookies如何获取,不是爬虫管的事情。你可以自动获取、用http请求模拟登录或则用模拟浏览器手动登入获取cookie。
开源爬虫通常还会集成网页抽取工具。主要支持两种规范:CSSSELECTOR和XPATH。
爬虫的调用是在Web的服务端调用的,平时如何用就如何用,这些爬虫都可以使用。
单机开源爬虫的速率,基本都可以讲本机的网速用到极限。爬虫的速率慢,往往是由于用户把线程数开少了、网速慢,或者在数据持久化时,和数据库的交互速率慢。而这种东西,往往都是用户的机器和二次开发的代码决定的。这些开源爬虫的速率,都太可以。