我想使用python模块"urllib.request"从网址下载图像文件,该模块适用于某些网站(例如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解决方案也是受欢迎的.您的建议将非常感谢.
该网站阻止了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中更改用户代理
你可以建立一个开场白.这是一个例子:
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))