使用requests.get从NIST NVD拉取数据时,如何追加JSON文件而非覆盖?
问题解决:NVD数据抓取后追加到JSON文件而非覆盖
原代码的核心问题
- 循环中仅将
response对象存入列表,但最终只处理了最后一次请求的响应,完全没用到之前存的jsonAppend列表,相当于只抓了最后一页数据 - 写入文件用
"w"模式直接覆盖,且未读取已有文件的内容,根本没实现"追加"逻辑 - JSON是结构化数据,不能像文本那样直接追加内容,必须先合并新旧数据再整体写入
修改后的代码实现
import json import requests import gzip # 替换成你的实际文件路径 jsonPathMedium = "medium_cves.json" jsonPathMediumCompressed = "medium_cves.json.gz" base_url = "https://services.nvd.nist.gov/rest/json/cves/2.0?cvssV3Severity=MEDIUM&resultsPerPage=2000&" headers = {"Accept": "application/json", "Authorization": "Bearer 123456"} ids = ['startIndex=0', 'startIndex=2000'] # 初始化总数据列表,先尝试读取已有文件的内容 all_vulnerabilities = [] try: with open(jsonPathMedium, "r") as f: existing_data = json.load(f) # 取出已有的漏洞数据(假设原有结构和NVD返回一致,核心在vulnerabilities字段) if "vulnerabilities" in existing_data: all_vulnerabilities.extend(existing_data["vulnerabilities"]) except FileNotFoundError: # 文件不存在则直接开始新抓取 pass # 遍历分页抓取数据并合并 for idx_param in ids: response = requests.get(base_url + idx_param, headers=headers) response.raise_for_status() # 捕获请求错误 data = response.json() # 将当前页的漏洞数据追加到总列表 all_vulnerabilities.extend(data.get("vulnerabilities", [])) print(f"已抓取分页 {idx_param} 的数据") # 构造完整的JSON结构(和NVD返回格式一致) final_data = { "resultsPerPage": 2000, "startIndex": 0, "totalResults": len(all_vulnerabilities), "vulnerabilities": all_vulnerabilities } # 写入合并后的JSON文件 with open(jsonPathMedium, "w") as jsonFileMedium: json.dump(final_data, jsonFileMedium, indent=4) print("已写入合并后的中危漏洞JSON文件") # 压缩文件 with open(jsonPathMedium, 'rb') as mediumIn, gzip.open(jsonPathMediumCompressed, 'wb') as mediumOut: mediumOut.writelines(mediumIn) print("已压缩中危漏洞JSON文件")
关键修改说明
- 合并新旧数据:先尝试读取已有文件,将原有漏洞数据导入总列表,再把新抓取的分页数据追加进去
- 正确处理JSON结构:保持和NVD API返回的结构一致,确保后续使用数据时格式统一
- 错误处理:加入
response.raise_for_status()捕获请求失败的情况,避免无效数据写入 - 优化文件操作:用嵌套
with语句处理压缩,自动管理文件关闭,避免资源泄漏
内容的提问来源于stack exchange,提问作者tortillas21
相关产品推荐
相关产品推荐

