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

发布时间:2026/11/12 11:46: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/11/10 22:00:38

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

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

2026/11/10 23:39:55

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

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

2026/11/12 11:24:36

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

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

2026/11/12 11:45:49

电工证如何分等级全国通用合格标准与通过率全解析

电工证如何分等级全国通用合格标准与通过率全解析 怕考不过白交培训费?你不是一个人。电工证是特种作业操作证中需求量最大的一种,全国通用,但很多学员最担心的就是考试不通过,培训费打水漂。别急,本文从洛阳涧西区劳务班组负责人的角度出发,详细讲讲电…

2026/11/12 11:45:49

石家庄应急局电工证多久拿证 电工证过期了不知道怎么复审延期怎么办

石家庄应急局电工证多久拿证 电工证过期了不知道怎么复审延期怎么办 证书过期了不知道怎么复审延期?你不是一个人。很多人在拿到电工证后,忙于工作或生活中其他事情,一不留神就错过了复审时间。石家庄应急局电工证是从事电工相关工作的“通行证”,一旦过…

2026/11/12 11:45:49

0经验裸考高压电工证的真实经历:工地太忙根本没时间复习考试

0经验裸考高压电工证的真实经历:工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是我刚毕业那会儿的真实写照。当时在商丘的一个工地上做电工,每天从早上六点忙到晚上十点,脑子里全是线缆、配电箱、开关这些活儿,根本没时间去想考试的事。但…

2026/11/12 11:45:49

架子工特种作业操作证过期了怎么办?全国通用证书复审攻略来了

架子工特种作业操作证过期了怎么办?全国通用证书复审攻略来了 证书过期了不知道怎么复审延期?架子工特种作业操作证是全国通用的,但很多人在证书到期后,才发现补办流程并不简单,甚至因为操作不当导致证书失效,影响工作。今天咱们就来聊聊架子工特种作业…

2026/11/12 11:45:48

电工证分国网省网么多久拿证不花冤枉钱

电工证分国网省网么多久拿证不花冤枉钱 怕考不过白交培训费?电工证分国网省网么?多久拿证?很多人在报名前都担心这些问题,尤其是刚入行的学员,生怕花了钱最后拿不到证。其实,只要流程走对、准备充分,电工证办理并不难。下面我会从焦作培训机构学员的角…

2026/11/12 11:40:48

遂川电工证在哪里报名内部消息全公开,平顶山房建人必看

遂川电工证在哪里报名内部消息全公开,平顶山房建人必看 现在找电工类工作, 没有电工证连面试资格都没 ,尤其是在平顶山从事房建工程的你,电工证是刚需。很多人跑遍了遂川,却不知道哪儿才是正规报名渠道, 内部消息…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/12 9:51:42

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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