我该如何让Selenium在页面完全加载之前点击元素并抓取数据?我的网络连接非常糟糕,有时需要很长时间才能完全加载页面,有没有什么方法可以解决这个问题?
我该如何让Selenium在页面完全加载之前点击元素并抓取数据?我的网络连接非常糟糕,有时需要很长时间才能完全加载页面,有没有什么方法可以解决这个问题?
page_load_strategy现在是一个属性。因此,配置page_load_strategy与Selenium 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")
eager
作为pageLoadStrategy。pageLoadStrategy
来解决。当Selenium加载页面/URL时,默认情况下它遵循一个默认配置,其中pageLoadStrategy
设置为normal
。Selenium可以从不同的文档准备就绪状态开始执行下一行代码。目前,Selenium支持3种不同的文档准备就绪状态,我们可以通过pageLoadStrategy
进行配置,如下所示:
none
(未定义)eager
(页面变为可交互状态)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")
DesiredCapabilities
,您可以在任何浏览器中实现它,如Chrome,IE,Safari,Edge等。如果答案符合您的问题,请接受答案。 - undetected Selenium更新 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"))
)
现在您可以在页面完全加载之前与元素进行交互!
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")