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

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

 

1.對頁面的解析能力
2.對數據庫的操做能力(mysql)
3.爬取效率
4.代碼量
推薦語言時說明所需類庫或者框架,謝謝。
好比:python+MySQLdb+urllib2+re
ps:其實我不太喜歡用python(多是在windows平臺的緣由,須要各類轉字符編碼,並且多線程貌似很雞肋。)
 
按投票排序 按時間排序

35 個回答

 
梁川 ,第三方支付、互聯網金融從業者
主要看你定義的「爬蟲」幹什麼用。

一、若是是定向爬取幾個頁面,作一些簡單的頁面解析, 爬取效率不是核心要求,那麼用什麼語言差別不大。
固然要是頁面結構複雜,正則表達式寫得巨複雜,尤爲是用過那些支持xpath的類庫/爬蟲庫後,就會發現此種方式雖然入門門檻低,但擴展性、可維護性等都奇差。所以此種狀況下仍是推薦採用一些現成的爬蟲庫,諸如xpath、多線程支持仍是必須考慮的因素。

二、若是是定向爬取,且主要目標是解析js動態生成的內容
此時候,頁面內容是有js/ajax動態生成的,用普通的請求頁面->解析的方法就無論用了,須要藉助一個相似firefox、chrome瀏覽器的js引擎來對頁面的js代碼作動態解析。
此種狀況下,推薦考慮casperJS+phantomjs或slimerJS+phantomjs ,固然諸如selenium之類的也能夠考慮。

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

像我搭建的微信公衆號內容聚合的網站 就是基於Scrapy作的,固然還涉及消息隊列等。能夠參考下圖:


具體內容能夠參考 一個任務調度分發服務的架構

收藏 沒有幫助 做者保留權利 php

 
 
 
Saviio ,ES6大法好
星轅翼瑪知乎用戶、知乎用戶 等人贊同
稍微談談個人使用感覺,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的插件,那麼解析路徑一目瞭然,開發效率奇高。

收藏 沒有幫助 html

 
 
蘇莉安 ,Node初學者
PHP和js天生不是幹這個的;python有比較完善的框架,但我沒用過不太清楚;不過nodejs卻是能夠拿來談談,由於 看知乎的數據就是用node抓的。

估計和我同樣在Windows開發、部署到linux服務器的人很多。nodejs在這時就有個很突出的優勢:部署方便、跨平臺幾乎無障礙,相比之下python……簡直讓人脫層皮。
解析頁面用的是cheerio,全兼容jQuery語法,熟悉前端的話用起來爽快之極,不再用折騰煩人的正則了;
操做數據庫直接用mysql這個module就行,該有的功能全有;
爬 取效率麼,其實沒有真正作過壓力測試,由於我抓的是知乎,線程稍多一點瓶頸就跑到帶寬上。並且它也不是真多線程而是異步,最後帶寬全滿(大約幾百線程、 10MB/s左右)時,CPU也不過50%左右,這還只是一個linode最低配主機的CPU。何況平時我限制了線程和抓取間隔,簡直不怎麼消耗性能;
最後是代碼,異步編程最頭疼的是掉進callback地獄,根據本身實際狀況寫個多線隊列的話,也不比同步編程麻煩太多就是了。

收藏 沒有幫助 前端

 
 
xlzd ‖專欄做者,我的博…
Kenneth Ma知乎用戶、知乎用戶 等人贊同
一點一點作解答吧:
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編寫爬蟲的經驗,若是有興趣歡迎圍觀指正。
專欄地址:

收藏 沒有幫助 java

 
 
朱峯 ,python...
code123 贊同
python有scapy,專門用來作爬蟲的一個框架

收藏 沒有幫助 node

 
 
楊捷 ,腳本語言新輪子:
知乎用戶、李友良知乎用戶 等人贊同
我用 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

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

收藏 沒有幫助 做者保留權利 mysql

 
 
 
知乎用戶,高等弱智
 
用php裏的curl抓取手機驗證碼平臺裏的號碼
利用curl 爬取草liu 頁面,而且自動下載圖片
嗯,我喜歡草榴,python我還在看,我的以爲,python確實很強大,nodejs之後必定會看,
哦,php不支持多線程,因此只能利用服務器或者擴展來作,mab,我又不會了.........
算了,看會草榴去...

收藏 沒有幫助 linux

 
 
知乎用戶、arvin丶阿亮JoyMonkey 贊同

收藏 沒有幫助 ios

 
 
知乎用戶,飄逸的程序員/初級製做人
code123npbool 贊同
python

你列的其餘3個,適合的應用場景都不對。

收藏 沒有幫助 c++

 
 
這個殺手不太胖 ,.net,ios,nodejs工程師。身處互聯網。
code123 贊同
果斷python,c++也ok

收藏 沒有幫助

 
 
蝙蝠Neeke ,PHP官方PECL開發組成員
 
python更適宜寫spider

收藏 沒有幫助

 
 
劉老煩 ,你不會由於關注我就懷孕了呢。
耿梓皓徐志雷 贊同
明顯是python。。。
這3個我都用過,差異很是明顯。
python>node.js>php

收藏 沒有幫助

 
 
匿名用戶
Colliot 贊同
scala,java,爬ebay,一臺機器併發量3000/s

收藏 沒有幫助

 
 
李健富 ,CSM/Facilitator/Full Stack Engineer
python中scrapy,很是好用的一個爬蟲框架

收藏 沒有幫助

 
 
Biscuit Linux ,Talk is cheap, show me the code.
Colliot 贊同
沒人用Java嗎?……

收藏 沒有幫助

 
 
知乎用戶
 
go語言,並且有現成的項目

收藏 沒有幫助

 
 
亓京 ,不懂的東西好多啊!!
知乎用戶 贊同
如今寫爬蟲的話應該通常都是用python 的,由於python 用起來太方便啦。並且還有那麼多好用的工具能夠安裝,代碼量很是少,可是功能卻十分強大,通常用python 抓網頁的話,我使用的是
requests 來發送請求獲取數據,用beautiulSoap來分析DOM結構。
個人一個導購網站上面的信息就是用python 抓取的別的網站, 好貨啦

收藏 沒有幫助

 
金鍊大漢 ,互聯網從業者
code123 贊同
python urllib beautsoup gevent 作過優酷視頻爬取

收藏 沒有幫助

 
 
陳某某 ,平心、近氣、修身
 
雖然我沒寫過perl,可是我不少朋友都用這個進行抓取

收藏 沒有幫助

更多

我來回答這個問題

寫回答…

 
相關文章
相關標籤/搜索