Python urllib无法下载文件因权限问题,但wget可以

3 投票
2 回答
1195 浏览
提问于 2025-04-18 02:58

我正在尝试通过一个网址下载一个MP3文件,使用的是Python的 urllib2 库。

mp3file = urllib2.urlopen(url)
output = open(dst,'wb')
output.write(mp3file.read())
output.close()

但是我遇到了一个错误,显示 urllib2.HTTPError: HTTP Error 403: Forbidden。尝试使用 urllib 也失败了,不过没有任何提示。

urllib.urlretrieve(url, dst)

不过,如果我使用 wget,就能顺利下载这个文件。

我注意到在 "Python的urllib.urlretrieve()和wget之间的区别" 中提到了一些两者的主要区别,但在这里似乎不适用。

难道是 wget 在处理权限方面做了些什么,而 urllib2 没有做到?如果是这样,那具体是什么?我该如何在 urllib2 中实现这个功能呢?

2 个回答

0

上面的办法对我没用(我用的是python3.5)。wget用得很好。

这对我来说(我想)不是个大问题——我还是可以用system()来调用wget获取数据,只是需要改改文件名和处理一下数据。

不过如果有其他人也遇到同样的问题,这里是我从上面的代码中得到的错误信息:

Traceback (most recent call last):
  File "./mksynt.py", line 10, in <module>
    class AppURLopener(urllib.FancyURLopener):
AttributeError: module 'urllib' has no attribute 'FancyURLopener'

我看到原来的回答只保证在python2中有效。

1

可能是服务器那边的问题,比如说它不允许使用 Python 的用户代理。你可以试试用 wget 的用户代理:Wget/1.13.4 (linux-gnu)

在 Python 2 中:

import urllib

# Change header for User-Agent
class AppURLopener(urllib.FancyURLopener):
    version = "Wget/1.13.4 (linux-gnu)"
url = "http://www.example.com/test_file"
fname = "test_file"
urllib._urlopener = AppURLopener()
urllib.urlretrieve(url, fname)

撰写回答