簡體   English   中英

python - 更快下載~500個網頁(循環)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM