PHP, Python, Node.js 哪個比較適合寫爬蟲?

來源:互聯網
上載者:User
1.對頁面的解析能力
2.對資料庫的操作能力(mysql)
3.爬取效率
4.代碼量
推薦語言時說明所需類庫或者架構,謝謝。
比如:python+MySQLdb+urllib2+re
ps:其實我不太喜歡用python(可能是在windows平台的原因,需要各種轉字元編碼,而且多線程貌似很雞肋。)

回複內容:

主要看你定義的“爬蟲”幹什麼用。

1、如果是定向爬取幾個頁面,做一些簡單的頁面解析, 爬取效率不是核心要求,那麼用什麼語言差異不大。
當然要是頁面結構複雜,Regex寫得巨複雜,尤其是用過那些支援xpath的類庫/爬蟲庫後,就會發現此種方式雖然入門門檻低,但擴充性、可維護性等都奇差。因此此種情況下還是推薦採用一些現成的爬蟲庫,諸如xpath、多線程支援還是必須考慮的因素。

2、如果是定向爬取,且主要目標是解析js動態產生的內容
此時候,頁面內容是有js/ajax動態產生的,用普通的請求頁面->解析的方法就不管用了,需要藉助一個類似firefox、chrome瀏覽器的js引擎來對頁面的js代碼做動態解析。
此種情況下,推薦考慮casperJS+phantomjs或slimerJS+phantomjs ,當然諸如selenium之類的也可以考慮。

3、如果爬蟲是涉及大規模網站爬取,效率、擴充性、可維護性等是必須考慮的因素時候
大規模爬蟲爬取涉及諸多問題:多線程並發、I/O機制、分布式爬取、訊息通訊、判重機制、任務調度等等,此時候語言和所用架構的選取就具有極大意義了。
PHP對多線程、非同步支援較差,不建議採用。
NodeJS:對一些垂直網站爬取倒可以,但由於分布式爬取、訊息通訊等支援較弱,根據自己情況判斷。
Python:強烈建議,對以上問題都有較好支援。尤其是Scrapy架構值得作為第一選擇。優點諸多:支援xpath;基於twisted,效能不錯;有較好的調試工具;
此種情況下,如果還需要做js動態內容的解析,casperjs就不適合了,只有基於諸如chrome V8引擎之類自己做js引擎。
至於C、C++雖然效能不錯,但不推薦,尤其是考慮到成本等諸多因素;對於大部分公司還是建議基於一些開源的架構來做,不要自己發明輪子,做一個簡單的爬蟲容易,但要做一個完備的爬蟲挺難的。

像我搭建的公眾號內容彙總的網站http://lewuxian.com 就是基於Scrapy做的,當然還涉及訊息佇列等。可以參考:


具體內容可以參考 一個任務調度分發服務的架構 稍微談談我的使用感受,PHP不會,用過Python和Node.js。

簡單的定向爬取:
Python + urlib2 + RegExp + bs4
或者
Node.js + co,任一一款dom架構或者html parser + Request + RegExp 擼起來也是很順手。
對我來說上面兩個選擇差不多是等價的,但主要我JS比較熟,現在選擇Node平台會多一些。

上規模的整站爬取:
Python + Scrapy
如果說上面兩個方案裡DIY 的 spider是小米加步槍,那Scrapy簡直就是重工加農炮,好用到不行,自訂爬取規則,http錯誤處理,XPath,RPC,Pipeline機制等等等。而且,由於Scrapy是基於Twisted實現的,所以同時兼顧有非常好的效率,相對來說唯一的缺點就是安裝比較麻煩,依賴也比較多,我還算是比較新的osx,一樣沒辦法直接pip install scrapy

另外如果在spider中引入xpath的話,再在chrome上安裝xpath的外掛程式,那麼解析路徑一目瞭然,開發效率奇高。PHP和js天生不是幹這個的;python有比較完善的架構,但我沒用過不太清楚;不過nodejs倒是可以拿來談談,因為看知乎 的資料就是用node抓的。

估計和我一樣在Windows開發、部署到linux伺服器的人不少。nodejs在這時就有個很突出的優點:部署方便、跨平台幾乎無障礙,相比之下python……簡直讓人脫層皮。
解析頁面用的是cheerio,全相容jQuery文法,熟悉前端的話用起來爽快之極,再也不用折騰煩人的正則了;
操作資料庫直接用mysql這個module就行,該有的功能全有;
爬取效率麼,其實沒有真正做過壓力測試,因為我抓的是知乎,線程稍多一點瓶頸就跑到頻寬上。而且它也不是真多線程而是非同步,最後頻寬全滿(大約幾百線程、10MB/s左右)時,CPU也不過50%左右,這還只是一個linode最低配主機的CPU。況且平時我限制了線程和抓取間隔,簡直不怎麼消耗效能;
最後是代碼,非同步編程最頭疼的是掉進callback地獄,根據自己實際情況寫個多線隊列的話,也不比同步編程麻煩太多就是了。一點一點做解答吧:
1.對頁面的解析能力
關於這一條,基本上就是靠特定語言的第三方包來完成網頁的解析。如果要從零開始自己實現一個HTML解析器,難度和時間上的阻礙都是很大的。而對於複雜的基於大量Javascript運算產生的網頁或者請求,則可以通過調度瀏覽器環境來完成。這一條上,Python是絕對勝任的。

2.對資料庫的操作能力(mysql)
對資料庫的操作能力上,Python有官方及第三方的串連庫。另外,對於爬蟲抓取的資料,儲存在NoSQL型資料庫個人認為更加合適。

3.爬取效率
確實指令碼語言的運算速度不高,但是相對於特定網站反爬蟲機制強度以及網路IO的速度,這幾門語言的速度詫異都可以忽略不計,而在於開發人員的水平。如果利用好發送網路請求的等待時間處理另外的事情(多線程、多進程或者協程),那麼各語言效率上是不成問題的。

4.代碼量
這一點上Python是佔有優勢的,眾所周知Python代碼簡潔著稱,只要開發人員水平到位,Python代碼可以像虛擬碼一樣簡潔易懂,且代碼量較低。

推薦語言時說明所需類庫或者架構,謝謝。
比如:python+MySQLdb+urllib2+re
Python: requests + MongoDB + BeautifulSoup

ps:其實我不太喜歡用python(可能是在windows平台的原因,需要各種轉字元編碼,而且多線程貌似很雞肋。)
由於GIL的存在,Python的多線程確實沒有利用到多核的優勢,對此你可以使用多進程解決。但是對於爬蟲,更多的時間在於網路IO的等待上,所以直接使用協程即可很好地提升抓取速度。


另外,最近在我的專欄總結一些Python編寫爬蟲的經驗,如果有興趣歡迎圍觀指正。
專欄地址:http://zhuanlan.zhihu.com/xlz-d用Python來抓取和提取HTML中有用的內容,因為這方面的庫確實很方便,beautifulsoup和requests。

用Node來寫入資料庫,非同步方式無需等待同步IO的完成,也不需要涉及多線程的鎖問題。如今Node5.x已經支援ES6,可以用promise來解決多重嵌套的回呼函數的問題。

至於用php做資料抓取和分析,還是算了吧。我用 PHP Node.js Python 寫過抓取指令碼,簡單談一下吧。

首先PHP。先說優勢:網上抓取和解析html的架構一抓一大把,各種工具直接拿來用就行了,比較省心。缺點:首先速度/效率很成問題,有一次下載電影海報的時候,由於是crontab定期執行,也沒做最佳化,開的php進程太多,直接把記憶體撐爆了。然後文法方面也很拖遝,各種關鍵字 符號 太多,不夠簡潔,給人一種沒有認真設計過的感覺,寫起來很麻煩。

Node.js。優點是效率、效率還是效率,由於網路是非同步,所以基本如同幾百個進程並發一樣強大,記憶體和CPU佔用非常小,如果沒有對抓取來的資料進行複雜的運算加工,那麼系統的瓶頸基本就在頻寬和寫入MySQL等資料庫的I/O速度。當然,優點的反面也是缺點,非同步網路代表你需要callback,這時候如果業務需求是線性了,比如必須等待上一個頁面抓取完成後,拿到資料,才能進行下一個頁面的抓取,甚至多層的依賴關係,那就會出現可怕的多層callback!基本這時候,代碼結構和邏輯就會一團亂麻。當然可以用Step等流程式控制制工具解決這些問題。

最後說Python。如果你對效率沒有極端的要求,那麼推薦用Python!首先,Python的文法很簡潔,同樣的語句,可以少敲很多次鍵盤。然後,Python非常適合做資料的處理,比如函數參數的打包解包,列表解析,矩陣處理,非常方便。

自己最近也在弄一個Python的資料抓取處理工具包,還在修改完善中,歡迎star:yangjiePro/cutout - GitHub python有scapy,專門用來做爬蟲的一個架構用php裡的curl抓取手機驗證碼平台裡的號碼
利用curl 爬取草liu 頁面,並且自動下載圖片
嗯,我喜歡草榴,python我還在看,個人覺得,python確實很強大,nodejs以後一定會看,
哦,php不支援多線程,所以只能利用伺服器或者擴充來做,mab,我又不會了.........
算了,看會草榴去...建議使用Python,多線程的方面會非常爽。
曾經使用Python寫過8大音樂網站的抓取程式,所以可以很篤定的建議你。寫爬蟲我用過PHP、Python,JS寫爬蟲還沒見過,Node.js不瞭解。
PHP寫爬蟲還好,我寫過一個,用PHP Command Line下運行。用Curl_multi 50線程並發,一天能抓大概60萬頁,依網速而定,我是用的校園網所以比較快,資料是用正則提取出來的。
Curl是比較成熟的一個lib,異常處理、http header、POST之類都做得很好,重要的是PHP下操作MySQL進行入庫操作比較省心。
不過在多線程Curl(Curl_multi)方面,對於初學者會比較麻煩,特別是PHP官方文檔在Curl_multi這方面的介紹也極為模糊。

Python寫爬蟲一個最大的好處是比較傻瓜,Requests之類的lib功能上和Curl相當,但是如果只是做簡單的爬蟲,易用性比較好,而且有 Beautiful Soup這樣的傻瓜lib,確實是非常適合用來做爬蟲。
不過編碼可能的確是個令初學者頭疼的問題,我覺得PHP可能還更好一點,事實上如果不是團隊要求,我自己做著玩的爬蟲,我都是用PHP寫的。

JavaScript我覺得像一個在虛擬機器裡的虛擬機器,拋開 效能不談。
  1. 它首先是在一個沙箱裡跑的,對於操作資料庫或者本地檔案,會比較麻煩,沒有原生介面,我因為沒用過這個做爬蟲,也沒去研究過有什麼其他方案。
  2. 對於DOM樹的解析,除了效率比較低下記憶體佔用也比較大
  3. 跨域的話,雖然在Chrome下可以通過 --disable-web-security來禁用,不過也是一件麻煩事。
  4. 總之JS要寫爬蟲,麻煩事是一大堆。
我是沒見過有人拿這個寫爬蟲的。

Node.js 我是真的沒有用過。

1.對頁面的解析能力基本沒區別,大家都支援正則,不過Python有些傻瓜拓展,用起來會方便很多;
2.對資料庫的操作能力的話,PHP對MySQL有原生支援,Python需要添加MySQLdb之類的lib,不過也不算麻煩;
3.爬取效率的話,都支援多線程,效率我倒是沒感覺有什麼區別,基本上瓶頸只在網路上了。不過嚴謹的測試我沒做過,畢竟我沒有用多種語言實現同一種功能的習慣,不過我倒是感覺PHP好像還要快一些?
4.代碼量的話,爬蟲這種簡單的東西基本沒什麼區別,幾十行的事,如果加上異常處理也就百來行,或者麻煩點異常的Mark下來,等下重爬等等的處理,也就幾百行,大家都沒什麼區別。
不過Python如果不把lib算進去的話顯然是最少的。
說到效能的話,爬蟲和效能基本不搭邊,是不用考慮的事情。在我開爬蟲的時候,將近30Mbps的爬取效率下,用PHP Command Line做的爬蟲,CPU佔用也不過3-5%,記憶體消耗大概15-20MiB(Core 2 Duo P8700——有些曆史的老U了,爬蟲是50線程,每個線程含10個正則提取、1個JSON解析、2個資料庫Insert操作 (百萬層級資料的IF NOT EXIST )、40個左右的各種異常判斷)—— 瓶頸應該只有網路
在你沒G口的情況下,不用管什麼效能,隨便挑一個都一樣,自己熟悉的就好。
我開爬蟲那幾天,大概爬了270GiB左右的資料。我開爬蟲那幾天,大概爬了270GiB左右的資料。
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.