You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Python requests模拟浏览器并复用请求数据完成网页自动化操作

我之前刚好碰到过和你一模一样的需求——不想手动复制一堆请求头、Cookie这些繁琐的内容,又嫌Selenium太慢太笨重,没法灵活处理动态数据。下面几个方案亲测好用,完美解决用Python requests复用浏览器真实请求的问题:

方案1:利用浏览器「复制为cURL」一键转requests代码

这是最直接的方法,不用额外工具,浏览器自带功能就能搞定:

  • 打开Chrome/Firefox的开发者工具(F12),切换到「网络」标签
  • 执行你要复用的操作(比如谷歌搜索、提交表单),找到对应的核心请求(一般是排在最前面的主请求)
  • 右键该请求 → 复制 → 复制为cURL(bash)
  • 把复制的cURL转换成Python requests代码:
    你可以用Python的curlify库(直接pip install curlify)自动转换,示例代码如下:
    # 把从浏览器复制的cURL粘贴到这里
    curl_cmd = """curl 'https://www.google.com/search?q=python+requests&sourceid=chrome&ie=UTF-8' \
    -H 'authority: www.google.com' \
    -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' \
    -H 'cookie: 你的浏览器Cookie内容'"""
    
    from curlify import to_requests
    # 直接生成可运行的requests代码
    print(to_requests(curl_cmd))
    
    生成的代码直接就能用,你只需要把动态参数(比如搜索关键词q的值)抽成变量,就能重复执行不同的请求了。
方案2:用浏览器扩展自动导出请求代码

如果经常需要做这种操作,装个浏览器扩展能省更多事——比如「Export Requests」这类扩展,可以直接把浏览器的请求一键导出为Python requests格式的代码,连cURL转换的步骤都省了。
操作很简单:执行完浏览器操作后,在扩展里选中要导出的请求,选择「Export as Python Requests」,直接复制代码到Python里用就行。

方案3:用mitmproxy抓包批量生成可复用代码

如果需要批量录制多个请求,或者要自动化生成代码,mitmproxy是个神器——它是一个开源的代理工具,可以拦截浏览器的所有请求,然后用脚本自动生成requests代码。
步骤:

  1. 安装mitmproxy:pip install mitmproxy
  2. 写一个简单的mitmproxy脚本(比如save_requests.py):
    from mitmproxy import http
    import json
    
    def response(flow: http.HTTPFlow) -> None:
        # 只处理我们需要的GET/POST请求
        if flow.request.method not in ["GET", "POST"]:
            return
        
        # 生成requests代码模板
        code_lines = [
            "import requests\n",
            f"headers = {json.dumps(dict(flow.request.headers), indent=4, ensure_ascii=False)}\n"
        ]
        
        if flow.request.method == "GET":
            code_lines.append(f"params = {json.dumps(dict(flow.request.query), indent=4, ensure_ascii=False)}\n")
            code_lines.append(f"response = requests.get(\"{flow.request.url}\", headers=headers, params=params)\n")
        else:
            # 自动区分JSON和表单数据
            if flow.request.content_type == "application/json":
                data = json.dumps(json.loads(flow.request.text), indent=4, ensure_ascii=False)
                code_lines.append(f"data = {data}\n")
                code_lines.append(f"response = requests.post(\"{flow.request.url}\", headers=headers, json=data)\n")
            else:
                data = json.dumps(dict(flow.request.form), indent=4, ensure_ascii=False)
                code_lines.append(f"data = {data}\n")
                code_lines.append(f"response = requests.post(\"{flow.request.url}\", headers=headers, data=data)\n")
        
        # 保存代码到本地文件
        filename = f"request_{flow.request.method}_{flow.request.path.split('/')[-1]}.py"
        with open(filename, "w", encoding="utf-8") as f:
            f.writelines(code_lines)
    
  3. 运行mitmproxy:mitmproxy -s save_requests.py
  4. 把浏览器的代理设置为127.0.0.1:8080,然后执行你要录制的操作,mitmproxy会自动把每个请求转换成requests代码保存到本地。
优化技巧:让代码更灵活可复用

不管用哪种方法生成代码,都可以做以下优化,让它更适合重复执行:

  • 使用requests.Session():它会自动保持Cookie和会话状态,不用每次请求都重复传Cookie和headers
  • 抽离动态参数:把请求里的可变内容(比如搜索关键词、表单输入值)做成函数参数,示例如下:
    import requests
    
    def google_search(query):
        session = requests.Session()
        # 复用浏览器的固定请求头
        session.headers.update({
            'authority': 'www.google.com',
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
        })
        # 把从浏览器复制的Cookie加到session里(一次设置即可)
        session.cookies.set('NID', '你的NID Cookie值', domain='.google.com')
        
        params = {
            'q': query,
            'sourceid': 'chrome',
            'ie': 'UTF-8',
        }
        response = session.get('https://www.google.com/search', params=params)
        return response.text
    
    # 重复执行不同搜索请求
    for keyword in ['python requests', 'mitmproxy教程', 'curl转requests']:
        result = google_search(keyword)
        print(f"搜索「{keyword}」完成,状态码:{response.status_code}")
    
  • 处理动态令牌:如果请求需要CSRF token这类一次性令牌,可以先请求页面获取令牌,再放到提交的表单数据里。
注意事项
  • 一定要保持请求头的完整性:尤其是User-AgentRefererCookie这些字段,很多网站会用它们来识别爬虫,缺了很容易被拦截
  • 定期更新Cookie:如果网站的Cookie过期了,重新从浏览器复制一次就行
  • 控制请求频率:避免给网站服务器造成压力,也防止被封IP

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

火山引擎 最新活动