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

使用Puppeteer时Flask代理服务器报错求助

问题分析与解决方案

你的核心问题是Flask代理没有遵循HTTP代理规范返回响应——当前代码把目标服务器的响应打包成JSON格式返回给浏览器,但Chrome/Puppeteer期望的是标准HTTP响应(包含正确状态码、响应头和原始内容),而非自定义JSON结构,这直接导致浏览器无法解析页面内容出现报错。

修正后的Flask代理代码

from flask import Flask, request, Response, jsonify
import requests

app = Flask(__name__)

# 要拦截的目标路径
blocked_paths = ['/blocked_url1', '/blocked_url2']

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def proxy_request(path):
    # 提取真实目标URL
    target_url = request.url.replace(request.host_url, '')
    
    # 检查是否命中拦截规则
    for blocked_path in blocked_paths:
        if blocked_path in target_url:
            return jsonify({'error': 'Forbidden - URL blocked'}), 403
    
    try:
        # 转发原始请求的所有方法、头、数据
        response = requests.request(
            method=request.method,
            url=target_url,
            headers={k: v for k, v in request.headers.items() if k != 'Host'},
            data=request.get_data(),
            cookies=request.cookies,
            allow_redirects=False,
            timeout=10
        )
        
        # 构建符合HTTP规范的响应返回给浏览器
        excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
        headers = [(name, value) for name, value in response.raw.headers.items()
                   if name.lower() not in excluded_headers]
        
        return Response(response.content, response.status_code, headers)
    
    except requests.exceptions.RequestException as e:
        return jsonify({'error': f'Request failed - {str(e)}'}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

关键修改说明

  1. 路由匹配所有请求:用/<path:path>匹配代理收到的所有请求路径,确保能处理浏览器发送的各类请求(GET/POST/HEAD等)。
  2. 正确提取目标URL:通过request.url.replace(request.host_url, '')获取真实目标地址,替换原代码中硬编码的错误处理逻辑。
  3. 转发完整请求信息:不再只转发GET请求,而是原样转发浏览器的请求方法、头、数据和Cookie,保证请求完整性。
  4. 返回标准HTTP响应:使用Flask的Response对象封装目标服务器的原始响应内容、状态码和响应头,移除可能导致冲突的响应头,确保浏览器能正常解析。
  5. 优化拦截逻辑:改为匹配目标URL中的路径片段,拦截判断更精准。

Puppeteer代码无需调整

你的Puppeteer启动参数配置是正确的,只要Flask代理正常工作,就能通过代理正常加载页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:40:56