Python用while True循环调用CoWIN接口出现JSON序列化报错如何修复
问题修复方案
错误根因
你当前仅捕获了IndexError类型异常,当调用CoWIN接口出现网络波动、接口限流、请求频率超限等问题时,接口会抛出HTTPError异常,你未捕获该异常,此时available_centers实际是HTTPError对象而非可序列化的接口返回字典,传入json.dumps时就会触发序列化失败报错。同时代码还存在变量名冲突、时间不更新、请求频率过高等隐含问题。
修复步骤
- 新增
HTTPError等网络请求相关异常的捕获逻辑,避免未捕获异常导致脚本直接终止,可新增日志打印异常信息方便排查 - 修正变量名冲突问题:你导入了
time模块后又定义了同名全局变量time,会覆盖模块导致后续time.sleep等方法无法调用 - 将时间获取逻辑移到
vaccine_check函数内部,避免全局时间固定为脚本启动时间,不会随循环更新 - 无限循环中新增休眠间隔,避免短时间高频请求被CoWIN接口拦截,疫苗数据15分钟更新一次,设置60~300秒休眠即可
- 优化接种点遍历逻辑,不要硬编码遍历前100个接种点,直接遍历返回的
centers列表即可,避免无意义的索引错误
修复后完整代码
from cowin_api import CoWinAPI import json import datetime import numpy as np import os from twilio.rest import Client import selenium from selenium import webdriver import time # 注意不要定义同名变量覆盖该模块 import io import requests from requests.exceptions import HTTPError # 导入HTTPError异常类 from selenium.common.exceptions import ElementClickInterceptedException from selenium.webdriver.common.keys import Keys from threading import Thread state_id = '21' district_id = '395' min_age_limit = 18 cowin = CoWinAPI() # 此处获取接种点与疫苗信息 def vaccine_check(): # 每次调用都获取最新时间 current_time = datetime.datetime.now() try: available_centers = cowin.get_availability_by_district(district_id) # 输出到JSON文件后回读 json_output = json.dumps(available_centers, indent=4) f = open(f'tests/vaccinecheck[{current_time.strftime("%b %d %Y %H|%M")}].json', 'w') f.write(json_output) f.close() with open(f.name) as file: data = json.load(file) # 直接遍历返回的centers列表,不要硬编码100个 for center in data["centers"]: session = center["sessions"][0] if session["min_age_limit"] == 45: continue print(f'[{current_time.strftime("%b %d %Y %H:%M")}]', center["name"], '-- vaccines:', session['available_capacity'], '-- age-limit:', session["min_age_limit"]) if session["available_capacity"] >= 1: twilio_send() except IndexError: # 捕获无更多接种点的错误 pass except HTTPError as e: print(f"接口请求出错:{e}, 等待下次重试") except Exception as e: print(f"未知错误:{e}, 等待下次重试") def twilio_send(): client = Client() from_whatsapp_number='whatsapp:twilio api demo num' to_whatsapp_number='whatsapp:my phone num' client.messages.create(body='vaccine available - book now!', from_=from_whatsapp_number, to=to_whatsapp_number) if __name__ == "__main__": # 先判断tests目录是否存在,不存在则创建避免写入文件报错 if not os.path.exists("tests"): os.mkdir("tests") while True: vaccine_check() # 每次请求后休眠60秒,可自行调整间隔 time.sleep(60)
内容的提问来源于stack exchange,提问作者bigman1234
相关产品推荐
相关产品推荐

