使用python urllib从url下载图像,但接收HTTP错误403:禁止

2024-05-23 19:21:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我在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上工作

Downloading a picture via urllib and python

How do I copy a remote image in python?

这里的解决方案也不适合,因为我的情况是下载图像。 urllib2.HTTPError: HTTP Error 403: Forbidden

也欢迎使用非python解决方案。非常感谢你的建议。


Tags: 模块comhttpurlimgpng网站request
3条回答

此网站正在阻止urllib使用的用户代理,因此您需要在请求中更改它。不幸的是,我不认为urlretrieve直接支持这一点。

我建议使用漂亮的requests库,代码变成(从here):

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'})

同样相关:changing user-agent in urllib

你可以做一个开场白。下面是一个例子:

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()

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

我在终端中使用url尝试wget,它可以工作:

wget -O out_005.png  http://mangadoom.co/wp-content/manga/5170/886/005.png

所以我的方法是使用下面的脚本,它也能工作。

import os
out_image = 'out_005.png'
url = 'http://mangadoom.co/wp-content/manga/5170/886/005.png'
os.system("wget -O {0} {1}".format(out_image, url))

相关问题 更多 >