使用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
相关产品推荐
相关产品推荐

