循环调用NYT API写入TXT文件异常问题及修复方案
NYT Archive API 批量获取文章问题修复
问题概述
使用NYT Archive API获取1851年至今的文章,按年月生成独立TXT文件用于情感分析。测试1851年数据时发现:该年仅11、12月有有效内容,1-8月应生成空文件,但9、10月未生成有效文件,仅11、12月内容成功写入。
前置要求
- 注册并获取NYT API密钥,填充代码中
API_KEY =后的空白处 - 提前创建对应目录:原代码需创建
txt_holder文件夹,修复后代码需创建txt_folder文件夹
原错误代码
# 调用NYT API抓取每年每月文章到独立TXT文件,用于逐月情感分析 # 导入请求库 import requests # 导入日期模块获取当前年份 import datetime import time API_KEY = # 此处填入你的NYT API密钥 def files_and_count(): # NYT数据始于1850年 year_increment = 1850 today = datetime.date.today() year = today.year months = 0 while year_increment != 1851: year_increment = year_increment + 1 while months != 12: months = months + 1 query = str(year_increment) + "/" + str(months) real_file_name = str(year_increment) + "_" + str(months) file_name = str('txt_holder/' + real_file_name + '.txt') file = open(file_name, 'w') search(query, API_KEY, file) months = 0 # 调用API并写入文件的函数 def search(query, API_KEY, file): # 拼接API请求URL,包含查询参数和密钥 url = f'https://api.nytimes.com/svc/archive/v1/{query}.json?api-key={API_KEY}' print(url) # API请求间隔时间 time.sleep(12) try: # 发送请求 response = requests.get(url) # 解析JSON内容 content = response.json() # 遍历所有文章 for item in content["response"]["docs"]: # 获取文章标题 text = item["headline"]["main"] # 每个标题单独一行写入文件 file.write(text + "\n") except: print('请求失败') files_and_count()
原代码核心问题
- 循环逻辑缺陷:外层
while循环仅执行一次(year_increment从1850变为1851后直接退出),虽测试场景仅需处理1851年,但逻辑冗余且易出错;内层while循环的月份递增方式存在边界隐患。 - 异常捕获过于宽泛:
except:捕获所有异常,包括1851年9、10月无内容时的KeyError(访问content["response"]["docs"]失败),直接跳过写入但未保证文件正常保存。 - 文件未正确关闭:打开文件后未调用
file.close(),可能导致文件内容未持久化,出现空文件或未生成文件的情况。
修复后代码
# 导入请求库 import requests # 导入日期模块获取当前年份 import datetime import time API_KEY = # 此处填入你的NYT API密钥 def files_and_count(): # NYT数据始于1850年 today = datetime.date.today() year = today.year # 遍历1851年至当前年份 for i in range(1851, year): # 遍历1-12月 for months in range(1, 13): query = str(i) + "/" + str(months) real_file_name = str(i) + "_" + str(months) file_name = str('txt_folder/' + real_file_name + '.txt') # 使用with语句自动管理文件生命周期,确保关闭 with open(file_name, 'w') as file: search(query, API_KEY, file) # 调用API并写入文件的函数 def search(query, API_KEY, file): # 拼接API请求URL,包含查询参数和密钥 url = f'https://api.nytimes.com/svc/archive/v1/{query}.json?api-key={API_KEY}' print(url) # API请求间隔时间 time.sleep(12) try: # 发送请求并检查HTTP状态码 response = requests.get(url) response.raise_for_status() # 解析JSON内容 content = response.json() # 遍历所有文章 for item in content["response"]["docs"]: # 获取文章标题 text = item["headline"]["main"] # 每个标题单独一行写入文件 file.write(text + "\n") except ValueError: print(f'[{query}] 无法解析API返回的JSON内容') except KeyError: print(f'[{query}] API返回数据无对应字段') except requests.exceptions.RequestException: print(f'[{query}] API请求失败或无法连接') files_and_count()
修复要点
- 重构循环结构:用
for循环替代while循环,逻辑更直观,避免边界错误,同时支持批量处理1851年至当前年份的所有数据。 - 优化文件管理:使用
with open(...) as file语句自动处理文件关闭,确保内容正确持久化,解决9、10月文件未生成的问题。 - 精准异常捕获:拆分捕获不同类型的异常,添加月份标识便于快速定位问题,避免因宽泛捕获导致的逻辑跳过。
- 增加状态码校验:添加
response.raise_for_status(),主动捕获HTTP请求错误(如404、500等),提升代码健壮性。
内容的提问来源于stack exchange,提问作者unmute-me
相关产品推荐
相关产品推荐

