Загруженные изображения из коллекции Метрополитен-музея пусты - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь загрузить случайные изображения из общественного достояния из коллекции Метрополитен-музея, используя их API (подробнее здесь: https://metmuseum.github.io/) и Python, к сожалению, полученные мной изображения пусты. Вот минимальный код:

import urllib
from urllib2 import urlopen
import json
from random import randint

url = "https://collectionapi.metmuseum.org/public/collection/v1/objects"
objectID_list = json.loads(urlopen(url).read())['objectIDs']
objectID = objectID_list[randint(0,len(objectID_list)-1)]
url_request = url+"/"+str(objectID)
fetched_data = json.loads(urlopen(url_request).read())
if fetched_data['isPublicDomain']:
    name = str(fetched_data['title'])
    ID = str(fetched_data['objectID'])
    url_image = str(fetched_data['primaryImage'])
    urllib.urlretrieve(url_image, 'path/'+name+'_'+ID+'.jpg') 

Если я распечатываю url_image и копирую / вставляю его в браузер, я получаю требуемое изображение, но код извлекает изображение, которое весит 1 раз и не может быть открыто. Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 20 марта 2019

Ваш способ загрузки корректен, однако, похоже, что домен проверяет заголовки запросов для предотвращения очистки (возможно, непреднамеренного, поскольку у них есть API для извлечения изображений).

Один из способов решения этой проблемы -изменив заголовки на что-то реалистичное или используя fake_useragent и requests.

import requests
from fake_useragent import UserAgent

def save_image(link, file_path):
    ua = UserAgent(verify_ssl=False)
    headers = {"User-Agent": ua.random}
    r = requests.get(link, stream=True, headers=headers)
    if r.status_code == 200:
        with open(file_path, 'wb') as f:
            f.write(r.content)
    else:
        raise Exception("Error code {}.".format(r.status_code))
...