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