如何通过Selenium获取WhatsApp Web中以+55开头的联系人列表?
问题分析与解决方案
原代码存在几个关键问题导致无法获取所有目标联系人:
- 固定的XPATH路径
//*[@id="pane-side"]/div[1]/div/div/div[13]/div/div/div/div[3]只能定位到单个特定联系人,而非所有联系人 - 未处理WhatsApp Web的滚动加载机制,仅能获取当前可视区域内的联系人
- 定位联系人名称的元素选择器不准确
以下是修正后的代码:
from selenium import webdriver from selenium.webdriver.common.by import By import time # 初始化Chrome浏览器 driver = webdriver.Chrome() driver.get('https://web.whatsapp.com/') # 等待用户扫码登录,可根据实际情况调整等待时间 time.sleep(30) # 获取联系人侧边栏 pane_side = driver.find_element(By.ID, 'pane-side') last_height = driver.execute_script('return arguments[0].scrollHeight', pane_side) all_contacts = [] while True: # 定位所有联系人名称元素,使用通用的XPATH匹配所有联系人节点 contacts = driver.find_elements(By.XPATH, '//div[@id="pane-side"]//div[@class="_21S-L"]') # 去重添加到列表 for contact in contacts: contact_text = contact.text.strip() if contact_text not in [c.text.strip() for c in all_contacts]: all_contacts.append(contact) # 滚动侧边栏加载更多联系人 driver.execute_script('arguments[0].scrollTop = arguments[0].scrollHeight', pane_side) time.sleep(2) # 检查是否已滚动到底部 new_height = driver.execute_script('return arguments[0].scrollHeight', pane_side) if new_height == last_height: break last_height = new_height # 筛选以+55开头的联系人 filtered_contacts = [contact for contact in all_contacts if contact.text.strip().startswith('+55')] # 输出结果 print(f"找到{len(filtered_contacts)}个以+55开头的联系人:") for contact in filtered_contacts: print(contact.text.strip()) driver.quit()
关键修改说明
- 更换了联系人元素的定位XPATH:
//div[@id="pane-side"]//div[@class="_21S-L"],这个选择器可以匹配所有联系人的名称区域(注意:WhatsApp Web的class可能会更新,若失效可通过浏览器开发者工具重新获取最新class) - 添加了滚动加载逻辑,循环滚动侧边栏直到加载完所有联系人,避免遗漏未显示的联系人
- 增加了联系人去重处理,防止重复抓取同一联系人
- 优化了文本处理,使用
strip()去除多余空格,避免判断出错
内容的提问来源于stack exchange,提问作者Elias Coutinho
相关产品推荐
相关产品推荐

