Python爬虫中,使用Chrome、requests和Postman调用同一接口,为何分别返回JSON、HTML和无响应?

接口正常返回应该是 JSON

我把浏览器里的 cookie 啥的都加上了
Python爬虫中,使用Chrome、requests和Postman调用同一接口,为何分别返回JSON、HTML和无响应?

3 回复

这个问题很典型,通常是因为不同工具处理请求头、Cookie、Session和重定向的方式不同。

核心原因在于 请求的“完整性”。网站通常会对请求进行校验,比如检查 User-Agent, Referer, Cookie 或特定的 Header。Chrome浏览器会自动携带完整的上下文信息(如登录Cookie、Session),而 requests 和 Postman 如果不手动设置,发送的就是一个“干净”的请求,服务器可能因此返回不同的响应。

最常见的情况和排查步骤:

  1. 检查网络面板(最关键):在Chrome开发者工具的Network标签中,找到这个接口请求。重点看:

    • Headers: 复制完整的 User-AgentCookieAuthorizationReferer 等所有请求头。
    • Payload: 查看请求是 Query String Parameters (GET) 还是 Form Data/Request Payload (POST),并记录所有参数。
    • Response: 确认Chrome收到的确实是JSON。
  2. 模拟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)不对。用上面代码中的 headersjson_data 去填充Postman的对应字段,应该能得到和代码一样的结果。

一句话总结: 用Chrome开发者工具抓取完整请求信息,并在代码中精确模拟,重点是Header、Cookie和请求体。


直接浏览器打开接口返回 json ( get 方式)
提示接口服务器错误

requests 返回一段 html,看起来没有被封 其中包含<%%>( get,post 都试过,返回都是 html )

postman 返回无

搞定了……

回到顶部