当前位置: 首页 > 知识库问答 >
问题:

Python Selenium-调整pause_time以在无限页面中向下滚动

梅宏盛
2023-03-14

我试图刮所有的链接可用在一个无限的页面,向下滚动,并获得新的链接可用。但是,time.sleep()不允许在一次又一次向下滚动之前暂停驱动程序一段合理的时间。

for i in range(1,20):
    time.sleep(i)

下面是我在“如何在Python中使用selenium webdriver滚动web页面”中使用的一个建议中使用的代码:

from selenium import webdriver

scroll_pause_time = 5
scraped_links = []

driver = webdriver.Chrome(executable_path=driver_path)
driver.get(url)
links = driver.find_elements_by_xpath(links_filepath)
for link in links:
    if link not in scraped_links:
        scraped_links.append(link)
        print(link)
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(scroll_pause_time)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height
    links = driver.find_elements_by_xpath(links_filepath)
    for link in links:
        if link not in scraped_links:
            scraped_links.append(link)
            print(link)

在20-30次迭代之后,由于time.sleep()与网页的刷新速度相比太低,代码会中断。

共有1个答案

厉坚
2023-03-14

如果您不想每次猜测加载页面需要多长时间,并随机设置几秒钟的睡眠时间,则可以使用显式等待。示例:

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

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(browser, 10).until(
                                    EC.presence_of_element_located((By.ID, "myDynamicElement"))
                                )
except common.exceptions.TimeoutException:
    print('TimeoutException')
finally:
    driver.quit()

# do what you want after necessary elements are loaded

当time.sleep()与网页刷新速度相比变得太低时,这将解决问题。

 类似资料:
  • 问题内容: 我对Linkedin中技能部分的“加载更多”按钮感到困惑。我 在找到按钮的xpath时收到此错误: 问题是我的元素在页面上不可见,因此我一直试图 找到一种方法来在页面上连续滚动直到按钮可见。 我正在尝试对多个配置文件进行forloop。 我的相关代码: Attempts 1. 随着 页面滚动就在元件的下方,因此该元素不再是可见的,随后发生同样的错误。 我也尝试过move_to_elem

  • 我无法在使用appium的android设备上向下滚动移动页面。我试过驾驶。滚动到(元素),它不会向下滚动到指定的元素。我尝试过使用Actions类,但我遇到了一个错误,因为“方法尚未实现”。我尝试过使用Javascript的另一种方法,但也不起作用。有人提出建议。 以下是代码:

  • 问题内容: 我有一个页面(我们称其为1.php),它使用jQuery-ajax将2.php加载到div- box中。2.php从我的数据库中打印20条记录。当滚动时到达div框的底部时,我希望它加载接下来的20条记录。像Facebook,Twitter等,都是这样做的。 现在,我已经有了这种行为,但是仅当自己加载2.php时!但不在div框中。 我该怎么办? 提前致谢! 问题答案: 文件1.php

  • 我在Selenium 1(又名Selenium RC)中编写了以下代码,用于使用java滚动页面: Selenium 2(WebDriver)中的等效代码是什么?

  • TL;DR:下面三个选项中,哪一个是使用Redis分页最有效的? 我正在实现一个网站,其中包含多个用户生成的帖子,这些帖子保存在关系数据库中,然后以散列的形式复制到Redis,其中包含像站点:{site_id}: post:{post_id}这样的键。 我想对Redis执行简单的分页查询,以便在Pinterest风格的界面中实现延迟加载分页(即用户向下滚动,我们向服务器发送一个Ajax请求,请求下

  • 问题内容: 我已经在Selenium 1(又名Selenium RC)中编写了以下代码,以便使用Java进行页面滚动: Selenium 2(WebDriver)中的等效代码是什么? 问题答案: 对于向下滚动: 或者,您可以执行以下操作: 对于向上滚动: