You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:23:13