如何在Python中使用urllib2下载zip文件?
这是一个两个部分的问题。我想从互联网档案馆下载多个Cory Doctorow的旧播客,这些播客没有出现在我的iTunes订阅中。我已经写好了脚本,但下载的文件格式不太对。
问题1 - 我该怎么改才能下载zip格式的mp3文件?
问题2 - 有没有更好的方法把变量放进网址里?
# 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 个回答
1
这里有一个比较老的解决方案,跟你想要的差不多:
54
这是我处理网址构建和下载的方法。我确保文件的名字是网址的基本名称,也就是最后一个斜杠后面的部分。同时,我使用了with
语句来打开文件进行写入。这样做的好处是,它会自动关闭文件,当代码块执行完毕后就会关闭,这样就不用担心忘记关闭文件了。此外,我还使用了一个模板来构建网址的字符串。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()