Python爬虫实战:高效采集NVD漏洞数据库

发布时间:2026/9/18 14:47:22

Python爬虫实战:高效采集NVD漏洞数据库 1. 项目概述爬取NVD漏洞数据的实用价值美国国家漏洞数据库NVD作为全球最权威的漏洞信息库之一收录了超过20万条CVE漏洞记录。对于安全研究人员、企业IT管理者和开发者而言定期获取这些数据具有多重价值漏洞情报监控实时掌握新披露漏洞的严重程度和影响范围风险评估依据通过CVSS评分快速判断漏洞修复优先级安全工具开发为漏洞扫描器、SIEM系统提供基础数据支持学术研究素材分析漏洞趋势、攻击模式演变的量化依据传统手动查询方式效率低下而NVD提供的API存在调用频率限制官方建议每分钟不超过5次请求。通过Python爬虫实现自动化采集可以灵活获取结构化数据特别适合需要定制化字段或历史数据归档的场景。2. 技术方案设计思路2.1 网页爬取 vs API调用NVD同时提供网页端和API两种数据获取方式我们选择网页爬取方案主要基于以下考量字段完整性网页包含漏洞描述、解决方案等API未提供的细节信息历史数据可获取早年间未通过API标准化的老旧漏洞记录灵活性不受API版本变更和字段限制影响成本控制避免企业级API的调用配额管理注意虽然网页爬取更灵活但必须严格遵守NVD的robots.txt规定。实测发现NVD允许爬虫访问/cve目录但要求请求间隔至少6秒。2.2 目标数据结构设计我们需要提取的字段包括{ cve_id: CVE-2023-1234, severity: CRITICAL, cvss_score: 9.8, published_date: 2023-01-15, last_modified: 2023-03-22, description: 在XX组件中发现缓冲区溢出漏洞..., affected_products: [Windows 10, Windows Server 2019] }2.3 技术栈选型请求库Requests Retrying比urllib3更友好的重试机制解析工具BeautifulSoup4 lxml比正则表达式更稳定的选择数据存储csv/json双格式输出兼顾可读性和程序可处理性反反爬随机User-Agent 动态延迟模拟人类操作模式3. 核心实现细节解析3.1 请求层实现要点from retrying import retry import random import time class NVDCrawler: def __init__(self): self.base_url https://nvd.nist.gov/vuln/search/results self.delay 6 random.uniform(0, 3) # 基础6秒随机扰动 retry(stop_max_attempt_number3, wait_exponential_multiplier1000) def fetch_page(self, page_num): params { form_type: Basic, results_type: overview, search_type: all, startIndex: (page_num - 1) * 20 } headers { User-Agent: self._get_random_ua() } time.sleep(self.delay) response requests.get(self.base_url, paramsparams, headersheaders) response.raise_for_status() return response.text def _get_random_ua(self): ua_list [ Mozilla/5.0 (Windows NT 10.0; Win64; x64)..., Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)... ] return random.choice(ua_list)关键设计说明指数退避重试网络异常时自动重试每次间隔时间倍增动态延迟在6秒基础上增加0-3秒随机扰动避免固定周期被识别分页参数startIndex每页增加20NVD的默认分页大小3.2 解析层关键技术NVD页面采用动态生成的HTML结构需要通过实际DOM分析确定选择器from bs4 import BeautifulSoup def parse_page(html): soup BeautifulSoup(html, lxml) items [] for row in soup.select(table[data-testidvuln-results-table] tr): cve_id row.select_one(th a).text.strip() severity row.select_one(span[data-testidvuln-cvss3-panel-score]).text cvss_score float(severity.split()[0]) date_cols row.select(td)[2].find_all(span) pub_date date_cols[0].text mod_date date_cols[1].text if len(date_cols) 1 else pub_date desc row.select_one(p[data-testidvuln-summary-]).text items.append({ cve_id: cve_id, severity: severity, cvss_score: cvss_score, published_date: pub_date, last_modified: mod_date, description: desc }) return items解析难点处理动态属性使用data-testid而非class作为选择器锚点空值处理未修改的漏洞last_modified等于published_date文本清洗CVSS评分需要从9.8 CRITICAL中分离数值4. 数据存储与导出方案4.1 多格式输出实现import csv import json from datetime import datetime class DataExporter: staticmethod def to_csv(data, filename): with open(f{filename}.csv, w, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnamesdata[0].keys()) writer.writeheader() writer.writerows(data) staticmethod def to_json(data, filename): with open(f{filename}.json, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) staticmethod def to_excel(data, filename): # 使用pandas简化Excel导出 import pandas as pd df pd.DataFrame(data) df.to_excel(f{filename}.xlsx, indexFalse)4.2 字段类型转换处理原始数据需要规范化def normalize_data(raw_items): for item in raw_items: # 日期标准化 item[published_date] datetime.strptime( item[published_date], %m/%d/%Y).strftime(%Y-%m-%d) # 严重等级枚举化 item[severity] item[severity].split()[-1].upper() # 描述文本清洗 item[description] .join( item[description].split()).strip() return raw_items5. 实战问题排查指南5.1 常见问题解决方案问题现象可能原因解决方案返回403状态码请求头特征明显1. 更换User-Agent2. 添加Referer头解析到空列表HTML结构变更1. 检查最新DOM结构2. 改用更宽松的选择器日期解析失败格式区域差异1. 强制指定locale2. 使用dateutil解析器内存占用过高未分页处理1. 分批处理数据2. 使用生成器替代列表5.2 性能优化建议增量采集# 记录最后采集的CVE_ID last_cve get_last_record() if item[cve_id] last_cve: break异步请求需控制并发数import aiohttp async def fetch_all(pages): async with aiohttp.ClientSession() as session: tasks [fetch_page(session, p) for p in range(1, pages1)] return await asyncio.gather(*tasks)分布式扩展使用Redis存储已采集ID集合通过Celery分发采集任务6. 合规使用注意事项访问频率控制单IP请求间隔≥6秒每日采集量建议≤1000页避免商业时段高峰期操作数据使用限制禁止重新发布原始数据衍生分析需注明数据来源不得用于漏洞利用工具开发技术伦理建议添加明显的用户代理标识提供可联系的爬虫负责人邮箱遵循最少必要原则采集数据在实际运行中建议先小规模测试如采集前10页确认无误后再进行全量采集。对于企业级应用场景更推荐申请官方API密钥获取数据。
延伸阅读

更多相关文章

2026/9/18 14:47:21

5G+智慧文旅方案:网络指标计算与场景落地实践

简介:这份5G智慧文旅解决方案PPT,面向通信运营商、政企解决方案经理、智慧旅游规划人员及行业分析师,围绕5G如何赋能文旅行业展开,适合用于智慧城市、文旅信息化、景区智慧化等项目的策划与支撑。内容从国家政策导向与旅游行业痛点…

2026/9/18 14:47:21

冒险岛GM命令原理与服务端权限校验详解

简介:本资源是《冒险岛》游戏GM(游戏管理员)专用命令速查手册,面向服务器运维人员、私服搭建者及资深玩家,用于高效执行地图切换、物品发放、玩家管理、世界配置与怪物召唤等核心管理操作。PDF文档共1页,大…

2026/9/18 14:42:21

system_prompts_leaks:系统提示词归档、对比与防泄露实践

1. 先搞清楚 system_prompts_leaks 这类项目到底在做什么第一次看到system_prompts_leaks这个名字,很多人的第一反应是"这东西合规吗"。我当初也是这个反应。但把仓库拉下来翻了两天之后,我的判断变了:它本质上是一份公开的提示词工…

2026/9/18 15:37:27

OpenManus 拆解贪吃蛇任务计划,Base URL 填 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 15:37:27

冷库监控系统flask框架机器学习模型计算机毕业设计项目

冷库监控系统是一个集成了现代传感器技术、数据采集与传输技术以及Web开发框架的综合系统,旨在实现对冷库环境参数的实时监控、数据管理和可视化展示。该系统通过部署在冷库内的各类传感器,实时采集温度、湿度、二氧化碳浓度、压力和氧气含量等关键环境参…

2026/9/18 15:37:27

开源知识库问答,TaoToken 的 Key 别写进前端

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 15:37:27

面向教育的在线课程管理系统设计与实现

摘 要在教育信息化加速推进的当下,传统教学课程管理模式在效率与精准度上的短板日益凸显。人工处理教学事务耗时费力,数据管理分散且易出错,难以满足现代教育对高效、智能管理的需求。在此背景下,开发先进的在线课程管理系统系统…

2026/9/18 15:37:27

多模态记忆检索用 MemoraX AI 时,TaoToken 的 Key 放在哪

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 15:32:27

MOSFET驱动电路设计核心参数:从米勒平台到栅极电阻

1. 为什么手册参数看得懂,驱动波形还是翻车做电源和电机驱动这些年,我见过太多"手册参数门儿清、一上示波器就傻眼"的场面。同事拿着数据手册来找我:"这管子Qg才40nC,按公式算开关时间绰绰有余,为什么栅…

2026/9/18 14:13:01

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/18 14:13:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/18 14:13:02

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/18 14:13:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码