网页中base64图片主要藏在img标签的src属性(以data:image/xxx;base64,开头),也常见于css的background-image:url()内;需用不区分大小写的正则提取,注意动态渲染内容须用selenium或playwright获取,静态页可用beautifulsoup+requests;解码前应清理空白、补全padding并捕获异常;扩展名应从mime类型自动映射,文件名建议用哈希避免重复,批量处理时需限流防oom。

怎么识别网页里藏Base64图片的
标签
网页中Base64图片通常出现在 img 标签的 src 属性里,值以 data:image/xxx;base64, 开头。直接用正则或BeautifulSoup提取时,别只匹配 base64, —— 有些会缺空格或大小写混用(比如 DATA:IMAGE/JPEG;BASE64,),建议用不区分大小写的正则:r'data:image/[^;]+;base64,([^"]+)'。
常见坑:JavaScript动态插入的图片不会出现在原始HTML里,requests.get() 拿不到;得用Playwright或Selenium抓渲染后页面。但多数静态页用 BeautifulSoup + requests 就够了。
如何安全解码并校验Base64字符串
不是所有看起来像Base64的字符串都能直接 base64.b64decode() —— 可能含空格、换行、URL-safe字符(- 和 _),也可能长度不对(Base64长度必须是4的倍数)。
- 先用
re.sub(r'\s+', '', b64_str)去掉空白符 - 补等号:如果长度模4不为0,用
b64_str += '=' * (4 - len(b64_str) % 4) - 捕获
binascii.Error异常,跳过无效编码,避免程序中断
保存图片时如何自动推断文件扩展名
Base64头部的 image/xxx 部分就是MIME类型,比如 image/png → 扩展名 .png,image/jpeg → .jpg。别硬写死 .png,否则JPEG会被当PNG打开失败。
实操建议:
- 从
data:image/png;base64,...中提取png部分,映射到扩展名:{'png': 'png', 'jpeg': 'jpg', 'gif': 'gif', 'webp': 'webp'} - 遇到未知类型(如
image/bmp),默认用.bin并加日志告警 - 文件名建议用哈希(如
hashlib.md5(b64_str.encode()).hexdigest()[:8])避免重复,别直接用序号
批量处理时要注意磁盘和内存压力
一个大网页可能含几十个Base64图片,每个几MB,全解码进内存再写文件容易OOM。别一次性 base64.b64decode() 所有数据。
更稳的做法:
- 逐个处理:提取→解码→保存→清空变量(
del decoded_data) - 写入用
open(..., 'wb')直接二进制写,别用字符串拼接 - 加简单限流:每处理5张
time.sleep(0.1),防瞬时IO打满
真正麻烦的是嵌套在CSS background-image: url(data:image/...) 里的Base64,这种得额外用正则扫 <style></style> 和 style="" 属性——很多人漏掉这点,结果只抓到一半图片。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











