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

如何用Python结合Selenium/Selenium-Wire实现Chrome DevTools的‘Copy as fetch’功能

如何用Python结合Selenium/Selenium-Wire实现Chrome DevTools的‘Copy as fetch’功能

嘿,我懂你现在的需求——已经用Selenium-Wire定位到了目标请求,想要把它转换成Chrome DevTools里「Copy as fetch」生成的那种可直接运行的JavaScript代码对吧?这事儿其实不难,核心就是从Selenium-Wire拿到的request对象里抠出所有必要的请求参数,再拼接成符合fetch语法的代码就行。我来一步步给你拆解实现:

核心思路

Chrome的「Copy as fetch」本质是把请求的URL、方法、请求头、请求体这些信息,封装成标准的fetch()调用代码。所以我们只需要从Selenium-Wire的request对象中提取这些关键信息,再按fetch的语法拼接起来就好。

具体实现代码

下面是直接可用的代码示例,你可以把它整合到你现有的逻辑里:

import json
from seleniumwire import webdriver

# 初始化你的driver(这里用Chrome为例,其他浏览器同理)
driver = webdriver.Chrome()

# 这里是你的现有逻辑,比如打开页面、触发请求
driver.get("https://your-target-page.com")

# 遍历请求,找到目标请求并生成fetch代码
for request in driver.requests:
    if request.response and request.url.startswith("https://example.com"):
        # 1. 提取基础请求信息
        target_url = request.url
        request_method = request.method

        # 2. 处理请求头:转成fetch需要的键值对格式
        # 可以按需过滤掉一些Selenium自动添加的冗余头
        request_headers = {k: v for k, v in request.headers.items() if not k.startswith('Sec-')}

        # 3. 处理请求体:仅针对POST/PUT等有body的请求
        request_body = None
        if request.body:
            try:
                # 尝试解析为JSON(大部分API请求是JSON格式)
                request_body = json.loads(request.body.decode('utf-8'))
            except UnicodeDecodeError:
                # 如果是二进制或非UTF-8编码,转成base64(模拟DevTools的处理)
                import base64
                request_body = f"data:application/octet-stream;base64,{base64.b64encode(request.body).decode('utf-8')}"
            except json.JSONDecodeError:
                # 非JSON格式的文本,直接转成字符串
                request_body = request.body.decode('utf-8')

        # 4. 拼接fetch代码
        fetch_code_lines = [
            f"fetch('{target_url}', {{",
            f"  method: '{request_method}',",
            f"  headers: {json.dumps(request_headers, indent=4)},",
        ]

        if request_body is not None:
            if isinstance(request_body, dict):
                # 如果是JSON对象,用JSON.stringify包裹
                fetch_code_lines.append(f"  body: JSON.stringify({json.dumps(request_body, indent=4)}),")
            else:
                # 字符串或base64直接传入
                fetch_code_lines.append(f"  body: '{request_body}',")

        # 关闭配置对象,添加响应处理(和DevTools生成的代码对齐)
        fetch_code_lines.extend([
            "})",
            ".then(response => {",
            "  if (!response.ok) {",
            "    throw new Error('Network response was not ok');",
            "  }",
            "  return response.json(); // 按需改成response.text()等",
            "})",
            ".then(data => console.log(data))",
            ".catch(error => console.error('Fetch error:', error));",
        ])

        # 合并成完整的fetch代码并打印
        full_fetch_code = '\n'.join(fetch_code_lines)
        print("生成的Copy as fetch代码:")
        print(full_fetch_code)

# 记得关闭driver
driver.quit()

一些注意事项

  • 请求头过滤:示例里过滤掉了以Sec-开头的头,这些是浏览器自动生成的安全头,如果你需要完全和原请求一致,可以去掉过滤逻辑。
  • 请求体处理:针对不同的请求体格式(JSON、文本、二进制)做了不同的处理,基本覆盖了大部分场景,你可以根据你的实际请求类型调整。
  • 响应处理:示例里默认用了response.json(),如果你的接口返回的是文本或其他格式,改成response.text()或response.blob()即可,和DevTools生成的代码逻辑对齐。

这样生成的代码就和你在Chrome里右键请求选择「Copy as fetch」得到的代码几乎一模一样,直接复制到浏览器控制台就能运行啦!

备注:内容来源于stack exchange,提问作者Alex Julian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 06:29:28