2010-01-25 73 views
5

我想在一個站點批量下載網頁。我的'urls.txt'文件中有500萬個網址鏈接。大約300M。如何讓多線程鏈接這些網址並下載這些網頁?或如何批量下載這些網頁?Python,多線程,獲取網頁,下載網頁

我的想法:

with open('urls.txt','r') as f: 
    for el in f: 
     ##fetch these urls 

或扭曲?

有沒有很好的解決方案呢?

+2

你想自己動手編程?你可以用'wget'輕鬆做到這一點。 – notnoop

回答

1

一次下載5M網頁絕對不是一個好主意,因爲你會最大限度地減少很多事情,包括網絡帶寬和操作系統的文件描述符。我會分批進行100-1000次。你可以使用urllib.urlopen來獲取套接字,然後在幾個線程上讀取()。您可能可以使用select.select。如果是這樣,那麼請立即下載全部1000個文件,並將每個選擇返回的文件句柄分配給10個工作線程。如果select不起作用,那麼將您的批次限制爲100次下載,並且每次下載使用一個線程。當然你不應該啓動超過100個線程,因爲你的操作系統可能會爆炸或至少會有點慢。

3

如果這不是一個更大的程序的一部分,那麼notnoop的使用一些現有的工具來完成這個想法是一個很好的。如果一個調用wget的shell循環解決了你的問題,那麼比任何涉及更多定製軟件開發的東西都要容易得多。但是,如果您需要將這些資源作爲較大程序的一部分獲取,那麼使用shell執行操作可能並不理想。在這種情況下,我強烈建議Twisted,這可以使並行執行多個請求變得容易。

幾年前,我寫了一個如何做到這一點的例子。看看http://jcalderone.livejournal.com/24285.html

+0

謝謝:)太棒了! – bell007

1

首先解析您的文件並將網址推入隊列,然後生成5-10個工作線程將網址從隊列中拉出並下載。隊列是你的朋友。

+0

謝謝! 「隊友是你的朋友。」 :) – bell007

0

一個wget的腳本可能是最簡單的,但如果你正在尋找一個蟒蛇絞爬行的解決方案,看看scrapy