首页 > 解决方案 > Selenium 和 Instagram:计算传入消息的数量

问题描述

我目前正在学习 Python,我一直在尝试编写一个程序来访问我的 Instagram 个人资料并计算每次运行时传入/未读消息的数量。到目前为止,我可以一直访问我的收件箱,但是我不确定我应该如何从那里开始,定位元素并计算它们。尝试使用 BeautifulSoup4 和标准代码,但有些东西没有坚持。

我已经尝试通过蓝点在 HTML 中定位它们,但这并没有真正的帮助,因为它们都共享同一个 div 类。

<div class=" _41V_T   Sapc9                 Igw0E     IwRSH      eGOV_         _4EzTm                                                                                                              " style="height: 8px; width: 8px;"></div>

new_message = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "_41V_T   Sapc9                 Igw0E     IwRSH      eGOV_         _4EzTm")))

关于我应该如何处理的任何想法?

新消息

@Insula,非常感谢您的反馈。我的代码如下,但返回Unread messages: 0

soup = BeautifulSoup(browser.page_source, features='html.parser')
new_message = soup.find_all("div", {"class":"Igw0E   rBNOH          YBx95   ybXk5    _4EzTm                      soMvl"})
counter = 0
for i in new_message:
    counter +=1
print('Unread messages: ', counter)

HTML 中的类是这样的:

<div class="                     Igw0E   rBNOH          YBx95   ybXk5    _4EzTm                      soMvl                                                                                        "><div class=" _41V_T   Sapc9                 Igw0E     IwRSH      eGOV_         _4EzTm                                                                                                              " style="height: 8px; width: 8px;"></div></div>

编辑

尝试了许多变化,问题仍然存在。但是,在运行以下命令时,它似乎在定位某些东西,但它又是空的。

new_message = soup.find_all(lambda tag: tag.name=="div" and tag.get("class") == "_4EzTm")
if new_message is not None:
print("Found")
else:
print("Failed")

输出:

Found
Process finished with exit code 0

在这一点上,我不确定如何进行

标签: pythonpython-3.xselenium-webdriverinstagram

解决方案


我发现,如果您深入研究检查元素,您会发现小蓝点的代码通知您有新消息:

在此处输入图像描述

如您所见,我没有收到来自底部用户的消息,所以蓝点没有出现。

然后你想找到所有的类并计算它们:

counter = 0

user = soup.find_all("div", {"class":"Igw0E   rBNOH          YBx95   ybXk5    _4EzTm                      soMvl"})
for tag in user:
    counter +=1

print("Unread messages: ",counter)

类名对你来说可能不同,你总能找到我推荐的风格,因为它更准确,像这样:

soup.find_all("div",{"style" : "height: 8px; width: 8px;"})

高度和宽度可能会根据您的浏览器窗口而改变,因此在使用样式定位元素时要考虑到这一点。

编辑:如果它不起作用,您可以尝试以下操作:

  1. 取出柜台和其他东西,只需打印用户并查看它抛出的内容。就像如果有错误或其他东西并尝试调试它。

  2. 添加以下代码行,以便驱动程序等待直到加载元素:

    driver.implicitly_wait(10) #seconds
    
  3. 确保您正在抓取的类是正确且静态的(这意味着它们在每次加载时都不会改变)

  4. 找到页面上的其他一些元素,看看是页面还是你的代码搞砸了。也许尝试只找到一个蓝点(为此取出范围循环),如下所示:

    user = soup.find_all("div", {"class":"Igw0E   rBNOH          YBx95   ybXk5    _4EzTm                      soMvl"})
    print(user)
    
    if user not None:
       print("Found")
    else:
       print("Failed")
    

推荐阅读