Python Selenium 通过 CDP 协议获取接口响应数据

白榆
白榆
发布时间:2026-10-14| 5人浏览过
原创

本文介绍如何在 Python Selenium 中通过 Chrome DevTools Protocol (CDP) 获取接口数据。Selenium 本身不提供直接查询接口响应的方法,但可通过配置性能日志(performance logging)捕获 requestid,进而调用 Network.getResponseBody 命令提取特定 URL 的完整响应内容。

Selenium 获取接口数据的原理

在 Python Selenium 自动化测试或爬虫场景中,有时需要获取页面加载过程中网络请求的接口数据。

Selenium 标准 API 并未直接提供查询网络响应体的函数,但可以利用 WebDriver 暴露的底层 API 进行交互,核心使用的命令是 Network.getResponseBody。

相关 WebDriver API 的详细文档可参考 Chrome DevTools 协议规范:https://chromedevtools.github.io/devtools-protocol/tot/Network/。

关于 Network.getResponseBody 的具体文档说明如下。

该命令接收一个参数 requestid,这是 WebDriver 在发起每个网络请求时自动生成的唯一标识符。只要掌握了正确的 requestid,即可通过命令获取该请求返回的完整响应内容。

配置日志与获取 RequestID

那么如何获取这个 requestid 呢?在创建 WebDriver 对象时,需要在配置信息中启用 performance 日志记录。启用后,WebDriver 会记录每个网络请求的日志信息,通过检索这些日志即可找到目标请求对应的 requestid。

代码实现示例

以下是获取日志信息的 WebDriver 创建代码。注意,必须传入特定的配置信息(caps)才能成功获取日志信息:


from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time
 
caps = {
  'browserName': 'chrome',
  'loggingPrefs': {
    'browser': 'ALL',
    'driver': 'ALL',
    'performance': 'ALL',
  },
  'goog:chromeOptions': {
    'perfLoggingPrefs': {
      'enableNetwork': True,
    },
    'w3c': False, 
  },
}
driver = webdriver.Chrome(desired_capabilities=caps)
 
driver.get('https://partner.oceanengine.com/union/media/login/')
# 必须等待一定的时间,不然会报错提示获取不到日志信息,因为絮叨等所有请求结束才能获取日志信息
time.sleep(3)
 
request_log = driver.get_log('performance')

打印 request_log 结果为一个数组,遍历该数组并检索需要获取的 URL 所对应的 requestid。例如,若需获取 https://s3.pstatp.com/bytecom/resource/union_web2/media/manifest.json 对应的 requestid 并提取接口内容,可参考以下逻辑:


for i in range(len(request_log)):
  message = json.loads(request_log[i]['message'])
  message = message['message']['params']
  # .get() 方式获取是了避免字段不存在时报错
  request = message.get('request')
  if(request is None):
    continue
 
  url = request.get('url')
  if(url == "https://s3.pstatp.com/bytecom/resource/union_web2/media/manifest.json"):
    # 得到requestId
    print(message['requestId'])
    # 通过requestId获取接口内容
    content = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': message['requestId']})
    print(content)
    break

以下是完整的实现代码示例:


import json
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time
 
caps = {
  'browserName': 'chrome',
  'loggingPrefs': {
    'browser': 'ALL',
    'driver': 'ALL',
    'performance': 'ALL',
  },
  'goog:chromeOptions': {
    'perfLoggingPrefs': {
      'enableNetwork': True,
    },
    'w3c': False, 
  },
}
driver = webdriver.Chrome(desired_capabilities=caps)
 
driver.get('https://partner.oceanengine.com/union/media/login/')
# 必须等待一定的时间,不然会报错提示获取不到日志信息,因为絮叨等所有请求结束才能获取日志信息
time.sleep(3)
 
request_log = driver.get_log('performance')
print(request_log)
 
for i in range(len(request_log)):
  message = json.loads(request_log[i]['message'])
  message = message['message']['params']
  # .get() 方式获取是了避免字段不存在时报错
  request = message.get('request')
  if(request is None):
    continue
 
  url = request.get('url')
  if(url == "https://s3.pstatp.com/bytecom/resource/union_web2/media/manifest.json"):
    # 得到requestId
    print(message['requestId'])
    # 通过requestId获取接口内容
    content = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': message['requestId']})
    print(content)
    break

至此,关于 Python Selenium 获取接口数据的实现方法介绍完毕。如需了解更多相关技术内容,可搜索本站往期文章或关注后续更新,感谢支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。