使用 urllib2 下载 zip 文件失败
Posted
技术标签:
【中文标题】使用 urllib2 下载 zip 文件失败【英文标题】:download zipfile with urllib2 fails 【发布时间】:2014-01-09 20:49:04 【问题描述】:我正在尝试使用 urllib 下载文件。我正在使用指向此 rar 的直接链接(如果我在此链接上使用 chrome,它将立即开始下载 rar 文件),但是当我运行以下代码时:
file_name = url.split('/')[-1]
u = urllib.urlretrieve(url, file_name)
...我得到的只是一个 22kb 的 rar 文件,这显然是错误的。这里发生了什么?我在带有 python 2.7.5 的 OSX Mavericks 上,here 是网址。
(免责声明:这是免费下载,如乐队的website所示
【问题讨论】:
您是否尝试过查看压缩文件或调用file
?
查看您为此使用的 URL 以进行故障排除会很有帮助。
从 url 获取文件名,urlparse
,posixpath
模块可能会有所帮助。见url2filename()
function。
该网站可能返回与 Web 浏览器不同的内容(无 javascript、无 cookie)。检查下载的文件。它可能是一个带有错误消息的 html 页面。
@ChrisSimpkins 刚刚将 url 添加到我的问题中
【参考方案1】:
知道了。标题缺少很多信息。我求助于使用Requests,对于每个 GET 请求,我都会在标题中添加以下内容:
'Connection': 'keep-alive'
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36'
'Cookie': 'JSESSIONID=36DAD704C8E6A4EF4B13BCAA56217961; ziplocale=en; zippop=2;'
但是,我注意到并非所有这些都是必需的(您只需要 Cookie),但它成功了 - 我能够下载整个文件。如果使用 urllib2 我确信做同样的事情(发送带有适当标头内容的请求)可以解决问题。谢谢大家的好建议,并为我指明了正确的方向。我使用Fiddlr 查看与 chrome 的 GET 标头相比,我的 Requests GET 标头缺少什么。如果你有和我类似的问题,我建议你去看看。
【讨论】:
【参考方案2】:我使用 Python 尝试了此操作,使用以下代码将 urlib
替换为 urllib2
:
url = "http://www29.zippyshare.com/d/12069311/2695/Del%20Paxton-Worst.%20Summer.%20Ever%20EP%20%282013%29.rar"
import urllib2
file_name = url.split('/')[-1]
response = urllib2.urlopen(url)
data = response.read()
with open(file_name, 'wb') as bin_writer:
bin_writer.write(data)
我得到相同的 22k 文件。在该 URL 上使用 wget 进行尝试会产生相同的文件;但是,通过将 URL 粘贴到 Chrome 导航栏中,我能够开始下载完整文件(我记得大约 35MB)。也许他们根据您在请求中发送的标头提供不同的文件?当您单击按钮时,用户代理 GET 请求标头在 Python/wget 中与其服务器(即不像浏览器)看起来不同。
我没有打开 .rar 档案来检查这两个文件。
This thread discusses setting headers with urllib2 和 this is the Python documentation on how to read the response status codes from your urllib2 request 也很有帮助。
【讨论】:
谢谢克里斯,我意识到我被重定向到这个link。我将我的 chrome 用户代理信息复制并粘贴到我的请求标头中,但不断被重定向。我会继续努力的。到目前为止,谢谢。以上是关于使用 urllib2 下载 zip 文件失败的主要内容,如果未能解决你的问题,请参考以下文章