如何使用Selenium检查是否无法继续向下滚动

7lrncoxx  于 2022-12-04  发布在  其他
关注(0)|答案(4)|浏览(235)

我正在使用 selenium + python报废一个页面,其中有无限滚动(基本上滚动到最大前500个结果显示)
使用下面的代码,我能够滚动到页面的底部。现在我想停止时,进一步滚动不获取任何内容。(说,页面只有200个结果,我不想继续滚动假设最大500个结果)

driver = webdriver.Firefox()
driver.get(url)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

我尝试访问window.pageYOffset,但总是显示为None。

8wtpewkr

8wtpewkr1#

我在Chrome上使用Selenium,而不是Firefox,但以下功能对我有效:
1.在向下滚动之前捕获页面高度;
1.使用向下键向下滚动;
1.在向下滚动之后捕获页面高度;
1.如果滚动前后页面高度相同,则停止滚动
我的代码如下所示:

import time
from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("www.yourTargetURL.com")

reached_page_end = False
last_height = driver.execute_script("return document.body.scrollHeight")

while not reached_page_end:
      driver.find_element_by_xpath('//body').send_keys(Keys.END)   
      time.sleep(2)
      new_height = driver.execute_script("return document.body.scrollHeight")
      if last_height == new_height:
            reached_page_end = True
      else:
            last_height = new_height

driver.quit()
w6mmgewl

w6mmgewl2#

为了以防万一,如果有人正在使用playwright。这个代码片段与ATJ的答案非常相似。

import time
from playwright.sync_api import sync_playwright

def run(playwright):
    page = playwright.chromium.launch(headless=False).new_page()
    page.goto("URL")

    reached_end = False
    last_height = page.evaluate("() => document.body.scrollHeight")  # scrollHeight: 5879

    while not reached_end:
        page.keyboard.press("End")
        time.sleep(2)

        new_height = page.evaluate("() => document.body.scrollHeight")
        if new_height == last_height:
            reached_end = True
        else:
            last_height = new_height

    page.close()

with sync_playwright() as playwright:
    run(playwright)
uajslkp6

uajslkp63#

我们可以在滚动时使用硬计数器,一旦达到最大计数,我们就退出循环。

b=0;
    boolean x = true;
    while (x){
        WebElement button = null;
        try {
          button = driver.findElement(By.xpath("//*[@id='vjs_video_3']/div[7]/div[1]/button[1]"));
          x= false;
        } catch (Exception ex){
            JavascriptExecutor js = (JavascriptExecutor) driver;
            js.executeScript("javascript:window.scrollBy(50, 80)");
            
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } 
            js.executeScript("javascript:window.scrollBy(50, 50)");  
            b++;
            System.out.println("\n"+ b);
            if(b>50) {
                System.out.println("out!");
                break;
            }

// js.执行脚本(“javascript:窗口.滚动(50,180)”);//线程休眠(1000);// js.执行脚本(“javascript:窗口.滚动(50,150)”);//缺少按钮

}
        

    }
}
pgccezyw

pgccezyw4#

您可以在每次滚动尝试之前和之后检查document.body.scrollTop,如果没有要提取的数据,则此值将保持不变

distanceToTop = driver.execute_script("return document.body.scrollTop);")

相关问题