загрузите изображение с url-адреса с помощью python urllib, но получив HTTP-ошибку 403: запрещено

Я хочу загрузить файл изображения с url-адреса с помощью модуля python " urllib.запрос", который работает на каком-то сайте (напр. mangastream.com), но не работать для другой (mangadoom.Колорадо) получать ошибку "Ошибка http 403: запрещено". В чем может быть проблема для последнего случая и как ее исправить?

Я использую python3.4 на OSX.

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 решение также приветствуется. Ваш предложение будет очень оценено.

4 ответов


этот веб-сайт блокирует пользовательский агент, используемый 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 user-agent. Но если нужно изменить, это легко :

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

в этом случае, мы должны построить открывалка.


Я пытаюсь 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))

некоторые сайты требуют, чтобы вы передали учетные данные через url