如何在Python Jupyter Notebook中提取WhatsApp消息的文本数据
问题修复方案
核心原因
你当前使用的_3j8Pd、_3NWy8等类名是WhatsApp Web前端框架自动生成的动态哈希类名,平台每次版本更新都会随机变动,完全不具备定位稳定性,这是获取数据失败的主要原因。同时你的代码还存在API弃用、变量未初始化、等待逻辑不稳定的问题,修正方案如下:
具体修复步骤
- 替换动态类名定位:使用固定属性做定位,WhatsApp Web的联系人名称会固定存放在
span标签的title属性里,完全不会随版本变动 - 适配Selenium新版API:Selenium 4.0+已废弃
find_elements_by_xx系列方法,统一使用By类定义定位规则 - 替换硬编码休眠:改用显式等待判断元素加载状态,避免网络波动导致的元素未加载报错
- 补全缺失的变量初始化:你当前代码未初始化
mycon变量,首次执行集合运算会直接抛出NameError
修正后参考代码
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 time import time, sleep # 你自己实现的scroll方法保留即可 def scroll(): # 原有滚动逻辑 pass def eta(t): # 原有时间格式化逻辑 return t PATH = "C:\Program Files (x86)\Chromedriver.exe" driver = webdriver.Chrome(PATH) driver.get("https://web.whatsapp.com/") # 显式等待扫码登录,最多等30秒 WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.XPATH, '//div[@contenteditable="true" and @data-tab="3"]')) ) print("Chrome has been automated", eta(time())) print("Web Whatsapp Authentication success", eta(time())) mycon = set() while(True): scroll() # 用title属性定位所有联系人名称 contacts = driver.find_elements(By.XPATH, '//div[@id="pane-side"]//span[@title and not(@title="")]') newcon = set([j.get_attribute("title") for j in contacts]) if len(newcon | mycon) == len(mycon): break else: mycon = newcon | mycon contact = sorted(list(mycon), key=str.casefold) rotate = dict() print(len(contact), "contacts has been retrieved", eta(time()))
特定联系人消息获取方法
如果需要获取指定联系人的消息,先点击对应联系人进入会话页,再用如下规则定位消息:
# 点击指定联系人 target_contact = "你的联系人名称" driver.find_element(By.XPATH, f'//span[@title="{target_contact}"]').click() # 等待消息列表加载 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//div[@role="row"]')) ) # 获取所有消息内容 messages = driver.find_elements(By.XPATH, '//div[@role="row"]//span[contains(@class, "selectable-text")]/span') msg_list = [m.text for m in messages]
内容的提问来源于stack exchange,提问作者M. Rehan Riaz
相关产品推荐
相关产品推荐

