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

循环调用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()

原代码核心问题

  1. 循环逻辑缺陷:外层while循环仅执行一次(year_increment从1850变为1851后直接退出),虽测试场景仅需处理1851年,但逻辑冗余且易出错;内层while循环的月份递增方式存在边界隐患。
  2. 异常捕获过于宽泛:except:捕获所有异常,包括1851年9、10月无内容时的KeyError(访问content["response"]["docs"]失败),直接跳过写入但未保证文件正常保存。
  3. 文件未正确关闭:打开文件后未调用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()

修复要点

  1. 重构循环结构:用for循环替代while循环,逻辑更直观,避免边界错误,同时支持批量处理1851年至当前年份的所有数据。
  2. 优化文件管理:使用with open(...) as file语句自动处理文件关闭,确保内容正确持久化,解决9、10月文件未生成的问题。
  3. 精准异常捕获:拆分捕获不同类型的异常,添加月份标识便于快速定位问题,避免因宽泛捕获导致的逻辑跳过。
  4. 增加状态码校验:添加response.raise_for_status(),主动捕获HTTP请求错误(如404、500等),提升代码健壮性。

内容的提问来源于stack exchange,提问作者unmute-me

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:35:02