【问题标题】:download image from url using python urllib but receiving HTTP Error 403: Forbidden使用 python urllib 从 url 下载图像但收到 HTTP 错误 403: Forbidden
【发布时间】:2020-06-22 19:57:05
【问题描述】:

我想使用 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。

Downloading a picture via urllib and python

How do I copy a remote image in python?

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

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

【问题讨论】:

标签: image python-3.x url download urllib


【解决方案1】:

该网站正在阻止 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 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

【讨论】:

    【解决方案2】:

    您可以构建一个开瓶器。示例如下:

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

    所以在这种情况下,我们必须构建一个开瓶器。

    【讨论】:

      【解决方案3】:

      我用终端中的 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))
      

      【讨论】:

        猜你喜欢
        • 2020-12-25
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 2018-08-03
        • 2016-12-23
        • 2018-01-03
        相关资源
        最近更新 更多