如何最佳化 Python 爬蟲的速度?

來源:互聯網
上載者:User
目前在寫一個 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

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.