如何使用Python的Selenium库获取web.whatsapp.com的全部聊天列表名称?
为什么只能获取前15个聊天名称
web.whatsapp.com的聊天列表采用*虚拟滚动(懒加载)*设计,只有滚动到可视区域内的聊天项才会被渲染到DOM树中,未滚动到的节点不会被加载,因此只能一次性获取到当前可视区域内的少量聊天名称。
完整实现方案
核心逻辑:滚动聊天列表容器,每次滚动后等待新元素加载,提取名称并去重,直到滚动到底部无新元素加载为止。
注意事项
- 代码运行后需要手动扫码完成WhatsApp网页版登录,等待列表加载完成后才会开始执行爬取逻辑
- WhatsApp前端类名会不定期更新,如果出现元素找不到的情况,可以通过F12开发者工具重新定位对应元素的选择器
- 建议使用Selenium 4.x版本,旧版的
find_elements_by_xxx写法已被废弃,新版统一使用find_elements(By.xxx, 选择器)语法
可运行代码示例
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service # 初始化Chrome驱动,替换为你的chromedriver路径 driver = webdriver.Chrome(service=Service("chromedriver.exe")) driver.get('https://web.whatsapp.com/') driver.implicitly_wait(30) # 等待扫码登录完成,可根据自身操作速度调整等待时长 time.sleep(15) # 存储聊天名称,用set自动去重 chat_names = set() # 定位左侧聊天列表的滚动容器 scroll_container = driver.find_element(By.ID, "pane-side") # 记录上一次的滚动高度,判断是否滚动到底部 last_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container) while True: # 提取当前可见的所有聊天名称 name_elements = driver.find_elements(By.XPATH, "//div[@class='_3Dr46']") for ele in name_elements: if ele.text.strip(): chat_names.add(ele.text.strip()) # 滚动到列表底部 driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scroll_container) # 等待新元素加载 time.sleep(1.5) # 计算新的滚动高度 new_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container) # 滚动高度没有变化,说明已经到列表底部,结束循环 if new_height == last_height: # 最后再提取一次底部的元素 name_elements = driver.find_elements(By.XPATH, "//div[@class='_3Dr46']") for ele in name_elements: if ele.text.strip(): chat_names.add(ele.text.strip()) break last_height = new_height # 输出所有聊天名称 print(f"共获取到{len(chat_names)}个聊天名称:") for name in chat_names: print(name) driver.close()
内容的提问来源于stack exchange,提问作者Vedha Vikash
相关产品推荐
相关产品推荐

