使用Python的urllib从URL下载图像,但收到HTTP错误403:禁止访问。
使用Python的urllib从URL下载图像,但收到HTTP错误403:禁止访问。
我想使用Python模块"urllib.request"从URL下载图像文件,对于某些网站(例如mangastream.com)可以正常工作,但对于另一个网站(mangadoom.co)却报错"HTTP Error 403: Forbidden"。后者出现问题的原因是什么,如何解决?
我在OSX上使用Python3.4。
import urllib.request # 无法工作 img_url = 'http://mangadoom.co/wp-content/manga/5170/886/005.png' img_filename = 'my_img.png' urllib.request.urlretrieve(img_url, img_filename)
错误信息末尾显示:
... HTTPError: HTTP Error 403: Forbidden
然而,对于另一个网站是可以正常工作的。
# 可以工作 img_url = 'http://img.mangastream.com/cdn/manga/51/3140/006.png' img_filename = 'my_img.png' urllib.request.urlretrieve(img_url, img_filename)
我尝试了下面帖子中的解决方案,但对于mangadoom.co都不起作用。
[Downloading a picture via urllib and python](https://stackoverflow.com/questions/3042757/downloading-a-picture-via-urllib-and-python)
[How do I copy a remote image in python?](https://stackoverflow.com/questions/1394721/how-do-i-copy-a-remote-image-in-python)
这里的解决方案也不适用于我,因为我的情况是下载图像。
[urllib2.HTTPError: HTTP Error 403: Forbidden](https://stackoverflow.com/questions/13303449/urllib2-httperror-http-error-403-forbidden)
非Python的解决方案也受欢迎。非常感谢您的建议。
问题原因:通过urllib库的urlretrieve()方法下载图片时,如果没有设置User-Agent请求头,可能会导致HTTP Error 403: Forbidden错误。
解决方法:可以使用urllib库的build_opener()方法来构建一个opener,并在opener中设置User-Agent请求头,然后使用urlretrieve()方法进行下载。
以下是解决问题的代码示例:
import urllib.request # 构建opener opener = urllib.request.build_opener() opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')] urllib.request.install_opener(opener) # 设置图片的URL和本地保存路径 url = '图片的URL' local = '本地保存路径' # 下载图片 urllib.request.urlretrieve(url, local)
另外,如果已经通过build_opener()方法构建了opener,也可以使用opener的open()方法来下载图片,示例如下:
import urllib.request # 构建opener opener = urllib.request.build_opener() opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')] urllib.request.install_opener(opener) # 设置图片的URL和本地保存路径 url = '图片的URL' local = '本地保存路径' # 下载图片 response = opener.open(url) with open(local, 'wb') as f: f.write(response.read())
通过构建opener并设置User-Agent请求头,可以解决使用urllib库下载图片时可能出现的HTTP Error 403: Forbidden错误。
该问题的原因是该网站阻止了urllib使用的用户代理,因此需要在请求中更改用户代理。遗憾的是,urlretrieve
不直接支持更改用户代理。
解决方法是使用美丽的requests
库。代码如下(来自这里):
import requests import shutil r = requests.get('http://mangadoom.co/wp-content/manga/5170/886/005.png', stream=True) if r.status_code == 200: with open("img.png", 'wb') as f: r.raw.decode_content = True shutil.copyfileobj(r.raw, f)
请注意,似乎这个网站没有禁止requests
用户代理。但如果需要修改,也很容易:
r = requests.get('http://mangadoom.co/wp-content/manga/5170/886/005.png', stream=True, headers={'User-agent': 'Mozilla/5.0'})
此外,相关的问题:在urllib中更改用户代理。
问题原因:HTTP错误403表示服务器拒绝了请求,即禁止访问该资源。这可能是由于服务器对用户的身份验证进行了限制或者服务器禁止了对该资源的访问。
解决方法:使用Python的urllib库下载图像时遇到HTTP错误403问题,可以尝试以下解决方法:
1. 通过添加用户代理来模拟浏览器访问:
import urllib.request url = 'http://mangadoom.co/wp-content/manga/5170/886/005.png' user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' opener = urllib.request.build_opener() opener.addheaders = [('User-Agent', user_agent)] urllib.request.install_opener(opener) urllib.request.urlretrieve(url, 'out_005.png')
2. 使用requests库进行下载:
import requests url = 'http://mangadoom.co/wp-content/manga/5170/886/005.png' response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}) with open('out_005.png', 'wb') as f: f.write(response.content)
以上两种方法都是通过设置合适的用户代理来绕过HTTP错误403,从而成功下载图像。