问题
爬虫抓取网页的时候,遇到有的图片是 base64 编码的格式,要怎样下载到本地呢?
示例:base64 编码的 img
标签
<!-- 内容太长省略一部分 -->
<img src="data:image/png;base64,/9j/4S/+RXhpZgAATU0AKgAAAAgAAAAAA...km7SSkpf/9k=">
解决方案
以上文为例,当我们解析到 src
属性后,可以做如下处理:
>>> import base64
>>>
>>> # src 属性
>>> src
'data:image/png;base64,/9j/4S/+RXhpZgAATU0AKgAAAAgAAAAAA...km7SSkpf/9k='
>>>
>>> # 提取内容部分
>>> info, b64_data = src.split('base64,', 1)
>>>
>>> # 提取文件格式
>>> fmt = info.split('image/')[-1].replace(';', '')
>>>
>>> # 解码内容
>>> binary_data = base64.urlsafe_b64decode(b64_data)
>>>
>>> # 保存到文件
>>> with open('this_image_was_from_base64.' + fmt, 'wb') as f:
... f.write(binary_data)
扩展
标准库中的 base64 模块也提供了
urlsafe_b64encode
方法,可以将文件类型的对象编码为 base64,不过对于专注于爬虫业务的工作者基本可以无视-
Data URL 由
data:
前缀、MIME 类型(表明数据类型)、base64 标志位(如果是文本,则可选)以及数据本身四部分组成,如:data:[<mediatype>][;base64],data
其中,mediatype 是一个MIME(Multipurpose Internet Mail Extension)类型字符串,如
image/jpeg
表示一个 JPEG 图片文件。如果省略,默认值为text/plain;charset=US-ASCII
,了解它的构成对于解析很有帮助