如何通过Selenium获取Chrome DevTools网络标签页的XHR/重定向信息?
用Selenium控制Chrome DevTools切换到Network标签并抓取XHR/重定向信息
要实现切换到DevTools的Network标签并捕获XHR、重定向信息,仅靠--auto-open-devtools-for-tabs参数不够,需要结合Chrome DevTools Protocol (CDP) 来控制DevTools面板并监听网络请求。以下是具体实现方案:
核心步骤
- 自动打开DevTools并切换到Network标签
- 启用网络请求捕获
- 监听网络事件,筛选XHR和重定向请求
完整代码示例
from selenium import webdriver import time # 配置Chrome选项 chrome_options = webdriver.ChromeOptions() # 自动为每个标签打开DevTools chrome_options.add_argument("--auto-open-devtools-for-tabs") # 可选:禁用缓存,确保捕获完整请求 chrome_options.add_argument("--disable-cache") driver = webdriver.Chrome(options=chrome_options) # 启用DevTools网络监控 driver.execute_cdp_cmd("Network.enable", {}) # 切换DevTools到Network标签 driver.execute_cdp_cmd("DevTools.switchToPanel", {"panelName": "network"}) # 存储捕获到的请求信息 captured_requests = [] # 监听网络请求发送与响应事件,筛选目标请求 def capture_requests(event_data): request = event_data["request"] response = event_data.get("response") # 判断是否为XHR请求 is_xhr = request["resourceType"] == "XHR" # 判断是否为重定向请求(状态码3xx) is_redirect = response and 300 <= response["status"] < 400 if is_xhr or is_redirect: captured_requests.append({ "url": request["url"], "type": "XHR" if is_xhr else "Redirect", "status_code": response["status"] if response else None, "redirect_from": request.get("redirectedFrom") }) # 添加CDP事件监听(需Selenium 4+版本支持) driver.add_cdp_listener("Network.requestWillBeSent", capture_requests) driver.add_cdp_listener("Network.responseReceived", capture_requests) # 访问目标页面 driver.get("https://google.com/") # 等待页面加载完成,确保捕获所有请求 time.sleep(5) # 打印捕获到的XHR和重定向信息 print("捕获到的XHR/重定向请求:") for req in captured_requests: print(f"类型: {req['type']}, URL: {req['url']}, 状态码: {req['status_code']}, 来源: {req['redirect_from']}") # 关闭浏览器 driver.quit()
关键代码说明
DevTools.switchToPanel: 通过CDP命令直接切换DevTools到指定面板,network对应Network标签Network.enable: 启用网络请求捕获,让DevTools开始记录所有网络活动Network.requestWillBeSent/Network.responseReceived: 监听这两个事件可获取请求发送和响应接收的完整信息,以此筛选XHR和重定向请求- 筛选逻辑:
- XHR请求通过
resourceType == "XHR"判断 - 重定向请求通过响应状态码3xx(300-399)判断,同时可通过
redirectedFrom获取重定向来源URL
- XHR请求通过
注意事项
- 必须使用Selenium 4及以上版本,低版本不支持
add_cdp_listener方法 time.sleep的时长可根据目标页面加载速度调整,也可改用显式等待(如WebDriverWait)替代固定等待
内容的提问来源于stack exchange,提问作者DaveDarell
相关产品推荐
相关产品推荐

