首页 文章

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

提问于
浏览
8

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

Downloading a picture via urllib and python

How do I copy a remote image in python?

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

非python解决方案也是受欢迎的 . 您的建议将非常感谢 .

3 回答

  • 4

    你可以 Build 一个开场白 . 这是一个例子:

    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)
    

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

    (无开 jar 器)

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

    (揭幕战)

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

    但是,我们使用时无法添加 Headers :

    urllib.request.urlretrieve()
    

    所以在这种情况下,我们必须 Build 一个开场白 .

  • 10

    我尝试wget与终端中的URL,它的工作原理:

    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))
    
  • 16

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

相关问题