如何在 Python 中使用 selenium 滚动到页面末尾?

Posted

技术标签:

【中文标题】如何在 Python 中使用 selenium 滚动到页面末尾?【英文标题】:How to scroll to the end of the page using selenium in Python? 【发布时间】:2015-11-30 05:07:33 【问题描述】:

我正在尝试滚动到页面末尾,以便使所有数据可见并提取它。我试图为它找到一个命令,但它在 java (driver.executeScript) 中可用,但在 python 中找不到。现在我正在让计算机按下结束键一千次:

while i<1000:
    scroll = driver.find_element_by_tag_name('body').send_keys(Keys.END)
    i+=1

我也尝试了driver.execute_script("window.scrollTo(0, document.body.scrollHeight);"),但它会滚动到加载页面的末尾,与 END 键的作用相同。到达页面底部后,将加载下一个内容。但现在它不再滚动了。

我知道会有一个非常好的替代方案。

【问题讨论】:

看看这是否有帮助:http://***.com/a/27760083/4193730 How can I scroll a web page using selenium webdriver in python?的可能重复 不,这不起作用,因为driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 滚动到加载页面的末尾,END 键的作用相同。到达页面底部后,将加载下一个内容。但现在它不滚动了。 该页面是否延迟加载内容?您是否向下翻页,它会加载另一块内容,向下翻页,重复?或者它只是一个很长的页面? CTRL+END 应该一次性跳到页面的最后。 No CTRL + END 和 END 做同样的事情 【参考方案1】:

好吧,我终于想出了一个解决方案:

lenOfPage = driver.execute_script("window.scrollTo(0, document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return lenOfPage;")
    match=False
        while(match==False):
                lastCount = lenOfPage
                time.sleep(3)
                lenOfPage = driver.execute_script("window.scrollTo(0, document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return lenOfPage;")
                if lastCount==lenOfPage:
                    match=True

【讨论】:

虽然很慢,难道不能以某种方式加快速度吗? @SebastianNielsen 可能晚了,但只要调整 time.sleep() 尽可能快,但不要太快,让浏览器或网站认为你是机器人。 0.5 秒似乎效果不错。 @user3326078 不太实用,因为可能会改变互联网速度。最低可能的睡眠定时器取决于互联网速度。如果我能找到一个不依赖睡眠的解决方案,那就太棒了,等待页面加载然后再次滚动。 @SebastianNielsen 是的,我同意希望有一个更强大/动态的解决方案:/ 我刚刚有了一个想法。如果滚动到页面底部并等待 DOM 的高度增加怎么办?我们知道,当它更新时,它一定意味着网站已经加载了更多内容,因此我们不再处于底部 - 这将被循环直到网站在我们到达底部时需要超过 x 秒的时间来增加高度。 【参考方案2】:

这可以通过滚动到document.body.scrollHeight一行来完成

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

【讨论】:

这不适用于 Facebook 等页面,当您到达页面底部时会不断更新 DOC 的高度。 公平点@SebastianNielsen,解决方案是使用while循环并在文档高度停止变化时中断【参考方案3】:

您可以使用scrollingElementscrollTopscrollHeight 滚动到页面末尾。

driver.execute_script("var scrollingElement = (document.scrollingElement || document.body);scrollingElement.scrollTop = scrollingElement.scrollHeight;")

参考资料:

    Scroll Automatically to the Bottom of the Page Document.scrollingElement - Web APIs | MDN Element.scrollHeight - Web APIs | MDN Element.scrollTop - Web APIs | MDN

【讨论】:

【参考方案4】:

这些都不适合我,但下面的解决方案可以:

driver.get("https://www.youtube.com/user/teachingmensfashion/videos")


def scroll_to_bottom(driver):

    old_position = 0
    new_position = None

    while new_position != old_position:
        # Get old scroll position
        old_position = driver.execute_script(
                ("return (window.pageYOffset !== undefined) ?"
                 " window.pageYOffset : (document.documentElement ||"
                 " document.body.parentNode || document.body);"))
        # Sleep and Scroll
        time.sleep(1)
        driver.execute_script((
                "var scrollingElement = (document.scrollingElement ||"
                " document.body);scrollingElement.scrollTop ="
                " scrollingElement.scrollHeight;"))
        # Get new position
        new_position = driver.execute_script(
                ("return (window.pageYOffset !== undefined) ?"
                 " window.pageYOffset : (document.documentElement ||"
                 " document.body.parentNode || document.body);"))

scroll_to_bottom(driver)

【讨论】:

【参考方案5】:

由于没有为网站提供链接,我将假设页面上存在某种查看更多/加载更多可点击元素。这是我喜欢的,而且非常简单。

count=10000
while count>1:
   try:
       button=driver.find_element_by_xpath('//*[@id="load_more"]')
       button.click()
       count-=1
       time.sleep(2)
   except StaleElementReferenceException:
       button=driver.find_element_by_xpath('//*[@id="load_more"]')
       button.click()
       time.sleep(2)

【讨论】:

以上是关于如何在 Python 中使用 selenium 滚动到页面末尾?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中使用 selenium 下载 pdf 文件

如何在 Python 中使用 Selenium 在 Firefox 中禁用 Flash?

如何使用Selenium和Python在网站内的页面中导航?

如何使用 Selenium 和 Python 在控制台中跳过调试日志

如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]

如何使用 Selenium 和 Python 在 Python 类中调用方法