不要等待页面在 Python 中使用 Selenium 加载
Don't wait for a page to load using Selenium in Python
如何让 selenium 在页面完全加载之前点击元素并抓取数据?我的互联网连接非常糟糕,因此有时需要很长时间才能完全加载页面,是否有解决此问题的方法?
ChromeDriver 77.0(支持Chrome版本77)现在支持eager
作为 pageLoadStrategy.
Resolved issue 1902: Support eager page load strategy [Pri-2]
当你质疑在这种情况下提及 click on elements and scrape data before the page has fully loaded
时,我们可以借助属性 pageLoadStrategy
。当 Selenium 默认加载 page/url 时,它遵循默认配置 pageLoadStrategy
设置为 normal
。 Selenium可以从不同的Document readiness state
开始执行下一行代码。目前Selenium支持3种不同的Document readiness state
,我们可以通过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")
对于 Chromedriver,它的工作方式与@DebanjanB 的回答相同,但是 'eager' 页面加载策略是 not yet supported
所以对于 chromedriver,你得到:
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"] = "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"))
)
现在您可以在页面完全加载之前开始与元素交互!
与上面使用 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")
如何让 selenium 在页面完全加载之前点击元素并抓取数据?我的互联网连接非常糟糕,因此有时需要很长时间才能完全加载页面,是否有解决此问题的方法?
ChromeDriver 77.0(支持Chrome版本77)现在支持eager
作为 pageLoadStrategy.
Resolved issue 1902: Support eager page load strategy [Pri-2]
当你质疑在这种情况下提及 click on elements and scrape data before the page has fully loaded
时,我们可以借助属性 pageLoadStrategy
。当 Selenium 默认加载 page/url 时,它遵循默认配置 pageLoadStrategy
设置为 normal
。 Selenium可以从不同的Document readiness state
开始执行下一行代码。目前Selenium支持3种不同的Document readiness state
,我们可以通过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")
对于 Chromedriver,它的工作方式与@DebanjanB 的回答相同,但是 'eager' 页面加载策略是 not yet supported
所以对于 chromedriver,你得到:
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"] = "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"))
)
现在您可以在页面完全加载之前开始与元素交互!
与上面使用 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")