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

使用PIL打开维基百科图片时出现Unidentified Image错误的排查与解决

问题描述

尝试使用PIL打开维基百科的狗狗图片(地址:https://upload.wikimedia.org/wikipedia/commons/3/36/Dog_.jpg),使用的代码如下:

from PIL import Image
import requests
from io import BytesIO

url = "https://upload.wikimedia.org/wikipedia/commons/3/36/Dog_.jpg"
response = requests.get(url)
im = Image.open(requests.get(url, stream=True).raw)

请问该错误的成因是什么,是否有可行的解决办法?

错误成因
  • 请求被服务器拦截:维基媒体的服务器会校验请求的User-Agent标识,requests库默认的标识会被判定为非浏览器的自动化请求,直接返回403禁止访问,导致无法获取图片资源。
  • 冗余代码无意义:代码中重复调用了两次requests.get(url),第一次的response变量未被使用,属于无效代码,但这不是导致失败的核心原因。
解决办法

方案1:添加模拟浏览器的请求头

给请求加上浏览器的User-Agent,让服务器识别为正常访问:

from PIL import Image
import requests

url = "https://upload.wikimedia.org/wikipedia/commons/3/36/Dog_.jpg"
# 模拟Chrome浏览器的请求头,可根据实际情况调整
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
# 发起带请求头的流式请求
response = requests.get(url, headers=headers, stream=True)
# 先校验请求是否成功
if response.status_code == 200:
    im = Image.open(response.raw)
    # 可调用show()查看图片
    im.show()
else:
    print(f"请求失败,状态码:{response.status_code}")

方案2:用BytesIO处理响应内容

如果不需要流式传输,也可以将响应内容存入BytesIO后再打开:

from PIL import Image
import requests
from io import BytesIO

url = "https://upload.wikimedia.org/wikipedia/commons/3/36/Dog_.jpg"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
    im = Image.open(BytesIO(response.content))
    im.show()
else:
    print(f"请求失败,状态码:{response.status_code}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:27:17