使用Python3 requests调用百度百科接口POST请求无返回,浏览器请求正常
解决Python requests模拟百度百科POST请求无响应的问题
这种情况我之前也踩过坑,大概率是请求的细节没和浏览器完全对齐,导致服务器直接拒绝返回有效数据。下面是一步步排查和解决的思路:
1. 核对所有请求头,别漏关键字段
浏览器发送请求时带的头比你想的多,很多网站会校验Cookie、User-Agent、Referer、Origin这些核心字段,少一个都可能被拦截:
- 把Fiddler里抓到的全部请求头原封不动复制到requests的headers字典里,尤其是
Cookie——这个字段包含你的会话信息,过期了还得重新抓最新的。 - 别偷懒只复制几个常见头,像
Accept、Accept-Encoding、Accept-Language这类看似不重要的字段,服务器也可能做校验。
2. 检查表单参数的完整性和时效性
有些网站的POST参数里会藏着动态生成的字段,比如timestamp(时间戳)、sign(签名),你从Fiddler抓的参数是当时有效的,过几分钟就失效了:
- 逐行对比浏览器请求和你的requests请求的表单数据,确保每个参数的键和值都完全一致,没有拼写错误。
- 如果发现有动态参数,得去分析页面的JS代码,找到生成这些参数的逻辑,自己在代码里实时生成。
3. 使用Session保持会话状态
浏览器会自动维护会话Cookie,而requests默认每次请求都是独立的,用requests.Session()可以帮你自动管理Cookie,完美模拟浏览器的会话流程:
import requests # 初始化Session,自动管理Cookie session = requests.Session() # 先访问目标标签页,获取必要的会话信息(有些网站要求先访问页面再发接口请求) session.get('https://baike.baidu.com/wikitag/taglist?tagId=75953') # 从Fiddler复制完整请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Referer': 'https://baike.baidu.com/wikitag/taglist?tagId=75953', 'Origin': 'https://baike.baidu.com', # 其他所有请求头都复制过来... } # 从Fiddler复制完整表单数据 data = { 'tagId': '75953', 'page': '1', 'limit': '20', # 其他所有表单参数都复制过来... } # 发送POST请求 response = session.post('https://baike.baidu.com/wikitag/api/getlemmas', headers=headers, data=data) # 查看响应状态和内容 print(f"状态码: {response.status_code}") print(f"响应内容: {response.text}")
4. 开启调试,对比请求差异
如果还是不行,就把requests发送的请求细节打印出来,和Fiddler里的浏览器请求逐字段对比:
- 打印请求头:
print(response.request.headers) - 打印请求体:
print(response.request.body) - 重点看有没有编码差异、参数缺失或者字段值不一致的情况。
5. 注意反爬机制
百度这类网站有成熟的反爬措施,如果你频繁请求,可能会被封IP或者返回空数据:
- 不要短时间内多次发送请求,加个
time.sleep(2)之类的间隔。 - 如果还是被拦截,试试更换User-Agent,或者使用代理IP分散请求来源。
内容的提问来源于stack exchange,提问作者Travis




