2

test.txt 包含要下载的文件列表:

http://example.com/example/afaf1.tif
http://example.com/example/afaf2.tif
http://example.com/example/afaf3.tif
http://example.com/example/afaf4.tif
http://example.com/example/afaf5.tif

如何使用 python 以最大下载速度下载这些文件?

我的想法如下:

import urllib.request
with open ('test.txt', 'r') as f:
    lines = f.read().splitlines()
    for line in lines:
        response = urllib.request.urlopen(line)

之后呢?如何选择下载目录?

4

2 回答 2

2

选择所需输出目录的路径 ( output_dir)。在您的 for 循环中,将每个 url 拆分为/字符,并使用最后的和平作为文件名。还要打开文件以二进制模式写入,wb因为response.read()返回bytes,而不是str

import os
import urllib.request

output_dir = 'path/to/you/output/dir'

with open ('test.txt', 'r') as f:
    lines = f.read().splitlines()
    for line in lines:
        response = urllib.request.urlopen(line)
        output_file = os.path.join(output_dir, line.split('/')[-1])
        with open(output_file, 'wb') as writer:
            writer.write(response.read())

笔记:

如果您使用多个线程,下载多个文件会更快,因为下载很少使用您的互联网连接的全部带宽。_

此外,如果您正在下载的文件非常大,您可能应该流式读取(逐块读取)。正如@Tiran 评论的那样,您应该使用shutil.copyfileobj(response, writer)而不是writer.write(response.read()).

我只想补充一点,您可能也应该始终指定长度参数:shutil.copyfileobj(response, writer, 5*1024*1024) # (at least 5MB)因为 16kb 的默认值非常小,它只会减慢速度。

于 2013-09-18T08:44:42.537 回答
1

这对我来说很好:(注意名称必须是绝对的,例如'afaf1.tif')

import urllib,os
def download(baseUrl,fileName,layer=0):
    print 'Trying to download file:',fileName
    url = baseUrl+fileName
    name = os.path.join('foldertodwonload',fileName)
    try:
        #Note that folder needs to exist
        urllib.urlretrieve (url,name)
    except:
        # Upon failure to download retries total 5 times
        print 'Download failed'
        print 'Could not download file:',fileName
        if layer > 4:
            return
        else:
            layer+=1
        print 'retrying',str(layer)+'/5'
        download(baseUrl,fileName,layer)
    print fileName+' downloaded'

for fileName in nameList:
    download(url,fileName)

从 try 块中移出不必要的代码

于 2013-09-18T13:19:26.630 回答