使用Selenium点击按钮后如何抓取触发的Ajax HTTP请求URL
使用Selenium获取点击触发的请求URL
Selenium 4及以上版本原生支持Chrome DevTools Protocol(CDP),可以直接监听浏览器的所有网络请求,不需要依赖第三方工具,实现步骤如下:
- 在执行按钮点击操作前,先开启Network域监听,注册请求捕获回调
- 执行按钮点击操作,等待所有关联请求发送完成
- 按特征过滤捕获到的请求列表,拿到目标URL
Python示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() # 启用网络监听 driver.execute_cdp_cmd("Network.enable", {}) captured_urls = [] # 注册回调,捕获所有发送的请求URL def log_request(params): captured_urls.append(params["request"]["url"]) driver.add_cdp_listener("Network.requestWillBeSent", log_request) # 打开目标页面、点击按钮 driver.get("你的目标页面地址") download_btn = driver.find_element(By.ID, "替换为你的按钮元素ID") download_btn.click() # 等待请求加载完成,可根据实际场景调整等待时间或加条件判断 time.sleep(3) # 按特征过滤目标请求,比如匹配URL中的固定关键字、请求方法等 target_download_url = [url for url in captured_urls if "download" in url][0] print("获取到的下载URL:", target_download_url) driver.quit()
如果是Selenium 3及更低版本,可以搭配BrowserMob Proxy代理工具实现网络请求捕获,不过该工具目前维护更新较少,更推荐升级到Selenium 4使用原生CDP能力。
其他可实现该需求的工具推荐
- Playwright:微软推出的浏览器自动化工具,原生集成网络请求拦截能力,API设计更简洁,不需要额外配置CDP,适合做自动下载场景的自动化流程。示例代码如下:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() captured_urls = [] # 监听所有请求 page.on("request", lambda req: captured_urls.append(req.url)) page.goto("你的目标页面地址") page.get_by_role("button", name="下载").click() # 等待目标请求加载完成 page.wait_for_timeout(2000) target_url = [u for u in captured_urls if "download" in u][0] print(target_url) browser.close()
- mitmproxy:开源中间人代理工具,可通过Python脚本自定义请求过滤逻辑,将浏览器流量全部代理到mitmproxy后即可批量捕获符合条件的请求URL,适合脱离浏览器自动化框架的批量处理场景。
注意事项
- 提前梳理目标请求的特征,比如URL固定包含的关键字、请求方法、响应的Content-Type类型,避免捕获到静态资源、埋点统计等无关请求。
- 拿到URL后发起下载请求时,需要带上当前浏览器的Cookie、请求头等校验信息,避免因鉴权失败返回403、401错误。
内容的提问来源于stack exchange,提问作者ravikiran bheemaiah
相关产品推荐
相关产品推荐

