重复两次后,Selenium-chrome driver.get()在循环中中断

时间:2019-05-08 20:34:31

标签: python selenium selenium-chromedriver

我想从不断变化的网页中抓取数据(每两秒钟发送一次新帖子)。我在while循环中调用driver.get(),但是经过几次重复后,我没有得到新的结果。它不断不断地返回相同的帖子。我确定页面正在更改(已在浏览器中选中)

我尝试使用time.wait()和driver.refresh(),但问题仍然存在

    chrome_options = Options()
    chrome_options.add_argument("--headless")
    driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=self.cp.getSeleniumDriverPath())

    while True:
        driver.get(url)
        html = driver.page_source
        soup = BeautifulSoup(html, 'html.parser')
        posts = soup.find_all(some class)

        (...)
        some logic with the result
        (...)

        driver.refresh() #tried interchangably with driver.get() from the beginning of loop

据我所知,driver.get()应该在执行下一行代码之前等待页面加载。也许我在语言方面做错了一些(我对python很陌生)。我是否应该在每次循环运行时重置驱动程序的某些属性?我已经看到在这样的循环中使用driver.get()的解决方案,但是在我的情况下它不起作用。如何强制驱动程序在抓取页面之前完全刷新页面?

2 个答案:

答案 0 :(得分:0)

我猜您的Chrome网络驱动程序正在缓存。尝试添加以下内容: driver.manage().deleteAllCookies() 在获取页面之前。

答案 1 :(得分:0)

如果在尝试向窗口发送命令时页面正在加载,

selenium将出现错误。您应该实现一个time.sleep()或某个selenium specific wait method,以确保可以处理该页面。像

import time

    while True:
        driver.get(url)
        html = driver.page_source
        soup = BeautifulSoup(html, 'html.parser')
        posts = soup.find_all(some class)

        (...)
        some logic with the result
        (...)

        driver.refresh()
        time.sleep(5) # probably too long, but I usually try to stay on the safe side

最好的选择可能是使用

element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
在我上面发布的链接中,

可以确保元素存在,而不会强迫等待5秒。如果您想要的元素在.0001秒内存在,那么您的脚本将在那之后继续。这样一来,您可以将超时设置为任意大(例如120秒),而不会影响执行速度。