下载图像后 urllib.retrieve 和 urllib2.urlopen 从不 returns
urllib.retrieve and urllib2.urlopen never returns after downloading the image
我遇到了一个奇怪的问题,每当我尝试使用 urllib.retrieve 下载图像时,它永远不会 returns 返回,并且终端一直忙于等待响应,而响应永远不会返回。
代码
resp = urllib2.urlopen("http://charlesngo.com/wp-content/uploads/2015/11/rat-race-full-res-1030x728.jpg")
服务器拒绝您的请求,因为它通过检查请求中的用户代理 header 检测到您正在从 Python 脚本中获取图像。您可以添加不同的用户代理 header 来覆盖默认值并模拟来自浏览器的请求。
>>> import urllib2
>>> url = "http://charlesngo.com/wp-content/uploads/2015/11/rat-race-full-res-1030x728.jpg"
>>> req = urllib2.Request(url)
>>> resp = urllib2.urlopen(req)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/urllib2.py", line 127, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib64/python2.7/urllib2.py", line 410, in open
response = meth(req, response)
File "/usr/lib64/python2.7/urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib64/python2.7/urllib2.py", line 448, in error
return self._call_chain(*args)
File "/usr/lib64/python2.7/urllib2.py", line 382, in _call_chain
result = func(*args)
File "/usr/lib64/python2.7/urllib2.py", line 531, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
>>> req = urllib2.Request(url)
>>> req.add_header('user-agent', "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11")
>>> resp = urllib2.urlopen(req)
>>> resp.read()[:10]
'\xff\xd8\xff\xe0\x00\x10JFIF'
有关设置用户代理的更多信息,请参阅 this question。
值得注意的是,服务器管理员试图阻止脚本下载是有原因的——例如带宽成本——所以你应该考虑绕过他们的阻止机制是否是一个可以接受的行为,特别是如果你要运行经常下载。
我遇到了一个奇怪的问题,每当我尝试使用 urllib.retrieve 下载图像时,它永远不会 returns 返回,并且终端一直忙于等待响应,而响应永远不会返回。
代码
resp = urllib2.urlopen("http://charlesngo.com/wp-content/uploads/2015/11/rat-race-full-res-1030x728.jpg")
服务器拒绝您的请求,因为它通过检查请求中的用户代理 header 检测到您正在从 Python 脚本中获取图像。您可以添加不同的用户代理 header 来覆盖默认值并模拟来自浏览器的请求。
>>> import urllib2
>>> url = "http://charlesngo.com/wp-content/uploads/2015/11/rat-race-full-res-1030x728.jpg"
>>> req = urllib2.Request(url)
>>> resp = urllib2.urlopen(req)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/urllib2.py", line 127, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib64/python2.7/urllib2.py", line 410, in open
response = meth(req, response)
File "/usr/lib64/python2.7/urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib64/python2.7/urllib2.py", line 448, in error
return self._call_chain(*args)
File "/usr/lib64/python2.7/urllib2.py", line 382, in _call_chain
result = func(*args)
File "/usr/lib64/python2.7/urllib2.py", line 531, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
>>> req = urllib2.Request(url)
>>> req.add_header('user-agent', "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11")
>>> resp = urllib2.urlopen(req)
>>> resp.read()[:10]
'\xff\xd8\xff\xe0\x00\x10JFIF'
有关设置用户代理的更多信息,请参阅 this question。
值得注意的是,服务器管理员试图阻止脚本下载是有原因的——例如带宽成本——所以你应该考虑绕过他们的阻止机制是否是一个可以接受的行为,特别是如果你要运行经常下载。