等待网页回应,然后使用硒进行抓取

时间:2019-12-20 20:20:14

标签: python jquery selenium selenium-webdriver

我正在尝试使用Python中的硒查询chatbot,以输入查询,然后运行jQuery以获取响应。

假设,它的运行效果很好,聊天机器人的网页加载速度足够快。 如果出于某种原因网页响应缓慢,那么我的脚本会查询响应,然后显示为空白或获取先前的响应。

我如何解决这个问题而不求助于严重的睡眠延迟?目前,该页面最多可能需要5-7秒的时间(两次回复之间),也可能只需要1-2秒。

有没有一种方法可以指示程序在运行jQuery之前等待服务器的响应?

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options

import re
from requests import get

class AIBot:


    def __init__(self):

        # Initialize selenium options
        self.opts = Options()
        self.opts.add_argument("-headless")
        self.browser = webdriver.Firefox(options=self.opts)
        self.url = "http://demo.vhost.pandorabots.com/pandora/talk?botid=b0dafd24ee35a477"


    def get_form(self):

        # Find the form tag to enter your message
        self.browser.implicitly_wait(10.0)
        self.elem = self.browser.find_element_by_name('input')


    def send_input(self, userInput):

        # Submits your message
        fOne = '<\/?[a-z]+>|<DOCTYPE'
        fTwo = '/<[^>]+>/g'
        while True:
            try:
                self.elem.send_keys(userInput + Keys.RETURN)
            except BrokenPipeError:
                continue
            break


    def get_response(self):

        # Retrieves response message
        jFetch = get("http://code.jquery.com/jquery-1.11.3.min.js").content.decode('utf8')
        self.browser.execute_script(jFetch)
        response = self.browser.execute_script("""
                  var main_str = $('font:has(b:contains("Chomsky:"))').contents().has( "br" ).last().text().trim();
                  main_str = main_str.replace(/Chomsky:/gi,'').replace(/Wikipedia is a great online encyclopedia./gi,
                  'Wikipedia is your friend. Use it.').replace(/^\\s*[\\r\\n]/gm, '');
                  return main_str;
                """)
        return response


def mainLoop():

    # Reset variables and connect to AI bot
    humanString = None
    robotString = None
    pb = AIBot()
    pb.browser.get(pb.url)

    while True:
        # User input
        humanString = input("Human says: ")
        pb.get_form()
        if humanString == 'exit':
            break

        # Bot response
        pb.send_input(humanString)
        robotString = pb.get_response()

        print("Robot says: " + robotString)
    pb.browser.close()


if __name__ == '__main__':
    mainLoop()

编辑:

请澄清一下,在此特定情况下,等到元素找到为止并没有帮助,因为此网页只是没有任何有用的元素作为目标,尤其是在漫游器的响应区域中。

也许有一种方法可以检查jQuery运行时响应变量是否与以前相同,并一直等到它发生变化?

0 个答案:

没有答案