如何让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()
关键修改说明
启用Network模块:
必须调用driver.execute_cdp_cmd("Network.enable", {}),这是Chrome DevTools Protocol的强制要求,只有启用该模块才能捕获所有跨域、第三方域名的网络请求。修正日志获取逻辑:
原代码未定义logs变量,需通过driver.get_log('performance')获取完整的性能日志集合。调整过滤条件:
去掉了"json" in log_["params"]["response"]["mimeType"]的限制,这样所有类型的响应(包括静态资源、第三方接口等)都会被捕获;如果仍需仅保留json类型响应,可重新添加该行代码。异常处理:
部分资源(如图片、字体文件)无法获取响应体,添加try-except避免程序中途崩溃。
内容的提问来源于stack exchange,提问作者L Z
相关产品推荐
相关产品推荐

