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

