如何使用urllib2在python中下载zip文件?

32

两个问题。我想从互联网档案馆下载多个归档的Cory Doctorow播客。这些旧的播客没有出现在我的iTunes订阅中。我已经编写了脚本,但是下载的文件格式不正确。

问题1- 我该如何更改才能下载zip mp3文件? 问题2- 有什么更好的方法将变量传递到URL中?

 # and the base url.

def dlfile(file_name,file_mode,base_url):
    from urllib2 import Request, urlopen, URLError, HTTPError

    #create the url and the request
    url = base_url + file_name + mid_url + file_name + end_url 
    req = Request(url)

    # Open the url
    try:
        f = urlopen(req)
        print "downloading " + url

        # Open our local file for writing
        local_file = open(file_name, "wb" + file_mode)
        #Write to our local file
        local_file.write(f.read())
        local_file.close()

    #handle errors
    except HTTPError, e:
        print "HTTP Error:",e.code , url
    except URLError, e:
        print "URL Error:",e.reason , url

# Set the range 
var_range = range(150,153)

# Iterate over image ranges
for index in var_range:

    base_url = 'http://www.archive.org/download/Cory_Doctorow_Podcast_'
    mid_url = '/Cory_Doctorow_Podcast_'
    end_url = '_64kb_mp3.zip'
    #create file name based on known pattern
    file_name =  str(index) 
    dlfile(file_name,"wb",base_url

这个脚本是从这里改编的。

2个回答

54

以下是我处理url构建和下载的方法。我确保将文件命名为url的基本名称(在最后一个斜杠后面的最后一部分),并且我还使用with语句来打开要写入的文件。这使用了一个上下文管理器,非常方便,因为当块退出时,会自动关闭该文件。此外,我使用模板构建url的字符串。 urlopen不需要请求对象,只需要一个字符串。

import os
from urllib2 import urlopen, URLError, HTTPError


def dlfile(url):
    # Open the url
    try:
        f = urlopen(url)
        print "downloading " + url

        # Open our local file for writing
        with open(os.path.basename(url), "wb") as local_file:
            local_file.write(f.read())

    #handle errors
    except HTTPError, e:
        print "HTTP Error:", e.code, url
    except URLError, e:
        print "URL Error:", e.reason, url


def main():
    # Iterate over image ranges
    for index in range(150, 151):
        url = ("http://www.archive.org/download/"
               "Cory_Doctorow_Podcast_%d/"
               "Cory_Doctorow_Podcast_%d_64kb_mp3.zip" %
               (index, index))
        dlfile(url)

if __name__ == '__main__':
    main()

只有一个最后的问题,我在哪里可以了解更多关于 URL 中使用的“%d”,我还不太清楚它是如何工作的。 - Justjoe
请查看字符串格式化的文档:http://docs.python.org/library/stdtypes.html#string-formatting - dcolish
这种方法的一个缺点是f.read()会在将文件写入磁盘之前将整个文件存储在内存中,如果文件太大可能会失败。 - Maxime

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接