在 Python 中使用 Selenium 停止动态页面中的滚动

Stop the Scroll in Dynamic Page with Selenium in Python

大家好,我正在尝试使用 selenium 和 scrapy 从 https://answers.yahoo.com/dir/index/discover?sid=396545663

中抓取一些信息

我尝试了不同的方法,我使用 Selenium 并将 PhantomJs 设置为驱动程序。 对于向下滚动页面,它是一个无限滚动页面,我使用这个指令:

elem.send_keys(Keys.PAGE_DOWN)

用于模拟按下 Page Down 按钮,而不是 JavaScript 函数:

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

因为这个 "seems" 在页面中加载较少的元素。

主要问题 是我如何知道我何时到达页面底部?是 "Infinite Scroll" 页面,所以我不知道它什么时候结束我需要向下滚动,但我在底部没有任何要分析的元素。

其实我用的是临时循环,但看起来真的很蠢

谢谢

例如,您可以创建一些并行线程 将检查页面是否有 ajax 请求。如果请求之间的时间经常超过 10 秒——你在页面的末尾。没有别的想法。

我实际上会寻找 "Loading..." 指标。 Wait for it 在每个滚动条上都可见,但如果你会得到一个 TimeoutException - 这次没有加载指示器,也没有更多的项目要加载。

实施示例:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)

while True:
    # do the scrolling
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    try:
        wait.until(EC.visibility_of_element_located((By.XPATH, "//*[. = 'Loading...']")))
    except TimeoutException:
        break  # not more posts were loaded - exit the loop

未测试。