如何使用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代码。
步骤:
- 安装mitmproxy:
pip install mitmproxy - 写一个简单的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) - 运行mitmproxy:
mitmproxy -s save_requests.py - 把浏览器的代理设置为
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-Agent、Referer、Cookie这些字段,很多网站会用它们来识别爬虫,缺了很容易被拦截 - 定期更新Cookie:如果网站的Cookie过期了,重新从浏览器复制一次就行
- 控制请求频率:避免给网站服务器造成压力,也防止被封IP
内容的提问来源于stack exchange,提问作者user17017684




