目前在寫一個 Python 爬蟲,單線程 urllib 感覺過於慢了,達不到資料量的要求(十萬級頁面)。求問有哪些可以提高爬取效率的方法?
回複內容:
考慮用多進程+分布在不同機房的叢集。
理由如下:
如果單進程,則瓶頸多出在CPU上。
多進程的話可以高效利用CPU。但是其實多數情況是在網路,所以說更好的解決辦法是用多個機房的多台機器同時跑多進程的爬蟲,這樣減少網路阻塞。
實現的話,用scrapy+rq-queue然後用redis來作隊列就好。
用這個方法爬過douban的幾千萬個頁面
請參考我在另一個問題裡的回答:
Python 爬蟲如何入門學習?1.開啟gzip
2.多線程
3.對於定向採集可以用正則取代xpath
4.用pycurl代替urlib
5.換個頻寬高的環境謝邀。
爬蟲下載慢主要原因是阻塞等待發往網站的請求和網站返回
解決的方法是採用非阻塞的epoll模型。
將建立的socket串連控制代碼和回呼函數註冊給作業系統,這樣在單進程和單線程的情況下可以並發大量對頁面的請求。
如果覺得自己寫比較麻煩,我用過現成的類庫:tornado的非同步用戶端
http://www.tornadoweb.org/documentation/httpclient.html
如果你打不開增加host或翻牆
host地址:
74.125.129.121 http://www.tornadoweb.org對Python來說,最好分割任務 + 多進程你可以試試直接使用開源的爬蟲庫scrapy,原生支援多線程,還可以設定抓取速率,並發線程數等等參數;除此之外,scrapy對爬蟲提取HTML內容也有良好的支援。
中文入門教程也已經問世,可以Google一下。gevent,eventlet,pycurl
from multiprocessing.dummy import Pool
openshift上面跑gevent爬1024也就分分鐘的事情……
話說我為什麼只開了20個協程呢【嚴肅臉】
哦對了1024會短時間封IP,用同一個cookie爬就沒事了1.dns cache
2. 多線程
3. 非同步io用 Asynccore 之類手寫。看看 Twisted 有沒有非阻塞、非同步 HTTP client 架構。
用過 multiprocessing 包 + utllib 做 http client 速度相當不理想,線程應該會好但我的直覺是提升有限。
----
推薦 gevent + grequests