我正尝试使用其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且无法打开。 知道我在做什么错吗?
答案 0 :(得分:0)
您的下载方式是正确的,但是,似乎该域正在验证请求标头以防止抓取(可能是意外的,因为它们具有提取图像的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))