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
相关产品推荐
相关产品推荐

