2014-07-02 138 views
1

我昨天寫了一個Python網頁抓取工具,並在我的終端上一夜之間運行了它。它只有5萬頁。所以現在我只需要在不同的起點和終點處同時運行一些終端。這工作正常,因爲主要滯後顯然是打開網頁,而不是實際的CPU負載。更優雅的方式來做到這一點?特別是如果它可以在本地完成的話如何運行多線程Python腳本

+1

https://docs.python.org/2/library/multiprocessing.html所有你需要的是 –

+1

Python沒有真正的「線程化」。由於GIL出現在CPython上(我假設你正在使用這個),所以你必須使用多處理模塊。然而,就你而言,'threading'模塊可能是有用的,這取決於你如何抓取這些網站,只是因爲它聽起來像你是I/O綁定。 –

+2

是的,因爲這是I/O綁定的,而不是CPU綁定的,'threading'可能會很好地並行化。你也可以通過['twisted'](https://twistedmatrix.com),['tornado'](http://tornadoweb.org)或['asyncio'](https:// docs.python.org/3/library/asyncio.html)(如果你使用的是Python 3.4)。 – dano

回答

4

你有一個I/O綁定進程,所以爲了加速它,你需要同時發送請求。這不一定需要多個處理器,您只需要避免等待一個請求完成後再發送下一個請求。

這個問題有很多解決方案。看看this blog post或退出gevent,asyncio(backports到3.4之前版本的Python應該可用)或另一個異步IO庫。

但是,在抓取其他網站時,您必須記住:您可以使用併發編程非常快地發送請求,但根據您要抓取的網站,這可能非常粗魯。您可以輕鬆地將一個小型網站完全關閉,從而迫使管理員阻止您。尊重robots.txt,嘗試一次性在多臺服務器之間分配你的努力,而不是把你的整個帶寬集中在一臺服務器上,除非你確信你不需要,否則請謹慎調整你對單臺服務器的請求。