到目前为止,我一直在使用 PIL 和 requests 库下载某些维基百科图像,没有出现任何问题。在某些时候,某处发生了更改,现在我在尝试下载和加载以下图像时遇到错误:
from PIL import Image
import requests
url_1 = "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/" \
+ "Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg/2728px-Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg"
#url_2 = "https://upload.wikimedia.org/wikipedia/commons/9/9d/The_Scream_by_Edvard_Munch%2C_1893_-_Nasjonalgalleriet.png"
#url_3 = "https://upload.wikimedia.org/wikipedia/en/8/8f/Pablo_Picasso%2C_1909-10%2C_Figure_dans_un_Fauteuil_%28Seated_Nude%" \
# + "2C_Femme_nue_assise%29%2C_oil_on_canvas%2C_92.1_x_73_cm%2C_Tate_Modern%2C_London.jpg"
response = requests.get(url_1, stream=True)
img = Image.open(response.raw)
以及由此产生的错误消息:
---------------------------------------------------------------------------
UnidentifiedImageError Traceback (most recent call last)
<ipython-input-2-9f0ecb1762aa> in <module>()
13
14 response = requests.get(url_1, stream=True)
---> 15 img = Image.open(response.raw)
/usr/local/lib/python3.7/dist-packages/PIL/Image.py in open(fp, mode)
2894 warnings.warn(message)
2895 raise UnidentifiedImageError(
-> 2896 "cannot identify image file %r" % (filename if filename else fp)
2897 )
2898
UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x7f9b71d22bf0>
错误本身并不是很具有描述性,我无法弄清楚如何修复它。任何帮助将不胜感激。 URL 本身会生成完全正常的图像,并且代码到目前为止一直在运行。
您的问题是维基百科希望您的请求中包含用户代理标头。如果您在请求中提供用户代理标头,那么您将按照预期返回图像。
您可以通过查看响应文本来确定问题所在。例如,我复制/粘贴了您的请求并查看了响应的文本。文本显示“错误:403,禁止。请遵守用户代理策略”。这就是我知道你缺少的是用户代理的原因。
对于用户代理,您可能应该提供比我在示例中使用的占位符更具描述性的内容。也许是你的脚本的名称,或者只是“脚本”这个词或类似的东西。
headers = {
'User-Agent': 'My User Agent 1.0'
}
picture_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg/2728px-Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg"
r = requests.get(picture_url, headers=headers, stream=True)
Image.open(r.raw)
我可以说,所有 Wiki Commons 网页都不允许下载其图像吗?如何克服这个问题,因为任何人都可以从 Wiki Commons 网页手动下载图像。