Java、Python、C++等各種語言寫爬蟲

#之所以會想起這個問題,是和室友聊到了爬蟲,他習慣Java,而我習慣Python,所以我就想仔細瞭解一下這兩者到底有什麼區別,並且查了許多資料,參考的文章都會在文中穿插標註,不敢說很全面,只是盡力從各種角度去理解

首先要提醒自己一點,千萬別以爲只有Python/Java可以寫爬蟲,或者一提到爬蟲想到的只有Python,實際上現在可以寫爬蟲的語言非常多,比如c++、python、erlang、scala、go、js、PHP、Java、Nodejs、、在寫這篇博文之前我自己都還不知道這麼多,畢竟並不是爬蟲工程師,只是偶爾閒來無事的時候寫一點自己的爬蟲小工具

查資料的時候發現一個很正確的屁話:

和語言沒啥關係,主要是有沒有相應庫的支持。

廢話麼不是,人家問問題就是想了解不同的語言有哪些支持和不支持,以及這些支持和不支持的意義是什麼,所以纔會有語言在爬蟲方面的比較,這樣的回答裝逼嫌疑嚴重實際沒什麼墨水。

什麼適合自己就用什麼、什麼擅長用什麼。

這樣的回答無可厚非,對於純興趣的人這樣的雞湯回答或許可以糊弄一下,但是能關注到這個問題的人,大多都是稍微有點點爬蟲經驗的。如果是在實際做項目的時候或者像我一樣想仔細瞭解一下相關區別的,看到這樣的回答,心裏默唸mmp,


言歸正傳


初級版本的理解:

對於一般的信息採集需要,各種語言差別不大。

C++

運行效率和性能幾乎最強,但是學習成本很高,代碼成型比較慢。

能用C/C++做爬蟲,只能說是能力的表現,但是不是正確的選擇。

Java

網絡爬蟲生態圈也很完善,是Python爬蟲最大的對手。但是Java語言本身很笨重,代碼量很大。

重構成本比較高,任何修改都會導致代碼的大量變動。爬蟲經常需要修改部分採集代碼。

看來Java的繁瑣在爬蟲圈裏也被廣泛詬病啊


許多人(可別扣字眼,我說的是許多人,不是大部分,更不是所有人)寫爬蟲還是更傾向於腳本語言,特別是處於興趣愛好/初學者,因爲就小規模開發而言Python要Java便捷太多,C++就更不用說了。對於大型的項目Java會是Python的強有力競爭對手。


PHP

雖然是世界上最好的語言 ,但是他天生不是幹這個的,

而且對多線程、異步支持不夠好(應該是有支持的,PHP有Pthreads多線程擴展的,只是出來的太晚,雖然現在有了,但是爬蟲的用戶已經被Python和Java佔據了大部分,所以不會是爬蟲的首選),併發處理能力很弱。

或許PHP的語言隨意性可以讓人更多地把精力放在要做的事情上,但是畢竟爬蟲

Python

語法優美、代碼簡潔、開發效率高、支持的模塊多,相關的HTTP請求模塊和HTML解析模塊非常豐富。

還有強大的爬蟲Scrapy,以及成熟高效的 scrapy-redis分佈式策略

各種爬蟲框架,輪子衆多,不需自己造輪子,方便高效的下載網頁;

多線程、進程模型成熟穩定,爬蟲是一個典型的多任務處理場景,請求頁面時會有較長的延遲,總體來說更多的是等待。多線程或進程會更優化程序效率,提升整個系統下載和分析能力。

而且,調用其他接口也非常方便(膠水語言)

缺點在於對編碼的處理



比較高級點的理解

各種語言寫網絡爬蟲有什麼優點缺點?(知乎原回答鏈接,建議大家看一下這個鏈接下的比較長的幾個答主的回答,像是專業的爬蟲工作者的總結,當然不代表我個人的觀點,我只是總結出來供自己的我的讀者參考)

//////////////////////////////////////////////////////////////////////

首先取決於目的

如果是一個站點,單一目的,用習慣的語言寫吧,學別的語言用的時間都夠重構兩遍的了。
如果是有100左右的站點,做個框架,把你的爬蟲管理起來,比起怎麼寫更重要。
ok,以上兩個都是 “手動” 寫模板的(當然,我們會有一些小插件等輔助工具)。手動寫模板的好處是:當站點不多的時候——快,靈活。在這樣的場景和目的下,選擇你習慣的語言,有最多頁面解析和 HTTP 請求支持的庫的語言最好。比如 python,java。
注意,這麼選擇的唯一原因是啓動成本高於編寫成本

當你面臨的是1000個站點這個量級的時候,可能你需要編寫一個模板生成器,比如 Kimono : Turn websites into structured APIs from your browser in seconds
當你面臨的是 1w 個站點以上,但是是同一類型的站點,可能你需要自動模板挖掘。
在這個階段,算法更重要,所以代碼編寫的便利程度決定你的選擇。當然,當算法穩定之後,就變成下面那個問題了。

當你面臨的是每天幾十億的網頁,來一次全量計算算一週,每個頁面需要提取標題,主圖,發佈時間,網頁分塊,頁面價值。不可能有人給他們寫“腳本”,配模板。大量的建樹,分詞,機器學習,打分,follow 鏈接質量預測,篩選。佔用大量的計算。
這個階段,計算速度就非常重要了,除非你能說服老大,給你加幾千臺機器。相對於這樣的需求,重新編寫所有基礎組件都可以。語言的選擇就會選擇執行速度快的了。

需要說明的一點是,靈活度,或者說抽取準確性,從上到下是依次遞減的。PM也不會要求你能對幾百億的網站準確抽取每個字段對吧。

最後說一下抓取的問題。調度抓取對於每個爬蟲都是必要的,但卻沒什麼好說的,不同量級自然有不同的做法,但是這樣的系統一般目的明確,少包依賴,不需要你不斷修改。並且在架構中,往往可以是獨立組件,和下游是不同語言都行,愛用什麼寫用什麼寫。。
對於機房帶寬來說,下行基本是沒人用的,只要你和對方網站願意,抓取速度不是瓶頸。反而,計算對方壓力,篩選重複,高質鏈接更重要。而這又反過來帶來了計算的壓力。
////////////////////////////////////////////////////////////////////////


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章