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

如何在Python+Selenium中获取请求URL对应的Payload

解决Selenium获取请求Payload的问题

你当前使用的window.performance.getEntriesByType('resource')只能获取资源加载的元数据(比如URL、加载时间等),无法获取请求的Payload(请求体)。要实现这个需求,需要借助Chrome DevTools Protocol(CDP)来捕获完整的网络请求详情。

以下是修改后的完整代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json

option = Options()
# 启用性能日志,确保能捕获网络请求
option.set_capability('goog:loggingPrefs', {'performance': 'ALL'})

driver = webdriver.Chrome(options=option)

# 启用CDP的Network域,用于捕获请求详情
driver.execute_cdp_cmd('Network.enable', {})

driver.get("https://www.example.com")

# 获取所有性能日志
logs = driver.get_log('performance')

target_url_pattern = "http://fonts.googleapis.com/css?family=Open"

for log in logs:
    log_message = log['message']
    # 解析日志内容为JSON格式
    message = json.loads(log_message)
    message_params = message.get('message', {}).get('params', {})
    
    # 筛选出请求发送事件,且URL匹配目标规则
    if message['message']['method'] == 'Network.requestWillBeSent' and target_url_pattern in message_params.get('request', {}).get('url', ''):
        request = message_params['request']
        print("URL:", request['url'])
        # 获取请求Payload,GET请求通常无请求体,POST/PUT等方法会有postData字段
        payload = request.get('postData')
        print("PAYLOAD:", payload if payload else "无请求体(GET请求)")

driver.quit()

关键说明:

  • CDP的作用:通过Network.enable命令启用网络监控,Network.requestWillBeSent事件会在每个请求发送前触发,包含完整的请求信息(URL、请求头、请求体等)。
  • 日志解析:性能日志的原始内容是JSON字符串,必须解析后才能提取请求参数。
  • Payload的存在条件:只有POST、PUT等带请求体的HTTP方法才会有Payload,GET请求通常没有postData字段,此时会显示"无请求体(GET请求)"。

补充提示:

如果目标请求是页面加载后通过JS动态触发的,需要确保在请求触发前就启用CDP监听,或者添加等待逻辑(比如WebDriverWait),确保请求已发送后再获取日志。

内容的提问来源于stack exchange,提问作者mohammed jaber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:01:04