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

1.對頁面的解析能力

2.對資料庫的操作能力(mysql)

3.爬取效率

4.代碼量

推薦語言時說明所需類庫或者框架,謝謝。

比如:python+MySQLdb+urllib2+re

ps:其實我不太喜歡用python(可能是在windows平台的原因,需要各種轉字元編碼,而且多線程貌似很雞肋。)


主要看你定義的「爬蟲」幹什麼用。

1、如果是定向爬取幾個頁面,做一些簡單的頁面解析,爬取效率不是核心要求,那麼用什麼語言差異不大。

當然要是頁面結構複雜,正則表達式寫得巨複雜,尤其是用過那些支持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和js天生不是干這個的;python有比較完善的框架,但我沒用過不太清楚;不過nodejs倒是可以拿來談談,因為看知乎的數據就是用node抓的。

估計和我一樣在Windows開發、部署到linux伺服器的人不少。nodejs在這時就有個很突出的優點:部署方便、跨平台幾乎無障礙,相比之下python……簡直讓人脫層皮。

解析頁面用的是cheerio,全兼容jQuery語法,熟悉前端的話用起來爽快之極,再也不用折騰煩人的正則了;

操作資料庫直接用mysql這個module就行,該有的功能全有;

爬取效率么,其實沒有真正做過壓力測試,因為我抓的是知乎,線程稍多一點瓶頸就跑到帶寬上。而且它也不是真多線程而是非同步,最後帶寬全滿(大約幾百線程、10MB/s左右)時,CPU也不過50%左右,這還只是一個linode最低配主機的CPU。況且平時我限制了線程和抓取間隔,簡直不怎麼消耗性能;

最後是代碼,非同步編程最頭疼的是掉進callback地獄,根據自己實際情況寫個多線隊列的話,也不比同步編程麻煩太多就是了。


稍微談談我的使用感受,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的插件,那麼解析路徑一目了然,開發效率奇高。


一點一點做解答吧:

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


小公司用PHP,大公司用C++。

PHP寫的內容抓取程序太多了,網上一大堆。


果斷python,c++也ok


python urllib beautsoup gevent 做過優酷視頻爬取


python有scapy,專門用來做爬蟲的一個框架


核心是:你更熟悉哪個就用哪個!

如果都不熟悉,或者想學一個新的,推薦python。


有過一點Node爬蟲的經驗。

Node的優勢在於HTML解析和非同步IO。如果你用慣了jQuery,那麼可以很方便地在Node中找到替代品,解析網頁時很輕輕鬆的。非同步IO的好處也是明顯的,不用考慮多線程什麼的,不用什麼強大的庫,拿起來就可以用。(當然還是要注意並發的,畢竟爬取頻率會有限制)


用php里的curl抓取手機驗證碼平台里的號碼

利用curl 爬取草liu 頁面,並且自動下載圖片

嗯,我喜歡草榴,python我還在看,個人覺得,python確實很強大,nodejs以後一定會看,

哦,php不支持多線程,所以只能利用伺服器或者擴展來做,mab,我又不會了.........

算了,看會草榴去...


寫爬蟲我用過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左右的數據。


看來上面諸位是沒抓過某些國企開發的網站,那些網站的內容基本都是政府信息,所以無所謂SEO,而且由於防止太容易抓取,都用JS加密了,如果你JS沒學好,搞不定怎麼解密,就必須用selenium,headless chrome這樣的來抓。

這尼瑪內存消耗就大了。


沒人用Java嗎?……


scala,java,爬ebay,一台機器並發量3000/s


我用 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


小功能的,隨便,哪個都行


這幾個語言都試過,但我還是選擇AAUTO,代碼簡潔,功能強大,很方便生成exe分發。


目前來說,我的所有跟web相關的腳本,如刷X,拉淘女郎,拉數據,都是Node.js寫的。

python沒用過不做太多評論,聽說寫爬蟲也不錯。

但是我用Node.js順手呀,效率也很好,跑滿寬頻不是問題。


建議使用Python,多線程的方面會非常爽。

曾經使用Python寫過8大音樂網站的抓取程序,所以可以很篤定的建議你。


推薦閱讀:

28歲轉行,決定入坑IT崗位,短期幾個月先學習哪個方向合適?
為什麼PHP工程師很難招?
php程序中 if(1==$user) 和 if($user ==1) 在效率上有區別嗎?
如何通俗地解釋 CGI、FastCGI、php-fpm 之間的關係?
PHP 面試問哪些問題可以比較準確的反映出應聘者的開發水平?

TAG:JavaScript | Python | PHP | Nodejs |