使用 python urllib 从 url 下载图像,但收到 HTTP 错误 403:禁止访问
download image from url using python urllib but receiving HTTP Error 403: Forbidden
我想使用 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)
我已经尝试了下面 post 中的解决方案,但其中 none 适用于 mangadoom.co。
Downloading a picture via urllib and python
How do I copy a remote image in python?
这里的解决方案也不适用,因为我的情况是下载图片。
非python解决方案也欢迎。您的建议将不胜感激。
此网站阻止了 urllib 使用的 user-agent,因此您需要在请求中进行更改。不幸的是,我不认为 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
user-agent。但如果需要修改很容易:
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
我在终端中使用 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))
你可以建立一个开场白。这是示例:
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)
对了,下面的代码是一样的:
(none-opener)
req=urllib.request.Request(url,data,hdr)
html=urllib.request.urlopen(req)
(开场白)
html=operate.open(url,data,timeout)
但是,我们在使用时无法添加header:
urllib.request.urlretrieve()
所以在这种情况下,我们必须构建一个开场白。
我想使用 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)
我已经尝试了下面 post 中的解决方案,但其中 none 适用于 mangadoom.co。
Downloading a picture via urllib and python
How do I copy a remote image in python?
这里的解决方案也不适用,因为我的情况是下载图片。
非python解决方案也欢迎。您的建议将不胜感激。
此网站阻止了 urllib 使用的 user-agent,因此您需要在请求中进行更改。不幸的是,我不认为 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
user-agent。但如果需要修改很容易:
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
我在终端中使用 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))
你可以建立一个开场白。这是示例:
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)
对了,下面的代码是一样的:
(none-opener)
req=urllib.request.Request(url,data,hdr)
html=urllib.request.urlopen(req)
(开场白)
html=operate.open(url,data,timeout)
但是,我们在使用时无法添加header:
urllib.request.urlretrieve()
所以在这种情况下,我们必须构建一个开场白。