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

Reddit API脚本运行5-6小时崩溃,JSON解码错误求助

解决Reddit API脚本运行数小时后崩溃的JSON解码错误

错误原因

你碰到的JSONDecodeError,本质是请求Reddit API后返回的内容不是有效JSON格式。常见触发场景:

  • Reddit API触发限流(返回429状态码,内容是HTML提示页)
  • 临时网络波动导致请求失败,返回空响应或无效内容

你的代码直接调用res.json(),完全没有异常处理,一旦遇到无效响应就会直接崩溃。

修复方案

1. 加异常捕获,避免脚本直接崩溃

在解析JSON的代码块外包裹try-except,捕获解码错误,同时检查响应状态码,区分限流、服务器错误等情况。

2. 处理API限流

Reddit API有严格的请求频率限制,遇到429状态码时,优先根据返回的Retry-After头信息休眠对应时间,没有该头则固定休眠一段时间后重试。

3. 修正循环逻辑

原代码遇到重复项直接break跳出循环,这会导致后续帖子无法处理,应该改成continue跳过当前重复项,继续处理其余内容。

修改后的代码示例

import pandas as pd
import requests
import time
from requests.exceptions import JSONDecodeError

# 初始化读取Excel
df = pd.read_excel("Scraper.xlsx")

while True:
    try:
        # 替换为你的Reddit API请求,必须设置合法的User-Agent
        res = requests.get(
            "你的Reddit API接口地址",
            headers={"User-Agent": "你的脚本标识(比如:LoanScraper/1.0 by YourUsername)"}
        )
        
        # 处理不同状态码的情况
        if res.status_code == 429:
            retry_after = int(res.headers.get("Retry-After", 60))
            print(f"触发API限流,{retry_after}秒后重试")
            time.sleep(retry_after)
            continue
        elif res.status_code >= 500:
            print(f"服务器错误 {res.status_code},10秒后重试")
            time.sleep(10)
            continue
        elif res.status_code != 200:
            print(f"请求失败,状态码: {res.status_code}")
            time.sleep(5)
            continue
        
        # 尝试解析JSON
        api_data = res.json()
        for post in api_data['data']['children']:
            loan_id = f"{post['kind']}_{post['data']['id']}"
            
            # 检查是否重复
            if df['Loan ID'].eq(loan_id).any():
                print(f"重复帖子 {loan_id},跳过")
                continue
            
            # 构造新数据行
            new_row = pd.DataFrame({
                'Username': [post['data']['author']],
                'Return_Amount': [post['data']['title']],
                'Mode': [post['data']['title']],
                "Time_EST": [post['data']['created']],
                "Time_PST": [post['data']['created']],
                'Req_Amount': [post['data']['title']],
                'URL': [post['data']['url']],
                'Loan ID': [loan_id],
                "Location": [""],
                "Profit": [""],
                "Profit %": [""]
            })
            
            # 合并数据并保存
            df = pd.concat([df, new_row], ignore_index=True)
            df.to_excel("Scraper.xlsx", index=False)
            print(f"新增帖子 {loan_id}")
        
        # 控制请求频率,避免触发限流
        time.sleep(60)
        
    except JSONDecodeError:
        print("响应不是有效JSON,5秒后重试")
        time.sleep(5)
    except Exception as e:
        print(f"发生未知错误: {str(e)},10秒后重试")
        time.sleep(10)

额外优化建议

  • 必填User-Agent:Reddit API要求必须设置自定义User-Agent,否则会被拒绝请求
  • 定期保存数据:每次新增数据后立即保存Excel,避免脚本崩溃时丢失未保存的内容
  • 改用PRAW库:官方推荐的Reddit Python库PRAW已经封装了限流处理、异常捕获等逻辑,比直接用requests更稳定可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:10:17