大都会博物馆收藏的已下载图像为空

时间:2019-03-20 01:50:07

标签: image python-2.7 api download urlrequest

我正尝试使用其API(此处的更多信息:https://metmuseum.github.io/)和Python从Metropolitan Museum收藏夹中下载随机的公共领域图像,很遗憾,我得到的图像为空。这是最少的代码:

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并将其复制/粘贴到浏览器中,则会得到所需的图像,但是代码检索到的图像权重为1ko且无法打开。 知道我在做什么错吗?

1 个答案:

答案 0 :(得分:0)

您的下载方式是正确的,但是,似乎该域正在验证请求标头以防止抓取(可能是意外的,因为它们具有提取图像的API)。

解决此问题的一种方法是将标题更改为现实,或使用fake_useragentrequests

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))
相关问题