You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用Python3 requests调用百度百科接口POST请求无返回,浏览器请求正常

解决Python requests模拟百度百科POST请求无响应的问题

这种情况我之前也踩过坑,大概率是请求的细节没和浏览器完全对齐,导致服务器直接拒绝返回有效数据。下面是一步步排查和解决的思路:

1. 核对所有请求头,别漏关键字段

浏览器发送请求时带的头比你想的多,很多网站会校验CookieUser-AgentRefererOrigin这些核心字段,少一个都可能被拦截:

  • 把Fiddler里抓到的全部请求头原封不动复制到requests的headers字典里,尤其是Cookie——这个字段包含你的会话信息,过期了还得重新抓最新的。
  • 别偷懒只复制几个常见头,像AcceptAccept-EncodingAccept-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

火山引擎 最新活动