如何在Python中使用Selenium滚动到页面底部?

28

我正在尝试滚动到页面末尾,以便我可以使所有数据可见并提取它。我尝试找到一个命令,但在Java中有(driver.executeScript),但在Python中找不到。现在,我正在让电脑按下“End”键一千次:

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”键的效果一样。当页面滚动到底部时,会加载下一页内容。但现在它不再滚动。

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

如何在Python中使用Selenium滚动到页面底部?


1
看看这个是否有帮助:https://dev59.com/v2Ei5IYBdhLWcg3wwecN#27760083 - Subh
不行,因为 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 滚动到已加载页面的底部,与按下 END 键的效果相同。一旦到达页面底部,下一个内容就会加载。但现在它不会滚动。 - psr
这个页面是懒加载内容吗?你向下翻页,它会加载另一部分内容,再向下翻页,重复这个过程吗?还是这个页面只是非常长而已?按CTRL+END应该可以一次跳到页面的末尾。 - JeffC
没有 CTRL + ENDEND 的功能是一样的。 - psr
6个回答

31

好吧,我最终找到了解决办法:

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

它相当慢,有没有可能以某种方式加速它? - Sebastian Nielsen
@SebastianNielsen 可能有点晚了,但尽可能快地调整time.sleep()的时间,但不要太快,以免浏览器或网站认为你是机器人。0.5秒似乎效果不错。 - user3326078
1
@user3326078 这种方法并不是很实用,因为互联网速度可能会有所不同。最低可能的睡眠计时器取决于互联网速度。如果我能找到一种不依赖于睡眠的解决方案,例如等待页面加载完成后再滚动,那就太棒了。 - Sebastian Nielsen
@SebastianNielsen 是的,我同意。希望有一个更强大/动态的解决方案:/ - user3326078
@jww 实际解决方案是 driver.execute_script。每次执行该命令时,页面都会向下滚动。然而,我不明白 OP 如何提到重复执行此脚本不会滚动他的页面。但在他的解决方案中,他确实这样做了,并且对他有效。至于 match=False 部分,那只是一个标志,用于持续执行脚本,直到发现返回的总高度保持不变为止。 - Mugen
显示剩余4条评论

22

通过滚动到 document.body.scrollHeight 即可在一行内完成。

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

2
这在像Facebook这样不断更新DOC高度的页面上是行不通的,当你到达页面底部时。 - Sebastian Nielsen
@SebastianNielsen,你说得有道理。解决方案是使用while循环,在文档高度不再改变时跳出循环。 - Alex

15

这些方法都对我没有用,但以下解决方案有效:

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)

4

0

由于网站没有提供链接,我假定页面上有某种可点击的查看更多/加载更多元素。这是我喜欢的方法,也很简单。

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)

0
#go to a the element that actually scrolls like a tbody
element_in_table = self.driver.find_element(By.XPATH, html_tbody_path)
             
ActionChains(self.driver).move_to_element(element_in_table).perform()
element_in_table.click()
self.driver.execute_script("window.scrollTo(0, 
document.body.scrollHeight);var 
lenOfPage=document.body.scrollHeight;return lenOfPage;")

1
你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接