python - 更快下载约500个网页(循环)

3 投票
4 回答
2266 浏览
提问于 2025-04-16 22:42

首先,我是新手,刚开始学Python,所以我下面的代码可能不太规范。我需要下载大约500个网页,网址存储在一个数组里,这个数组是通过之前的一个函数生成的。下载的代码大概是这样的:

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个线程,之后下载时间又开始上升。

4 个回答

2

你可以使用 greenlet 来实现这个功能。

比如说,使用 eventlet 这个库:

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 或其他类似的库来做同样的事情。

3

你可以通过使用线程来大幅提高执行速度(不过要小心,不要让服务器负担过重)。

以下是一些入门材料和代码示例:

4

但是你这里并不是在下载一个文件。你是在下载500个不同的页面,每次连接都需要一些额外的时间和资源(比如建立初始连接),再加上服务器可能还在处理其他人的请求。

无论如何,下载500个20kb的文件和下载一个同样大小的单个文件是完全不同的事情。

撰写回答