不要等待Python中使用Selenium加载页面

27

我该如何让Selenium在页面完全加载之前点击元素并抓取数据?我的网络连接非常糟糕,有时需要很长时间才能完全加载页面,有没有什么方法可以解决这个问题?


2
请参见:我该如何做X? 在SO上,提问者的期望不仅是研究自己的问题以回答问题,而且还要分享这些研究、代码尝试和结果。这表明您已经花时间尝试帮助自己,它可以避免我们重复显而易见的答案,最重要的是它可以帮助您获得更具体和相关的答案!另请参见:[ask] - JeffC
1
这个回答解决了你的问题吗?如何使Selenium不等待具有缓慢脚本的完整页面加载? - user13094861
3个回答

51

使用进行更新(2024年7月7日)

page_load_strategy

page_load_strategy现在是一个属性。因此,配置page_load_strategySelenium v 4.6及以上版本的最小代码块如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
# options.page_load_strategy = 'none'
options.page_load_strategy = 'eager'
# options.page_load_strategy = 'normal'
driver = webdriver.Chrome(options=options)
driver.get("https://google.com")

ChromeDriver 77.0(支持Chrome版本77)现在支持将eager作为pageLoadStrategy
已解决问题1902:支持急切的页面加载策略[Pri-2]。
根据您的问题提到在页面完全加载之前点击元素和抓取数据,我们可以借助一个属性pageLoadStrategy来解决。当Selenium加载页面/URL时,默认情况下它遵循一个默认配置,其中pageLoadStrategy设置为normal。Selenium可以从不同的文档准备就绪状态开始执行下一行代码。目前,Selenium支持3种不同的文档准备就绪状态,我们可以通过pageLoadStrategy进行配置,如下所示:
  1. none(未定义)
  2. eager(页面变为可交互状态)
  3. normal(完全加载页面)
以下是配置pageLoadStrategy的代码块:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

binary = r'C:\Program Files\Mozilla Firefox\firefox.exe'
caps = DesiredCapabilities().FIREFOX
# caps["pageLoadStrategy"] = "normal"  #  complete
caps["pageLoadStrategy"] = "eager"  #  interactive
# caps["pageLoadStrategy"] = "none"   #  undefined
driver = webdriver.Firefox(capabilities=caps, firefox_binary=binary, executable_path="C:\\Utility\\BrowserDrivers\\geckodriver.exe")
driver.get("https://google.com")

太棒了!可以使用Chrome作为浏览器来实现吗? - no nein
使用DesiredCapabilities,您可以在任何浏览器中实现它,如Chrome,IE,Safari,Edge等。如果答案符合您的问题,请接受答案。 - undetected Selenium
我应该只是在Chrome中添加capabilities=caps吗?还是要使用参数函数? - no nein
是否也可以使用一种策略,完全等待页面加载完成后再执行操作? - no nein
使用急切模式和在超时异常后获取driver.page_source有什么区别? - user2396640

15

更新 2022: 现在Chromedriver支持此行为。请参见@undetected的答案。如果您必须使用“none” pageLoadStrategy(例如,如果您不想等待页面变得可交互),则下面的答案仍然相关。

旧答案:

我们可以使用“none” pageLoadStrategy 并实现自定义等待函数来等待特定元素变得可交互。

在初始化chromedriver时将pageLoadStrategy添加到所需的capabilities中:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities().CHROME
# caps["pageLoadStrategy"] = "normal"  #  Waits for full page load
# caps["pageLoadStrategy"] = "eager"  #  Waits for page to be interactive
caps["pageLoadStrategy"] = "none"   # Do not wait for full page load
driver = webdriver.Chrome(desired_capabilities=caps, executable_path="path/to/chromedriver.exe")

请注意,在使用“none”策略时,您很可能需要实现自己的等待方法来检查所需元素是否已加载。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

WebDriverWait(driver, timeout=10).until(
    ec.visibility_of_element_located((By.ID, "your_element_id"))
)

现在您可以在页面完全加载之前与元素进行交互!


1
它仍然可以工作! - Melisa
1
现在已经支持了。使用 @undetected Selenium 即可。 - Ahmad Asjad

1
针对使用 Chrome 的用户,与上述内容相同。使用大写字母的“EAGER”。效果完美,大大提高了我的工作速度。
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities().CHROME
# caps["pageLoadStrategy"] = "normal"  #  Waits for full page load
caps["pageLoadStrategy"] = "eager"   # Do not wait for full page load
driver = webdriver.Chrome(desired_capabilities=caps, executable_path="path/to/chromedriver.exe")

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