使用Python读取网页QR code:操作WhatsApp Web时cv2等库报错如何解决
网页二维码读取功能修复方案
错误原因说明
- 第一个版本错误点:
cv2.QRCodeDetector初始化不需要传入参数,且该类的解码方法只接受图片格式的输入(如OpenCV读取后的numpy数组),直接传入Selenium的driver对象属于参数类型完全不匹配,所以触发系统级错误。 - 第二个版本错误点:
qrcode库的QRCode类是用于生成二维码的工具,本身不具备二维码解析功能,属于调用了错误的依赖库。
正确实现思路
- 用Selenium定位到页面上的二维码元素
- 对二维码元素单独截图,得到原始图片数据
- 将图片数据转成OpenCV可处理的格式,再调用二维码检测解码接口获取内容
依赖安装
运行前先安装所需依赖:
pip install selenium opencv-python pillow webdriver-manager
可运行完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.firefox import GeckoDriverManager import cv2 import numpy as np from PIL import Image import io # 初始化火狐浏览器 driver = webdriver.Firefox(executable_path=GeckoDriverManager().install()) driver.get("https://web.whatsapp.com/") try: # 最多等待10秒,直到二维码canvas元素加载完成 qr_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "canvas")) ) # 对二维码元素截图,得到bytes格式的图片数据 qr_png = qr_element.screenshot_as_png # 将bytes转成PIL Image,再转成OpenCV可用的numpy数组 img = Image.open(io.BytesIO(qr_png)) img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) # 初始化二维码检测器,解码内容 detector = cv2.QRCodeDetector() data, bbox, straight_qrcode = detector.detectAndDecode(img_cv) if data: print(f"读取到的二维码内容为:{data}") else: print("未检测到有效二维码,请检查页面加载状态") finally: # 操作完成后关闭浏览器 driver.quit()
注意事项
- 运行时需要保证网络正常,WhatsApp Web页面能正常加载出二维码
- 如果页面二维码刷新频率过高,可适当调整等待时间,或者检测到内容为空时重新截图解析
- 如果要适配其他网站的二维码,只需要修改元素定位规则,把
By.TAG_NAME, "canvas"换成对应网站二维码元素的定位参数即可
内容的提问来源于stack exchange,提问作者pratham chauhan
相关产品推荐
相关产品推荐

