如何用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
相关产品推荐
相关产品推荐

