You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PIL与requests下载维基百科图片出现UnidentifiedImageError如何解决

问题根因
  • 维基媒体资源站近期新增了请求头校验规则,会拦截requests库默认的User-Agent标识的请求,返回的内容是错误提示页面而非图片二进制数据,因此PIL无法识别出图片格式,抛出UnidentifiedImageError。这也是你之前代码可以正常运行、近期突然报错的核心原因。
  • 你之前使用stream=True模式下直接传入response.raw的写法本身就存在解码异常的概率,进一步增加了加载失败的可能性。
修复方案

替换原有代码为如下版本即可:

from PIL import Image
import requests
from io import BytesIO

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也可正常复用该逻辑
# 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"

# 配置请求头模拟正常浏览器请求,绕过站点校验
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}

response = requests.get(url_1, headers=headers)
# 校验请求是否成功
if response.status_code == 200:
    # 将响应二进制内容用BytesIO包装后传入PIL
    img = Image.open(BytesIO(response.content))
    # 后续可正常操作图片,比如查看尺寸
    print(img.size)
else:
    print(f"请求失败,状态码:{response.status_code}")

如果运行后提示请求失败,状态码为403,直接替换headers里的User-Agent为你自己当前使用的浏览器UA即可。

内容的提问来源于stack exchange,提问作者ProGamerGov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:36:05