Python使用requests库发送Post、Get请求序列拉取表单查询数据
实现方案
核心思路
使用requests.Session()维持跨请求的Cookie、会话状态,完全复现浏览器的请求时序即可,注意必须使用Session对象发送所有请求,才能自动保存服务端返回的Cookie、会话标识,否则不同请求之间状态不互通会导致获取数据失败。
具体实现步骤
步骤1:初始化会话并配置基础请求头
从Chrome的请求详情页复制浏览器的完整请求头,包括User-Agent、Accept、Referer等所有字段,避免被服务端识别为异常请求。示例代码:
import requests import time session = requests.Session() # 替换为你从Chrome请求详情中复制的实际请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Referer": "替换为表单页面的实际访问地址" } session.headers.update(headers)
步骤2:按排查到的时序依次发送请求
完全按照你拿到的5步请求顺序发送即可,各步骤注意事项如下:
- 第一步带Form-Data的Post请求:直接把Chrome里复制的Form-Data键值对填到
data参数即可 - 无Form-Data的Post请求:
data参数传空字典{}即可,保证请求地址、请求头和浏览器一致 - 两次PNG的Get请求:直接请求对应地址即可,不需要处理返回内容,仅用于维持会话状态
- 重复的第一步Post请求:和第一步参数完全一致再发一次
- 最终Get请求:请求完成后即可拿到返回的表格数据,二进制Excel直接存为本地文件,HTML表格直接解析响应文本即可
示例代码框架:
# 1. 第一次带FormData的Post请求 form_data = { # 替换为Chrome里复制的实际FormData键值对 "filter_region": "华东", "filter_date": "2024-01-01", "submit": "查询" } resp1 = session.post("替换为第一步的实际请求URL", data=form_data) # 可选添加1秒延迟,模拟真实用户操作避免请求过快被拦截 time.sleep(1) print(f"第一步请求状态码:{resp1.status_code}") # 2. 无FormData的Post请求 resp2 = session.post("替换为第二步的实际请求URL", data={}) time.sleep(1) print(f"第二步请求状态码:{resp2.status_code}") # 3. 两次PNG的Get请求 resp3 = session.get("替换为第一张PNG的实际URL") resp4 = session.get("替换为第二张PNG的实际URL") time.sleep(1) print(f"PNG请求状态码:{resp3.status_code}, {resp4.status_code}") # 4. 重复第一步的Post请求 resp5 = session.post("替换为第一步的请求URL", data=form_data) time.sleep(1) print(f"第四步请求状态码:{resp5.status_code}") # 5. 最终Get请求拿数据 final_resp = session.get("替换为第五步的实际请求URL") print(f"最终请求状态码:{final_resp.status_code}") # 处理返回结果 # 若为Excel二进制文件 if "excel" in final_resp.headers.get("Content-Type", "") or "spreadsheet" in final_resp.headers.get("Content-Type", ""): with open("查询结果.xlsx", "wb") as f: f.write(final_resp.content) # 若为HTML格式表格 else: print(final_resp.text)
常见问题排查
- 请求返回403:检查请求头是否和浏览器完全一致,尤其是Referer、Cookie字段,若存在动态csrf token,需要先从表单页面源码中提取对应值再填入FormData
- 返回空数据:检查FormData的字段是否和浏览器提交的完全一致,有没有遗漏动态生成的隐藏字段
- 时序错误导致拿不到数据:可以逐步增加每个请求之间的延迟到2-3秒,匹配真实用户的操作节奏
内容的提问来源于stack exchange,提问作者Alireza farahani
相关产品推荐
相关产品推荐

