声明:此文章涉及的代码非原创,是基于https://www.cnblogs.com/JaxYoun/p/13457610.html博客园的python解析base64格式的二维码(笨办法,不推荐)这篇文章做的改进。
在最近爬取某个需要登录认证的网站时,会在登录后还需要二维码扫码认证,二维码是在账号密码正确的情况下点击登录返回的,返回的是二维码经过base64编码后的数据,考虑到使用selenium效率较低,如果每次爬取的时候都使用浏览器手动登录扫码识别后抓cookie比较麻烦,所有就想到将登录后返回的base64编码的图片直接输出在控制台,每次开始爬取的时候,只需要扫码二维码认证,大大提高效率。
如果将base64编码的图片直接保存再打开图片扫码,但是电脑每次都会用系统的软件打开图片,每次都特别慢,所以我的思路是将base64编码的图片二维码内容识别出来,再通过qrcode库将二维码直接显示在控制台,如下图结果:
于是在网上搜索python识别base64编码二维码内容如何实现,但找了几天都没有相关方案和代码,使用chatgpt回答给的代码也是各种报错,经过几天的搜索才找到博客园写的相关的文章,但该文章思路是将图片保存到本地后再打开图片进行识别,使用的代码会涉及磁盘IO,影响性能,所以针对此代码做了优化。
原代码
import base64
import pyzbar.pyzbar as pyzbar
from PIL import Image, ImageEnhance
base64Str = "这里放base64编码后的图片数据,不要前面的data:image/png;base64,"
# 1.解码Base64字符串
imgdata = base64.b64decode(base64Str)
# 2.将解析结果以文件形式写入本地磁盘
with open('2.png', 'wb') as f:
f.write(imgdata)
# 3.打开上一步写道本地磁盘的文件
img = Image.open("./2.png")
img = ImageEnhance.Brightness(img).enhance(2.0) # 增加亮度
img = ImageEnhance.Contrast(img).enhance(4.0) # 增加对比度
# img = ImageEnhance.Sharpness(img).enhance(17.0)# 锐利化
# img = img.convert('L') # 灰度化
# img.show() #测试用
# 4.调用pyzbar解析二维码
barcodes = pyzbar.decode(img)
# 5.打印二维码解析结果
print(barcodes[0].data.decode("utf-8"))
优化后的代码
import base64
import pyzbar.pyzbar as pyzbar
from PIL import Image
import io
base64Str = "这里放base64编码后的图片数据,不要前面的data:image/png;base64,"
# 1.解码Base64字符串
imgdata = base64.b64decode(base64Str)
# 2.创建一个BytesIO对象并加载图像数据
stream = io.BytesIO(imgdata)
# 3.打开图像并创建PIL图像对象
img = Image.open(stream)
# 4.调用pyzbar解析二维码
barcodes = pyzbar.decode(img)
# 5.获取并打印二维码解析结果
qr_str = barcodes[0].data.decode("utf-8")
第一次写博文,如有写得不对的地方,欢迎大家进行指正。