硒能很快得到一种元素

2024-06-01 01:06:17 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我正在为whatsapp手工制作一个python机器人,没有API或类似的东西,因为我不知道。因此,我使用Selenium接收消息并自动回复。目前,我注意到每隔几条消息,就有一条消息无法接收,因为循环运行得太慢,而我的计算机已经相当快了。代码如下:

def incoming_msges():
    msges = driver.find_elements_by_class_name("message-in")
    msgq = []
    tq = []
    try:
        for msg in msges:
            txt_msg = msg.find_elements_by_class_name("copyable-text")
            time = msg.find_elements_by_class_name("_18lLQ")
            for t in time:
                tq.append(t.text.lower())
            for txt in txt_msg:
                msgq.append(txt.text.lower())
        msgq = msgq[-1]
        tq = tq[-1]
        if len(msgq) > 0:
            return (msgq, tq)
    except StaleElementReferenceException:
        pass

    return False

以前,我没有添加时间检查功能,发送的消息将被保存,循环将持续运行,这样即使另一方再次发送相同的消息,代码也不会将其识别为新消息,因为它认为它与以前的消息相同。所以现在的问题是,我的代码非常耗时,我不知道如何加快速度。我试着这样做:

def incoming_msges():
    msges = browser.find_elements_by_class_name("message-in")
    
    try:
        msg = msges[-1]
        txt_msg = msg.find_element_by_xpath("/span[@class=\"copyable-text\"]").text.lower()
        time = msg.find_element_by_xpath("/span[@class=\"_18lLQ\"]").text.lower()
        return (txt_msg, time)
    except Exception:
        pass

    return False

但是,像这样,代码就是找不到任何消息。根据whatsapp网站,我已经获得了正确的元素类型和类,但它就是不运行。当我的第一个代码块仍然正确时,重写它的正确方法是什么?提前谢谢


Tags: 代码textnameintxt消息bytime
1条回答
网友
1楼 · 发布于 2024-06-01 01:06:17

第一件事首先

我绝对推荐使用API。。。因为你要做的是重新发明轮子。API具有告诉您状态是否发生更改的功能,您可以将这些更改排队。。。所以我绝对推荐使用API。。。一开始可能很难,但相信我,这是值得的

接下来,我建议您使用普通变量名msges{}{}(这些代码有点不可读,我读了两遍代码后仍然没有得到它们应该是什么…)

但是对于你的速度问题。。。“try-catch(又名除此之外)”块对性能的影响非常大。。。如果可能的话,我建议使用安全编程(20条if语句可能更快,但可能不是同一时间)。。。另外,我认为您不太了解python语言(至少从我在这里看到的情况来看)

msgq = msgq[-1]   # you are telling it to take the last element and change array variable to string .. to be more specific...
msgq ([1,2,3,4]) = msgq[-1] (4) will result to -> msgq = 4 (which in my option hits you performance as well)
tq = tq[-1]    # same here

这样更好:)

if len(msgq[-1]) > 0:
   return (msgq[-1], tq[-1])

如果我正确理解了你的代码,你是在试图抓取消息,但是如果你说你想制作自动回复机器人,我建议你准备一些JS魔术或切换工具。我个人注意到硒有一个动态内容的问题。。。更具体地说。。。一旦它在文件末尾,它就不会再刮它了。。。因此,如果您不想每5-10秒自动刷新一次以获取最新的HTML文件,我建议您使用JS创建这个bot(每次元素更改时都会触发),或者使用API和selenium仅用于响应。我被告知Selenium是为了模拟普通用户来检查用户界面是否正常工作(如果按钮存在,网站是否包含所有应该包含的内容等等)。。。我认为硒是用于这项工作的,就像用于汽车清洁的花小海绵。。。你能做到的。。。但是这会花费你很多时间,你可能会错过一些地方(比如你错过了那些信息)

最后。。。一般来说,使用字符串的工作非常昂贵。您正在try块中执行O(n^2)个操作。。。我可以想象这会非常昂贵。。。如果可能的话,我会减少内部for循环的数量

我希望你在这个项目中好运,我希望你找到你想要的答案,同时我希望我的答案至少有一点帮助

相关问题 更多 >