You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python POST请求间歇性异常:无法解析JSON响应

解决Python脚本POST请求后JSON解析失败的问题

看起来你遇到的这个问题很常见,你的推测完全在点子上——这个ValueError确实大概率是因为服务器返回的内容不是有效的JSON格式,导致json.loads()(或类似解析方法)抛出异常。下面给你几个具体的排查和解决思路:

1. 先捕获异常,查看服务器实际返回内容

当报错时,别直接跳过解析步骤,先把响应内容存下来看看到底是什么。可以在POST请求代码后加上异常捕获:

import requests

try:
    response = requests.post(your_target_url, data=your_request_payload)
    response.raise_for_status()  # 先检查HTTP状态码是否正常(比如403、500这些错误)
    data = response.json()
except ValueError as e:
    # 把错误响应写入文件,方便后续排查
    with open("error_response.txt", "w", encoding="utf-8") as f:
        f.write(response.text)
    print(f"JSON解析失败,已把响应内容保存到error_response.txt: {e}")
    # 这里可以根据返回内容做针对性处理,比如判断是不是被反爬拦截了

通过这个方法,你就能清楚看到服务器到底返回了什么——可能是反爬验证的HTML页面、500错误页、空字符串,甚至是格式残缺的JSON。

2. 排查是否触发反爬机制

间隔几小时后才出错,很大概率是服务器的反爬策略生效了:

  • UA伪装:服务器可能识别到你的脚本用了requests默认的User-Agent,建议每次请求用随机的浏览器UA:
    from fake_useragent import UserAgent
    
    ua = UserAgent()
    headers = {
        "User-Agent": ua.random
    }
    response = requests.post(your_target_url, headers=headers, data=your_request_payload)
    
  • 会话保持:有些网站需要维持会话(比如携带特定Cookie)才能正常返回数据,用requests.Session()来维持会话状态:
    session = requests.Session()
    # 先访问一次网站首页,获取必要的Cookie
    session.get(your_homepage_url)
    # 再发送POST请求
    response = session.post(your_target_url, data=your_request_payload)
    
  • 请求频率限制:如果你的请求间隔太短,可能触发服务器的频率检测。可以尝试增加请求间隔,或者在出错时添加重试逻辑。

3. 先验证响应的合法性

即使HTTP状态码是200,也不代表返回的是有效JSON。可以在解析前先检查响应的Content-Type:

if response.headers.get("Content-Type") != "application/json":
    print(f"非JSON响应,Content-Type: {response.headers.get('Content-Type')}")
    # 这里可以添加处理逻辑,比如跳过解析,或者做其他适配

4. 添加重试机制应对服务器不稳定

有些服务器可能在负载过高、临时维护时返回非JSON内容,这时候可以用重试逻辑来自动重试请求:

from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type

@retry(
    stop=stop_after_attempt(3),  # 最多重试3次
    wait=wait_exponential(multiplier=1, min=2, max=10),  # 重试间隔指数增长
    retry=retry_if_exception_type(ValueError)  # 只有JSON解析失败时才重试
)
def fetch_valid_json():
    response = requests.post(your_target_url, data=your_request_payload)
    response.raise_for_status()
    return response.json()

try:
    valid_data = fetch_valid_json()
except Exception as e:
    print(f"多次重试后仍失败: {e}")

最后建议你先通过第一步捕获异常内容,这是最直接的排查方式——比如如果返回的是验证码页面,那就要处理验证码;如果是503错误,那就是服务器暂时不可用,只需要重试即可。

内容的提问来源于stack exchange,提问作者Alan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:31:52