You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:48:04