Python爬虫中,使用Chrome、requests和Postman调用同一接口,为何分别返回JSON、HTML和无响应?
接口正常返回应该是 JSON
我把浏览器里的 cookie 啥的都加上了
Python爬虫中,使用Chrome、requests和Postman调用同一接口,为何分别返回JSON、HTML和无响应?
这个问题很典型,通常是因为不同工具处理请求头、Cookie、Session和重定向的方式不同。
核心原因在于 请求的“完整性”。网站通常会对请求进行校验,比如检查 User-Agent, Referer, Cookie 或特定的 Header。Chrome浏览器会自动携带完整的上下文信息(如登录Cookie、Session),而 requests 和 Postman 如果不手动设置,发送的就是一个“干净”的请求,服务器可能因此返回不同的响应。
最常见的情况和排查步骤:
-
检查网络面板(最关键):在Chrome开发者工具的Network标签中,找到这个接口请求。重点看:
- Headers: 复制完整的
User-Agent、Cookie、Authorization、Referer等所有请求头。 - Payload: 查看请求是
Query String Parameters(GET) 还是Form Data/Request Payload(POST),并记录所有参数。 - Response: 确认Chrome收到的确实是JSON。
- Headers: 复制完整的
-
模拟Chrome请求:将上面抓取到的所有头信息和参数,原样设置到你的
requests代码中。通常需要创建一个Session对象来保持会话。
代码示例:
假设你从Chrome开发者工具中捕获到以下关键信息:
- 请求URL:
https://api.example.com/data - 请求方法: POST
- 请求头:
User-Agent,Cookie,Content-Type: application/json - 请求体 (JSON):
{"page": 1, "token": "xyz"}
import requests
# 使用Session保持会话(自动处理Cookie)
session = requests.Session()
# 1. 设置Headers,尽可能和浏览器一致
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...',
'Content-Type': 'application/json',
# 如果有Referer也加上
# 'Referer': 'https://example.com/page',
}
# 2. 如果有初始Cookie,可以这样设置(通常由Session在后续请求中自动管理)
# session.cookies.update({'key': 'value'})
# 3. 准备请求数据
json_data = {"page": 1, "token": "xyz"}
# 4. 发送请求
try:
response = session.post(
'https://api.example.com/data',
headers=headers,
json=json_data # 使用json参数会自动序列化并设置Content-Type
# 如果是表单数据,则使用 data=form_data
)
response.raise_for_status() # 检查请求是否成功
result = response.json() # 尝试解析JSON
print("成功获取JSON数据:", result)
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
except ValueError:
print("响应不是有效的JSON,可能是HTML或错误页。响应文本前500字符:")
print(response.text[:500])
为什么Postman可能无响应?
检查Postman中是否设置了错误的超时、漏掉了必要的Header(尤其是 Content-Type)、或请求方式(GET/POST)不对。用上面代码中的 headers 和 json_data 去填充Postman的对应字段,应该能得到和代码一样的结果。
一句话总结: 用Chrome开发者工具抓取完整请求信息,并在代码中精确模拟,重点是Header、Cookie和请求体。
直接浏览器打开接口返回 json ( get 方式)
提示接口服务器错误
requests 返回一段 html,看起来没有被封 其中包含<%%>( get,post 都试过,返回都是 html )
postman 返回无
搞定了……

