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

如何让Selenium捕获所有网络请求及响应?

解决方案

你的代码存在几个关键问题导致无法捕获跨域请求,以下是修改后的完整代码及关键说明:

修改后的代码

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import sys

# 配置Chrome捕获所有性能日志
capabilities = DesiredCapabilities.CHROME.copy()
capabilities["goog:loggingPrefs"] = {"performance": "ALL"}

# 初始化浏览器并强制启用Network模块(核心修改点)
driver = webdriver.Chrome(desired_capabilities=capabilities)
driver.execute_cdp_cmd("Network.enable", {})

# 访问目标页面
driver.get("<URL>")

# 过滤函数:仅保留响应日志,不再限制MIME类型(若需仅捕获json可保留原判断)
def log_filter(log_):
    return log_["method"] == "Network.responseReceived"

# 获取完整的性能日志
logs = driver.get_log('performance')

# 写入结果到文件
with open('output.txt', 'wt', encoding='utf-8') as f:
    sys.stdout = f
    for log in filter(log_filter, logs):
        request_id = log["params"]["requestId"]
        resp_url = log["params"]["response"]["url"]
        print(f"Caught {resp_url}")
        # 捕获响应体,添加异常处理避免部分资源无法获取body导致崩溃
        try:
            response_body = driver.execute_cdp_cmd(
                "Network.getResponseBody", {"requestId": request_id}
            )
            print(response_body)
        except Exception as e:
            print(f"获取响应体失败: {str(e)}")

driver.quit()

关键修改说明

  1. 启用Network模块:
    必须调用driver.execute_cdp_cmd("Network.enable", {}),这是Chrome DevTools Protocol的强制要求,只有启用该模块才能捕获所有跨域、第三方域名的网络请求。

  2. 修正日志获取逻辑:
    原代码未定义logs变量,需通过driver.get_log('performance')获取完整的性能日志集合。

  3. 调整过滤条件:
    去掉了"json" in log_["params"]["response"]["mimeType"]的限制,这样所有类型的响应(包括静态资源、第三方接口等)都会被捕获;如果仍需仅保留json类型响应,可重新添加该行代码。

  4. 异常处理:
    部分资源(如图片、字体文件)无法获取响应体,添加try-except避免程序中途崩溃。

内容的提问来源于stack exchange,提问作者L Z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:05:24