使用 selenium webdriver 以正确的顺序抓取 whatsapp 网络聊天列表

Crawling whatsapp web chat list in in correct order with selenium webdriver

我想获取 whatsapp 网络中的所有聊天 div。我可以通过他们的 class 名称找到他们,如下所示:

chats = driver.find_elements_by_class_name('_210SC')

这会很好,但它只会得到前 20 个东西,并且得到它们看起来像是随机顺序。

例如,chats[0].click() 将让我进行第 1 次聊天,chat[1].click() 将让我进行第 46 次聊天。

如果我在中间滚动并再次执行 driver.find_elements_by_class_name('_210SC'),我将再次获得不同的聊天集,没有特定的顺序。聊天好像是动态生成的。

有没有办法让它们按聊天顺序显示,例如,如果我的第一个聊天是 Mike,第二个是 George,chats[0] 应该是 Mike,chats[1] 应该是 George 等等。这到底是怎么回事?

Whatsapp Web 是一个延迟加载的 React 应用程序。它目前填充了 21 个元素(对我来说,不确定它是否取决于屏幕尺寸?)。 关于元素的顺序,至少现在,好像是top - 最近 - 条目在前,然后是倒序的20个,意思是chat[0] > chat[20] > chat[19] ... chat[1]

我会尝试做以下事情: 获取前 21 个元素,滚动到应该位于 chats[1] 的最后一个元素,再次获取...直到没有新的 div。可能您想跟踪已经获取的聊天记录(评估 //*[@id="pane-side"]//div[@class='_210SC']//div[@class='_3dtfX']//span[@class='_3ko75 _5h6Y_ _3Whw5'] 的 XPath 以获取他们的名字)

我找到了保存完整联系人列表的方法。我敢肯定还有很多其他更好的方法可以做到这一点,但这种方法有效:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time 
from selenium.webdriver.common.keys import Keys 

#go to wpp web + time scan qr
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://web.whatsapp.com/')
time.sleep(15)

#click on search field
search_field = driver.find_element_by_xpath('//div[contains(@class,"copyable-text selectable-text")]')
search_field.click()
time.sleep(3)

#go down to contact list
search_field.send_keys(Keys.ARROW_DOWN)
time.sleep(3)

#appends elements by class + scroll down 
while True:
    contacts = []
    contact_title = driver.find_elements_by_class_name('_3Dr46')
    selected_contact = driver.find_element_by_xpath('//div[@aria-selected="true" and @role="row"]')
    for i in contact_title:
        contacts.append(i.text)
    selected_contact.send_keys(Keys.ARROW_DOWN)
    time.sleep(1)
    selected_contact.send_keys(Keys.ARROW_DOWN)
    time.sleep(1)
    selected_contact.send_keys(Keys.ARROW_DOWN)

我重复了send_keys 20次,因为我没能使用ActionChains (from selenium.webdriver.common.action_chains import ActionChains)因为速度太快来不及加载目标数据

之后,我使用 print(len(contacts))print(contacts),输出是这样的:

16
['num1', 'num2, 'num3','num4'...]
16
['num1', 'num2, 'num4','num5'...]
16
['num2', 'num3, 'num4','num5'...]

直到滚动条结束。我将发布更多更新,现在我必须找到一种方法将所有这些放在一个列表中,其中包含非重复字符串,其值约为 200 个联系人。

希望对您有所帮助,欢迎随时向我们展示更好的方法。