爬蟲效能:NodeJs VS Python

發表於2016-09-03

早就聽說Nodejs的非同步策略是多麼的好,I/O是多麼的牛逼……反正就是各種好。今天我就準備給nodejs和python來做個比較。能體現非同步策略和I/O優勢的專案,我覺得莫過於爬蟲了。那麼就以一個爬蟲專案來一較高下吧。

爬蟲專案

眾籌網-眾籌中專案 http://www.zhongchou.com/brow…,我們就以這個網站為例,我們爬取它所有目前正在眾籌中的專案,獲得每一個專案詳情頁的URL,存入txt檔案中。

實戰比較

python原始版

實驗5次的結果:

python多執行緒版

實驗五次的結果:

這個多執行緒並沒有優勢,經過 #① 的註釋與否發現,這個所謂的多執行緒也是按照單執行緒執行的。

python改進

單執行緒

首先我們把解析html的步驟改進一下,分析發現

更好,因為它是直接找 a ,而不是先找 div 再找 div 下的 a
改進後實驗5次結果如下,可見有進步:

多執行緒

修改 getItems(urllist)getItems(urllist,thno)
函式起止加入 print thno," begin at",time.clock()print thno," end at",time.clock()。結果:

可見這些執行緒是真的沒有併發執行,而是順序執行的,並沒有達到多執行緒的目的。問題在哪裡呢?原來
我的迴圈中

兩行程式碼是緊接著的,所以新的執行緒會等待上一個執行緒執行完畢才會start,修改為

結果:

反思

上面的的多線是併發了,可是比單執行緒執行時間長了太多……我還沒找出來原因,猜想是不是beautifulsoup不支援多執行緒?請各位多多指教。為了驗證這個想法,我準備不用beautifulsoup,直接使用字串查詢。首先還是從單執行緒的修改:

實驗3次,結果:

然後對多執行緒進行修改:

實驗三次的結果:

可見多執行緒確實比單執行緒快好多倍。對於簡單的爬取任務而言,用字串的內建方法比用beautifulsoup解析html快很多。

NodeJs

實驗五次的結果:

可見同樣是用解析html的方法,nodejs速度完虐python。字串查詢呢?

實驗五次的結果:

可見和解析起來的時間是差不多的。

綜上

由我自己瞭解的知識和本實驗而言,我的結論是:python用上多執行緒下載速度能夠比過nodejs,但是解析網頁這種事python沒有nodejs快,畢竟js原生就是為了寫網頁,而且複雜的爬蟲總不能都用字串去找吧。

相關文章