如何使用Selenium(Python)获取AJAX请求URL?
当然可以!用Selenium捕获AJAX请求的URL其实有几种靠谱的方法,我给你拆解下最常用的两种,都是Python环境下的实操方案:
方法一:利用Chrome DevTools Protocol(CDP)捕获请求
这是目前最推荐的方式,Selenium 4及以上版本已经原生支持CDP,不用额外安装依赖库。核心思路是通过CDP直接监听浏览器的网络请求事件,在请求发送前就能拿到完整的URL。
实操代码示例
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 初始化Chrome浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) # 启用网络监听 driver.execute_cdp_cmd('Network.enable', {}) # 可选:禁用缓存,避免重复请求被缓存拦截 driver.execute_cdp_cmd('Network.setCacheDisabled', {'cacheDisabled': True}) # 存储捕获到的GET请求URL captured_get_urls = [] # 定义请求捕获的回调函数 def on_request_sent(request_data): # 只筛选GET类型的请求 if request_data['request']['method'] == 'GET': request_url = request_data['request']['url'] captured_get_urls.append(request_url) print(f"捕获到GET请求:{request_url}") # 绑定CDP事件监听 driver.add_cdp_listener('Network.requestWillBeSent', on_request_sent) # 访问目标页面 driver.get("你的目标页面地址") # 等待按钮加载完成,然后点击触发AJAX try: button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), '加载数据')]")) ) button.click() # 等待几秒让AJAX请求完成(也可以监听响应事件来精确判断) WebDriverWait(driver, 10).until( lambda d: len(captured_get_urls) > 0 # 等待至少捕获到一个请求 ) finally: # 清理监听和资源 driver.remove_cdp_listener('Network.requestWillBeSent', on_request_sent) driver.execute_cdp_cmd('Network.disable', {}) driver.quit() # 输出最终结果 print("\n所有捕获到的AJAX GET请求URL:") for idx, url in enumerate(captured_get_urls, 1): print(f"{idx}. {url}")
关键点说明
Network.requestWillBeSent事件会在每个请求发送前触发,能保证我们不会漏掉任何请求- 用
WebDriverWait代替time.sleep更可靠,能根据页面状态动态等待,避免不必要的延迟 - 如果需要区分AJAX请求和普通页面请求,可以根据URL的特征(比如包含
api、ajax关键字)进一步筛选
方法二:使用代理服务器(备选方案)
如果你的Selenium版本较低(低于4.x),或者CDP无法满足需求,可以用代理服务器拦截所有网络请求。比如用mitmproxy或者browsermob-proxy,核心是让浏览器通过代理发送请求,代理会记录所有请求的URL。
不过这种方法需要额外配置代理和证书,步骤相对繁琐,所以更推荐第一种CDP的方式。
内容的提问来源于stack exchange,提问作者Sam McC
相关产品推荐
相关产品推荐

