libwebp安装成功但PIL打开webp报UnidentifiedImageError如何解决
问题成因
- 请求返回内容异常:目标站点对无UA标识的requests默认请求做了拦截,返回的并非webp图片二进制内容,而是反爬提示页、403错误页等非图片内容,导致Image.open无法识别BytesIO中的内容。
- Python运行环境不一致:执行
python -m PIL检测的Python环境,和实际运行代码的环境(比如IDE绑定的虚拟环境、conda环境等)不是同一个,导致检测结果和实际运行效果不符。 - Pillow的动态链接库绑定异常:底层libwebp已经安装成功,但Pillow安装时没有正确关联到libwebp的动态链接库,所以底层检测显示支持,但Python层面的模块检测返回False,运行时无法调用webp解码能力。
解决方案
- 校验请求有效性,修复请求逻辑
在requests.get中增加UA头避免反爬拦截,同时添加返回状态校验,确保拿到的是正确的图片内容,参考修改后的请求代码:
import requests from io import BytesIO from PIL import Image headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } webp_format = requests.get("https://http2.mlstatic.com/D_NQ_NP_711864-MLB46594538199_072021-O.webp", headers=headers) # 校验请求是否成功,状态码非200会直接抛出异常 webp_format.raise_for_status() # 可选校验文件头,webp文件前4字节为RIFF,确认返回的是图片 assert webp_format.content[:4] == b'RIFF', "返回内容不是webp图片"
- 确认运行环境一致性
在你报错的代码开头加入以下代码,打印当前运行代码的Python解释器路径:
import sys print(sys.executable)
复制输出的完整路径,在终端中执行以下两条命令,确认和你之前的检测结果是否一致:
# 替换<your-python-path>为上一步输出的路径 <your-python-path> -m PIL <your-python-path> -c "from PIL import features; print(features.check_module('webp'))"
如果结果和之前不同,说明是环境不一致问题,将IDE的运行环境切换为你检测过webp支持正常的Python环境即可。
3. 修复Pillow的webp绑定
如果确认是同一环境但检测结果不一致,完全卸载清理现有Pillow后重新安装即可:
pip uninstall -y PIL Pillow pip install --upgrade --force-reinstall Pillow
- 修正原有代码的逻辑错误
原代码中image.convert('RGB')没有接收返回值,转换后的RGB对象没有被后续调用,会导致保存jpg时出现透明通道兼容问题,修改为:
image = Image.open(buffer) # 接收convert返回的新对象 image = image.convert('RGB')
- 路径兼容优化
Windows路径建议使用原始字符串(字符串前加r)避免转义字符问题,比如:
image.save(r'C:\Users\Ze\Documents\Dropshipping\Scraping\Competitor product lists\Selected\test.jpg')
内容的提问来源于stack exchange,提问作者José Guedes
相关产品推荐
相关产品推荐

