Python:快速下载多个文件



在Python中如何快速下载一堆文件?urllib.urlretrieve()非常慢,我不太确定该怎么做。

我有一个15-20个文件的列表要下载,下载一个都要花很长时间。每个文件大约2-4 mb。

我以前从来没有这样做过,我不确定我应该从哪里开始。我应该使用线程并一次下载几个吗?或者我应该使用线程来下载每个文件的片段,但是一次下载一个文件,或者我甚至应该使用线程?

urllib.urlretrieve()非常慢

真的吗?如果您有15-20个文件,每个文件大小为2-4mb,那么我会将它们排成一行并下载它们。瓶颈将是服务器和您自己的带宽。因此,在这种情况下,几乎不值得线程或尝试任何聪明的方法…

一个解决方案(不是Python特有的)是将下载url保存在另一个文件中,并使用下载管理器程序(如wget或aria2)下载它们。你可以从Python程序中调用下载管理器。

但是正如@Jon提到的,这对你的情况来说并不是必要的。urllib.urlretrieve()就足够了!

另一个选择是使用Mechanize来下载文件

尝试使用python的wget模块。下面是一个代码片段:

import wget
wget.download(url, out = path)

stream.py是基于数据流编程的思想,为并行python(通过线程或进程)设计的有点实验性但很可爱的UI:

  • https://github.com/aht/stream.py/blob/master/example/retrieve_urls.py

因为它很短:

#!/usr/bin/env python
"""
Demonstrate the use of a ThreadPool to simultaneously retrieve web pages.
"""
import urllib2
from stream import ThreadPool
URLs = [
    'http://www.cnn.com/',
    'http://www.bbc.co.uk/',
    'http://www.economist.com/',
    'http://nonexistant.website.at.baddomain/',
    'http://slashdot.org/',
    'http://reddit.com/',
    'http://news.ycombinator.com/',
]
def retrieve(urls, timeout=30):
    for url in urls:
        yield url, urllib2.urlopen(url, timeout=timeout).read()
if __name__ == '__main__':
    retrieved = URLs >> ThreadPool(retrieve, poolsize=4)
    for url, content in retrieved:
        print '%r is %d bytes' % (url, len(content))
    for url, exception in retrieved.failure:
        print '%r failed: %s' % (url, exception)

您只需要将urllib2.urlopen(url, timeout=timeout).read()替换为urlretrieve...

相关内容

  • 没有找到相关文章

最新更新