[英]python - faster downloading of ~500 webpages (loop)
對於初學者我是python的新手,所以下面的代碼可能不是最干凈的。 對於一個程序,我需要下載大約500個網頁。 url存儲在一個由前一個函數填充的數組中。 下載部分是這樣的:
def downloadpages(num):
import urllib
for i in range(0,numPlanets):
urllib.urlretrieve(downloadlist[i], 'webpages/'+names[i]'.htm')
每個文件只有大約20KB,但下載所有文件至少需要10分鍾。 下載總組合大小的單個文件應該只需要一兩分鍾。 有沒有辦法加快速度呢? 謝謝
編輯:對於有興趣的人,請按照http://code.google.com/p/workerpool/wiki/MassDownloader上的示例並使用50個帖子,下載時間從最初的10分鍾減少到大約20秒。 隨着線程增加直到大約60個線程,下載速度繼續降低,之后下載時間再次開始上升。
但是你沒有在這里下載單個文件。 您正在下載500個單獨的頁面,每個連接都涉及開銷(用於初始連接),以及服務器正在執行的任何其他操作(是否為其他人服務?)。
無論哪種方式,下載500 x 20kb與下載該大小的單個文件不同。
您可以通過使用線程顯着加快執行速度(但要小心,不要使服務器過載)。
介紹材料/代碼示例:
您可以使用greenlet來執行此操作。
EG與eventlet lib:
urls = [url1, url2, ...]
import eventlet
from eventlet.green import urllib2
def fetch(url):
return urllib2.urlopen(url).read()
pool = eventlet.GreenPool()
for body in pool.imap(fetch, urls):
print "got body", len(body)
池中的所有調用都是偽模擬的。
當然,您必須先安裝帶有pip或easy_install的eventlet。
您在Python中有幾個greenlet實現。 您可以使用gevent或其他方法執行相同的操作。
除了使用某種並發性之外,請確保使用任何方法來使請求使用HTTP 1.1連接持久性。 這將允許每個線程只打開一個連接並請求所有頁面,而不是為每個請求設置TCP / IP設置/拆卸。 不確定urllib2默認是否這樣做; 你可能不得不自己動手。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.