загрузите изображение с 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))