Python urllib无法下载文件因权限问题,但wget可以
我正在尝试通过一个网址下载一个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)