硒缓慢向下滚动

时间:2019-05-07 14:27:59

标签: python selenium web screen-scraping

我正在尝试使用Python在JavaScript呈现的网页上进行动态网页抓取。

1)但是,仅当我缓慢向下滚动页面时才会加载元素。

我尝试过:

driver.execute_script("window.scrollTo(0, Y)") 

(这不起作用,因为它仅滚动到页面上的某个点,错过了其他结果)

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

(这不起作用,因为向下滚动到页面末尾时元素不会加载-需要用户缓慢滚动整个页面)

2)我如何让Selenium等待所有元素加载后再返回给我?

我了解此解决方案存在:

myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'IdOfMyElement')))

但是,如果在用户向下滚动页面时结果不断出现,这将如何工作?一旦发现硒首次出现,此代码是否会使Selenium停止运行?

2 个答案:

答案 0 :(得分:0)

您可以编写一个函数,向下发送箭头键,直到找到该元素为止。最好在通过某种FluentWait(这是一个Java类)完成的循环中,但我也已经在Python中看到了这一点:python fluent wait 我们的目标是保持向下发送箭头键一定的时间,而忽略NoSuchElementException

答案 1 :(得分:0)

这可能对您有帮助

    SCROLL_PAUSE_TIME = 0.5 
    # Get scroll height
    last_height = driver.execute_script("return document.body.scrollHeight")

    while True:
        # Scroll down to bottom
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        # Wait to load page
        time.sleep(SCROLL_PAUSE_TIME)

        # Calculate new scroll height and compare with last scroll height
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height

您可以将此代码与此功能结合起来:

myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'IdOfMyElement')))