从维基百科下载某些图像会导致意外的 UnidentifiedImageError

问题描述 投票:0回答:2

到目前为止,我一直在使用 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 本身会生成完全正常的图像,并且代码到目前为止一直在运行。

python python-requests python-imaging-library
2个回答
7
投票

您的问题是维基百科希望您的请求中包含用户代理标头。如果您在请求中提供用户代理标头,那么您将按照预期返回图像。

您可以通过查看响应文本来确定问题所在。例如,我复制/粘贴了您的请求并查看了响应的文本。文本显示“错误: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)

0
投票

我可以说,所有 Wiki Commons 网页都不允许下载其图像吗?如何克服这个问题,因为任何人都可以从 Wiki Commons 网页手动下载图像。

© www.soinside.com 2019 - 2024. All rights reserved.