遍历含缺失键的列表嵌套字典提取字段及API代码优化
动漫title字段提取实现
遍历接口返回的结果列表时,优先判断条目是否存在data键:存在则为有效动漫数据,不存在则为404类错误响应直接跳过。取值时用字典的.get()方法,即可自动处理字段缺失的场景,不会触发KeyError中断脚本。
核心提取代码如下:
anime_titles = [] for resp_item in data: # 过滤无有效动漫数据的错误响应 anime_detail = resp_item.get("data") if not anime_detail: continue # 提取title字段,字段缺失时默认返回None title = anime_detail.get("title") anime_titles.append(title)
运行完成后,anime_titles列表会存储所有有效条目的动漫标题,404等错误条目会被自动过滤。
原代码优化建议
原代码可以从简洁性、稳定性、可维护性三个维度优化,具体优化点:
- 移除冗余操作:无需手动导入
json模块做解析,requests响应对象自带.json()方法,可直接将返回内容转为Python字典,省去json.loads(response.text)的重复步骤 - 调整处理流程:不需要先存储全量response对象再二次遍历解析,建议边请求、边解析、边提取目标字段,大幅降低内存占用,批量抓取上千个ID时优化效果尤其明显
- 补充异常兼容:除了处理404业务错误,还要捕获网络超时、连接失败、接口限流(429状态码)等异常,避免单个请求失败导致整个脚本终止;Jikan接口有明确的请求频率限制,在固定1秒请求间隔的基础上,可以给限流场景增加自动重试逻辑
- 清理无效输出:原代码每次请求后打印全量响应列表,ID范围稍大就会刷满控制台,无实际调试价值,建议仅输出当前处理ID、请求状态、抓取结果等关键信息
- 统一空值处理:所有字段取值统一使用
.get()方法,为缺失键设置默认返回值,从根源避免KeyError导致的脚本中断
优化后的完整可运行代码:
import requests import time # 最终存储提取到的动漫标题 anime_titles = [] # 遍历指定范围的动漫ID for mal_id in range(5000, 5010): req_url = f'https://api.jikan.moe/v4/anime/{mal_id}/full' try: resp = requests.get(req_url, timeout=10) # 触发限流时等待3秒后重试一次 if resp.status_code == 429: time.sleep(3) resp = requests.get(req_url, timeout=10) resp_data = resp.json() anime_info = resp_data.get("data") if anime_info: title = anime_info.get("title") anime_titles.append(title) print(f"ID {mal_id} 抓取成功,标题:{title}") else: print(f"ID {mal_id} 对应资源不存在,已跳过") except Exception as e: print(f"ID {mal_id} 请求失败,错误:{str(e)}") # 遵守接口频率限制,请求间隔1秒 time.sleep(1) print("全部抓取完成,有效动漫标题列表:", anime_titles)
优化后的代码无需存储全量响应和原始返回数据,运行过程中仅保留最终需要的标题结果,内存占用更低;单个请求失败不会影响整体任务运行,后续如果需要新增提取字段(如评分、播出时间、标签等),只需要在
anime_info下追加对应的取值逻辑即可,维护成本极低。
内容的提问来源于stack exchange,提问作者mangarapaul
相关产品推荐
相关产品推荐

