開源爬蟲框架各有什么優(yōu)缺點(diǎn)?
首先爬蟲框架有三種
分布式爬蟲:Nutch
JAVA單機(jī)爬蟲:Crawler4j,WebMagic,WebCollector
非JAVA單機(jī)爬蟲:scrapy
第一類:分布式爬蟲優(yōu)點(diǎn):
海量URL管理
網(wǎng)速快
缺點(diǎn):
Nutch是為搜索引擎設(shè)計(jì)的爬蟲,大多數(shù)用戶是需要一個(gè)做精準(zhǔn)數(shù)據(jù)爬取(精抽取)的爬蟲。Nutch運(yùn)行的一套流程里,有三分之二是為了搜索引擎而設(shè)計(jì)的。對(duì)精抽取沒有太大的意義。
用Nutch做數(shù)據(jù)抽取,會(huì)浪費(fèi)很多的時(shí)間在不必要的計(jì)算上。而且如果你試圖通過對(duì)Nutch進(jìn)行二次開發(fā),來使得它適用于精抽取的業(yè)務(wù),基本上就要破壞Nutch的框架,把Nutch改的面目全非。
Nutch依賴hadoop運(yùn)行,hadoop本身會(huì)消耗很多的時(shí)間。如果集群機(jī)器數(shù)量較少,爬取速度反而不如單機(jī)爬蟲。
Nutch雖然有一套插件機(jī)制,而且作為亮點(diǎn)宣傳。可以看到一些開源的Nutch插件,提供精抽取的功能。但是開發(fā)過Nutch插件的人都知道,Nutch的插件系統(tǒng)有多蹩腳。利用反射的機(jī)制來加載和調(diào)用插件,使得程序的編寫和調(diào)試都變得異常困難,更別說在上面開發(fā)一套復(fù)雜的精抽取系統(tǒng)了。
Nutch并沒有為精抽取提供相應(yīng)的插件掛載點(diǎn)。Nutch的插件有只有五六個(gè)掛載點(diǎn),而這五六個(gè)掛載點(diǎn)都是為了搜索引擎服務(wù)的,并沒有為精抽取提供掛載點(diǎn)。大多數(shù)Nutch的精抽取插件,都是掛載在“頁面解析”(parser)這個(gè)掛載點(diǎn)的,這個(gè)掛載點(diǎn)其實(shí)是為了解析鏈接(為后續(xù)爬取提供URL),以及為搜索引擎提供一些易抽取的網(wǎng)頁信息(網(wǎng)頁的meta信息、text)
用Nutch進(jìn)行爬蟲的二次開發(fā),爬蟲的編寫和調(diào)試所需的時(shí)間,往往是單機(jī)爬蟲所需的十倍時(shí)間不止。了解Nutch源碼的學(xué)習(xí)成本很高,何況是要讓一個(gè)團(tuán)隊(duì)的人都讀懂Nutch源碼。調(diào)試過程中會(huì)出現(xiàn)除程序本身之外的各種問題(hadoop的問題、hbase的問題)。
Nutch2的版本目前并不適合開發(fā)。官方現(xiàn)在穩(wěn)定的Nutch版本是nutch2.2.1,但是這個(gè)版本綁定了gora-0.3。Nutch2.3之前、Nutch2.2.1之后的一個(gè)版本,這個(gè)版本在官方的SVN中不斷更新。而且非常不穩(wěn)定(一直在修改)。
第二類:JAVA單機(jī)爬蟲優(yōu)點(diǎn):
支持多線程。
支持代理。
能過濾重復(fù)URL的。
負(fù)責(zé)遍歷網(wǎng)站和下載頁面。爬js生成的信息和網(wǎng)頁信息抽取模塊有關(guān),往往需要通過模擬瀏覽器(htmlunit,selenium)來完成。
缺點(diǎn):設(shè)計(jì)模式對(duì)軟件開發(fā)沒有指導(dǎo)性作用。用設(shè)計(jì)模式來設(shè)計(jì)爬蟲,只會(huì)使得爬蟲的設(shè)計(jì)更加臃腫。第三類:非JAVA單機(jī)爬蟲優(yōu)點(diǎn):
先說python爬蟲,python可以用30行代碼,完成JAVA
50行代碼干的任務(wù)。python寫代碼的確快,但是在調(diào)試代碼的階段,python代碼的調(diào)試往往會(huì)耗費(fèi)遠(yuǎn)遠(yuǎn)多于編碼階段省下的時(shí)間。
使用python開發(fā),要保證程序的正確性和穩(wěn)定性,就需要寫更多的測試模塊。當(dāng)然如果爬取規(guī)模不大、爬取業(yè)務(wù)不復(fù)雜,使用scrapy這種爬蟲也是蠻不錯(cuò)的,可以輕松完成爬取任務(wù)。
缺點(diǎn):
bug較多,不穩(wěn)定。
爬蟲可以爬取ajax信息么?網(wǎng)頁上有一些異步加載的數(shù)據(jù),爬取這些數(shù)據(jù)有兩種方法:使用模擬瀏覽器(問題1中描述過了),或者分析ajax的http請(qǐng)求,自己生成ajax請(qǐng)求的url,獲取返回的數(shù)據(jù)。如果是自己生成ajax請(qǐng)求,使用開源爬蟲的意義在哪里?其實(shí)是要用開源爬蟲的線程池和URL管理功能(比如斷點(diǎn)爬取)。
如果我已經(jīng)可以生成我所需要的ajax請(qǐng)求(列表),如何用這些爬蟲來對(duì)這些請(qǐng)求進(jìn)行爬取?爬蟲往往都是設(shè)計(jì)成廣度遍歷或者深度遍歷的模式,去遍歷靜態(tài)或者動(dòng)態(tài)頁面。爬取ajax信息屬于deepweb(深網(wǎng))的范疇,雖然大多數(shù)爬蟲都不直接支持。但是也可以通過一些方法來完成。比如WebCollector使用廣度遍歷來遍歷網(wǎng)站。爬蟲的第一輪爬取就是爬取種子集合(seeds)中的所有url。簡單來說,就是將生成的ajax請(qǐng)求作為種子,放入爬蟲。用爬蟲對(duì)這些種子,進(jìn)行深度為1的廣度遍歷(默認(rèn)就是廣度遍歷)。
爬蟲怎么爬取要登陸的網(wǎng)站?這些開源爬蟲都支持在爬取時(shí)指定cookies,模擬登陸主要是靠cookies。至于cookies怎么獲取,不是爬蟲管的事情。你可以手動(dòng)獲取、用http請(qǐng)求模擬登陸或者用模擬瀏覽器自動(dòng)登陸獲取cookie。
爬蟲怎么抽取網(wǎng)頁的信息?開源爬蟲一般都會(huì)集成網(wǎng)頁抽取工具。主要支持兩種規(guī)范:CSSSELECTOR和XPATH。
網(wǎng)頁可以調(diào)用爬蟲么?爬蟲的調(diào)用是在Web的服務(wù)端調(diào)用的,平時(shí)怎么用就怎么用,這些爬蟲都可以使用。
爬蟲速度怎么樣?單機(jī)開源爬蟲的速度,基本都可以講本機(jī)的網(wǎng)速用到極限。爬蟲的速度慢,往往是因?yàn)橛脩舭丫€程數(shù)開少了、網(wǎng)速慢,或者在數(shù)據(jù)持久化時(shí),和https://www.b5b6.com/shujuku/的交互速度慢。而這些東西,往往都是用戶的機(jī)器和二次開發(fā)的代碼決定的。這些開源爬蟲的速度,都很可以。