python - 更快下载约500个网页(循环)
首先,我是新手,刚开始学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的文件和下载一个同样大小的单个文件是完全不同的事情。