Python如何从互联网加载图像文件?PIL调用Image.open打开URL报错咨询
网络图片加载失败原因
PIL 自带的 Image.open() 仅支持读取本地文件路径或类文件对象,无法直接识别 HTTP/HTTPS 协议的网络链接。你传入网络URL时,方法底层会默认把URL当作本地磁盘路径去读取,自然就会报路径无效的OSError。
可行的实现方案
方案1:requests+BytesIO实现(推荐,兼容性最强)
首先安装依赖(如已安装requests可跳过):
pip install requests
代码示例:
from PIL import Image import requests from io import BytesIO img_url = "https://i.etsystatic.com/8331303/r/il/dec4ed/2753449716/il_300x300.2753449716_i5j3.jpg" # 请求图片内容 resp = requests.get(img_url) # 校验请求是否正常,状态码非200会直接抛出异常 resp.raise_for_status() # 把二进制内容转为类文件对象传给Image.open img = Image.open(BytesIO(resp.content)) # 后续可以正常操作图片 # img.show() # 展示图片 # img.save("local_img.jpg") # 保存到本地
如果遇到网站反爬拦截,可以给get方法添加请求头,示例:
resp = requests.get(img_url, headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" })
方案2:用标准库urllib实现(无需额外安装第三方包)
不想装requests可以用Python内置的urllib库实现:
from PIL import Image from io import BytesIO from urllib.request import urlopen img_url = "https://i.etsystatic.com/8331303/r/il/dec4ed/2753449716/il_300x300.2753449716_i5j3.jpg" with urlopen(img_url) as resp: img = Image.open(BytesIO(resp.read()))
内容的提问来源于stack exchange,提问作者JH LEE
相关产品推荐
相关产品推荐

