Python:快速下载多个文件

时间:2012-12-23 20:33:08

标签: python multithreading python-2.7 download urllib

在Python中如何快速下载一堆文件? urllib.urlretrieve()非常慢,我不太清楚如何解决这个问题。

我有一份15-20个要下载的文件列表,只需要下载一个文件就可以了。每个文件大约2-4 MB。

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

4 个答案:

答案 0 :(得分:1)

  

urllib.urlretrieve()很慢

真的?如果你有15-20个文件,每个文件2-4mb,那么我只需要排队并下载'em。瓶颈将成为您服务器和自己的带宽。所以恕我直言,在这种情况下几乎不值得穿线或尝试任何聪明的东西......

答案 1 :(得分:1)

一种解决方案(不是特定于Python的)是将下载URL保存在另一个文件中,并使用下载管理器程序(例如wgetaria2)下载它们。您可以从Python程序中调用下载管理器。

但正如@Jon所说,这对你的案子来说并不是必需的。 urllib.urlretrieve()就足够了!

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

答案 2 :(得分:0)

stream.py是基于数据流编程思想的并行python(通过线程或进程)的一个实验性但可爱的UI:示例中提供了URL检索器:

因为它很短:

#!/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...

答案 3 :(得分:0)

尝试使用python的wget模块。这是一个代码段。

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