Selenium如何实时获取页面重定向后的URL(无需等待页面加载)
实时获取Selenium中浏览器URL变化(无需等待页面加载)
现有代码的问题
你当前的循环是无间隔轮询,会疯狂占用CPU导致运行极慢;而且Selenium默认的页面加载策略是等待页面完全加载完成才会更新current_url,这就导致你没法在页面加载前拿到新URL。
解决方案
1. 修改页面加载策略
先把浏览器的加载策略改成不等待页面完全加载,这样能更早获取到URL变化。支持三种策略:
normal:默认,等待页面完全加载eager:等待DOM加载完成就停止,不用等图片、样式等资源none:完全不等待页面加载,直接执行后续操作
示例代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() # 推荐用eager,平衡速度和可靠性 options.page_load_strategy = 'eager' # 极端场景可以用none,但可能需要自己处理元素等待 # options.page_load_strategy = 'none' driver = webdriver.Chrome(options=options)
2. 高效监听URL变化
方式一:用Selenium内置的等待条件
直接用url_changes等待URL变化,代码简洁且资源占用低:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC initial_url = driver.current_url # 执行你的自动化操作 # SOME AUTOMATION STEPS # 等待URL变化,超时时间可自行调整(这里设10秒) try: WebDriverWait(driver, 10).until(EC.url_changes(initial_url)) new_url = driver.current_url print(new_url) except: print("URL未在指定时间内发生变化") finally: driver.quit()
方式二:注入JavaScript定时监听
适合需要更实时的场景,可自定义检查间隔:
import time # 注入JS监听URL变化 driver.execute_script(""" window.currentTrackedUrl = document.URL; window.urlHasChanged = false; // 每100毫秒检查一次,可根据需求调整 setInterval(() => { if (document.URL !== window.currentTrackedUrl) { window.currentTrackedUrl = document.URL; window.urlHasChanged = true; } }, 100); """) # 执行你的自动化操作 # SOME AUTOMATION STEPS # 循环检查URL变化 while True: changed = driver.execute_script("return window.urlHasChanged;") if changed: new_url = driver.execute_script("return window.currentTrackedUrl;") print(new_url) driver.quit() break # 加短等待减少CPU占用 time.sleep(0.05)
3. 优化原有轮询逻辑
如果你坚持用自己的循环逻辑,一定要加短时间等待,避免无意义的CPU消耗:
import time initial_url = driver.current_url url_change = True # 执行你的自动化操作 # SOME AUTOMATION STEPS while url_change: if driver.current_url != initial_url: url_change = False print(driver.current_url) driver.quit() # 每次循环等待50毫秒,大幅降低CPU占用 time.sleep(0.05)
内容的提问来源于stack exchange,提问作者Trojanhorse
相关产品推荐
相关产品推荐

