使用 python urllib 从 url 下载图像,但收到 HTTP 错误 403: Forbidden

新手上路,请多包涵

我想使用 python 模块“urllib.request”从 url 下载图像文件,它适用于某些网站(例如 mangastream.com),但不适用于另一个(mangadoom.co)接收错误“HTTP 错误 403:禁止访问” .后一种情况可能是什么问题以及如何解决?

我在 OSX 上使用 python3.4。

 import urllib.request

# does not work
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

但是,它适用于另一个网站

# work
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。

通过urllib和python下载图片

如何在 python 中复制远程图像?

这里的解决方案也不适合,因为我的情况是下载图像。 urllib2.HTTPError:HTTP 错误 403:禁止访问

也欢迎非 python 解决方案。您的建议将不胜感激。

原文由 neobot 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

该网站阻止了 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 user-agent。但如果需要修改很容易:

 r = requests.get('http://mangadoom.co/wp-content/manga/5170/886/005.png',
                 stream=True, headers={'User-agent': 'Mozilla/5.0'})

也相关: 更改 urllib 中的用户代理

原文由 Benoit Seguin 发布,翻译遵循 CC BY-SA 3.0 许可协议

你可以建立一个开场白。这是示例:

 import urllib.request

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=''
local=''
urllib.request.urlretrieve(url,local)

顺便说一句,以下代码是相同的:

(非开场白)

 req=urllib.request.Request(url,data,hdr)
html=urllib.request.urlopen(req)

(开瓶器建成)

 html=operate.open(url,data,timeout)

但是,我们在使用时无法添加标头:

 urllib.request.urlretrieve()

所以在这种情况下,我们必须建立一个开场白。

原文由 er.Zhu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进