news 2026/5/11 12:47:50

Python爬虫实战:手把手教你如何采集软件文档“弃用功能”清单!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python爬虫实战:手把手教你如何采集软件文档“弃用功能”清单!

㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~
㊙️本期爬虫难度指数:⭐⭐ (中级)
🉐福利:一次订阅后,专栏内的所有文章可永久免费看,持续更新中,保底1000+(篇)硬核实战内容。

全文目录:

      • 🌟 开篇语
      • 0️⃣ 前言(Preface)
      • 1️⃣ 摘要(Abstract)
      • 2️⃣ 背景与需求(Why)
      • 3️⃣ 合规与注意事项(必写)
      • 4️⃣ 技术选型与整体流程(What/How)
      • 5️⃣ 环境准备与依赖安装(可复现)
      • 6️⃣ 核心实现:请求层(Fetcher)
      • 7️⃣ 核心实现:解析层(Parser)
      • 8️⃣ 数据存储与导出(Storage)
      • 9️⃣ 运行方式与结果展示(必写)
      • 🔟 常见问题与排错(强烈建议写)
      • 1️⃣1️⃣ 进阶优化(可视化报表 📊)
      • 1️⃣2️⃣ 总结与延伸阅读
      • 🌟 文末
        • ✅ 专栏持续更新中|建议收藏 + 订阅
        • ✅ 互动征集
        • ✅ 免责声明

🌟 开篇语

哈喽,各位小伙伴们你们好呀~我是【喵手】。
运营社区: C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO
欢迎大家常来逛逛,一起学习,一起进步~🌟

我长期专注Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略反爬对抗,从数据清洗分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上

📌专栏食用指南(建议收藏)

  • ✅ 入门基础:环境搭建 / 请求与解析 / 数据落库
  • ✅ 进阶提升:登录鉴权 / 动态渲染 / 反爬对抗
  • ✅ 工程实战:异步并发 / 分布式调度 / 监控与容错
  • ✅ 项目落地:数据治理 / 可视化分析 / 场景化应用

📣专栏推广时间:如果你想系统学爬虫,而不是碎片化东拼西凑,欢迎订阅专栏👉《Python爬虫实战》👈,一次订阅后,专栏内的所有文章可永久免费阅读,持续更新中。

💕订阅后更新会优先推送,按目录学习更高效💯~

0️⃣ 前言(Preface)

在软件开发的生命周期中,“弃用(Deprecation)”是新旧更替的必经之路。与其在编译报错时手忙脚乱,不如主动出击!今天我们要编写一个专门扫描软件官方文档的爬虫,自动化提取所有标记为deprecated的功能条目,并生成一份清晰的迁移指南。
读完本文你将获得:

  1. 掌握针对特定文档标签(如 Sphinx 的.. deprecated::渲染结果)的精准抓取技术。
  2. 学会如何从非结构化描述中提取“替代方案(Alternatives)”。
  3. 产出一份结构化的deprecated_features_report.csv

1️⃣ 摘要(Abstract)

本文以 Python 官方文档为目标,演示了如何使用requestsBeautifulSoup4遍历文档索引,精准识别并抓取弃用功能(Deprecated Features)。重点讲解了如何处理文档中的嵌套警告块,并将其转化为包含功能名、弃用版本及建议方案的结构化数据集。
核心看点:文档 DOM 深度解析、富文本内容清洗、迁移策略提取。

2️⃣ 背景与需求(Why)

为什么要爬这个?
大型项目的维护者需要定期审计依赖库的健康度。手动查阅数百页的 Release Notes 极易遗漏关键信息。通过爬虫,我们可以:

  • 自动化审计:快速比对当前项目使用的 API 是否已在弃用名单中。
  • 迁移加速:直接提取文档中的“推荐替代方案”,节省二次搜索时间。
  • 版本演进分析:通过统计不同版本的弃用频率,评估软件的变动剧烈程度。

目标字段清单:

  • feature_name:功能/函数/模块名
  • deprecated_version:开始弃用的版本号
  • deprecation_note:弃用原因说明
  • alternative:官方建议的替代方案
  • doc_url:该条目的官方文档原始链接

3️⃣ 合规与注意事项(必写)

抓取官方文档通常是合规且受支持的(文档本身就是为了传播),但仍需遵循:

  • Robots.txt 尊重:大多数技术文档允许爬虫索引,但应避开后台搜索接口。
  • 低频采集:官方文档服务器通常由 CDN 承载,但频繁请求仍可能触发 WAF 防护。建议设置1s以上的请求间隔。
  • 非侵入性:仅抓取公开展示的文字说明,不采集任何需要登录权限的内部预览版文档。

4️⃣ 技术选型与整体流程(What/How)

大多数现代软件文档(如 Python, Sphinx, ReadTheDocs)都是静态服务端渲染,非常适合使用高效的requests方案。
采集流程:

  1. [索引扫描]:访问文档的全局索引或搜索汇总页(如 Python 的library/index.html)。
  2. [标记提取]:识别文档中特殊的警告框(CSS 类名通常为.deprecated.admonition-deprecated)。
  3. [语义清洗]:将文本中的“Use XXX instead”识别为替代方案字段。
  4. [导出]:生成 CSV 并通过 Pandas 进行分类汇总。

5️⃣ 环境准备与依赖安装(可复现)

确保你的 Python 版本为 3.9+。我们需要安装核心工具包:

pipinstallrequests beautifulsoup4 pandas tenacity matplotlib

推荐项目结构:

doc_scanner/ ├── core/ │ ├── fetcher.py # 负责网页获取与重试 │ └── parser.py # 负责解析复杂的文档标签 ├── storage.py # 数据持久化 ├── main.py # 启动入口 └── reports/ # 存放输出 └── deprecated_features_list.csv

6️⃣ 核心实现:请求层(Fetcher)

文档页通常路径较深,我们需要处理可能出现的 404 或超时。

# fetcher.pyimportrequestsfromtenacityimportretry,stop_after_attempt,wait_fixedclassDocFetcher:def__init__(self):self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) PythonDocAudit/1.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9'}@retry(stop=stop_after_attempt(3),wait=wait_fixed(2))defget_content(self,url):try:resp=requests.get(url,headers=self.headers,timeout=15)resp.raise_for_status()returnresp.textexceptExceptionase:print(f"Error fetching{url}:{e}")raise

7️⃣ 核心实现:解析层(Parser)

这是最关键的一步。在 Sphinx 框架渲染的文档中,弃用信息通常在<div class="deprecated">标签内。

# parser.pyfrombs4importBeautifulSoupimportreclassDocParser:defparse_deprecated_items(self,html,source_url):soup=BeautifulSoup(html,'lxml')results=[]# 寻找所有的弃用警告块dep_blocks=soup.select('div.deprecated, div.admonition-deprecated')forblockindep_blocks:# 1. 提取版本号 (通常在 span.versionmodified)version_tag=block.select_one('span.versionmodified')version_text=version_tag.get_text(strip=True)ifversion_tagelse""# 提取数字,如 "Deprecated since version 3.12" -> "3.12"version=re.search(r'version\s+([\d\.]+)',version_text)version_num=version.group(1)ifversionelse"Unknown"# 2. 确定功能名 (通常是警告块之前的标题或 parent 容器的 ID)# 这里通过查找最近的锚点(Anchor)来定位parent=block.find_parent(['dl','section','div'])feature_id=parent.get('id','Global Scope')ifparentelse"N/A"# 3. 提取说明与替代方案# 移除版本标签后的剩余文本即为说明ifversion_tag:version_tag.extract()# 移除它以便只拿说明文字note=block.get_text(strip=True)# 语义识别替代方案 (查找 "Use", "instead", "Replacement" 等关键词)alt_match=re.search(r'(?:Use|Instead use|Recommended replacement is)\s+([^.]+)',note,re.I)alternative=alt_match.group(1).strip()ifalt_matchelse"See documentation"results.append({'feature_name':feature_id,'deprecated_version':version_num,'deprecation_note':note,'alternative':alternative,'doc_link':source_url})returnresults

8️⃣ 数据存储与导出(Storage)

我们使用 CSV 进行存储,方便开发者在 Excel 中直接筛选特定版本。

# storage.pyimportpandasaspdclassDeprecatedStorage:def__init__(self,filename='reports/deprecated_features_list.csv'):self.filename=filenamedefexport(self,data_list):ifnotdata_list:returndf=pd.DataFrame(data_list)# 字段映射表# feature_name: str, deprecated_version: str, alternative: strdf.to_csv(self.filename,index=False,encoding='utf-8-sig')print(f"📊 Report generated:{len(df)}items found.")

9️⃣ 运行方式与结果展示(必写)

# main.pyfromcore.fetcherimportDocFetcherfromcore.parserimportDocParserfromstorageimportDeprecatedStoragedefmain():# 示例:Python 官方文档中关于 collections 模块的弃用说明urls=["https://docs.python.org/3/library/collections.html","https://docs.python.org/3/library/stdtypes.html"]fetcher=DocFetcher()parser=DocParser()storage=DeprecatedStorage()all_deprecated=[]forurlinurls:print(f"🔍 Scanning:{url}")html=fetcher.get_content(url)items=parser.parse_deprecated_items(html,url)all_deprecated.extend(items)storage.export(all_deprecated)if__name__=="__main__":main()

输出示例 (3行结果):

feature_namedeprecated_versionalternativedoc_link
collections.Mapping3.10collections.abc.Mappinghttps://…/collections.html
asyncio.get_event_loop3.12asyncio.get_running_loophttps://…/asyncio.html
imp.find_module3.4importlibhttps://…/imp.html

🔟 常见问题与排错(强烈建议写)

  1. HTML 抓到空壳(SPA 文档)

    • 现象:React 或一些现代框架使用 Docusaurus 编写,内容是动态加载的。
    • 对策:这种文档通常会预渲染静态index.jsonsearch-index.js。直接抓取这些 JSON 文件,解析效率提升 10 倍!
  2. 选择器失效

    • 原因:不同版本的 Sphinx 渲染出的类名可能从deprecated变成admonition-deprecated
    • 对策:使用soup.find_all(class_=re.compile('deprecated'))模糊匹配类名。
  3. 替代方案提取不准

    • 原因:自然语言描述各异。
    • 对策:这是本爬虫的难点。进阶做法是将解析出的note喂给本地的 LLM(如 Ollama),让它精准提取Suggested Replacement

1️⃣1️⃣ 进阶优化(可视化报表 📊)

我们可以统计各版本弃用功能的数量,通过图表直观展示软件的架构演进。

defplot_deprecation_trend():importpandasaspdimportmatplotlib.pyplotasplt df=pd.read_csv('reports/deprecated_features_list.csv')# 统计每个版本的数量trend=df['deprecated_version'].value_counts().sort_index()plt.figure(figsize=(10,5))trend.plot(kind='line',marker='o',color='#E74C3C')# 强制全英文标签plt.title('Software Feature Deprecation Trend',fontsize=14)plt.xlabel('Deprecated Version',fontsize=12)plt.ylabel('Number of Features',fontsize=12)plt.grid(True,linestyle='--',alpha=0.6)plt.tight_layout()plt.savefig('reports/deprecation_chart.png')print("📈 Visualization saved: reports/deprecation_chart.png")

1️⃣2️⃣ 总结与延伸阅读

通过本文,我们构建了一个能够深入软件文档底层,自动识别“弃用陷阱”的搜索型爬虫。这套方案对于维护长期项目的代码质量具有不可替代的价值。
下一步:

  • 接入 CI/CD:在每次更新依赖库前自动运行,生成依赖审计报告。
  • 搜索型进化:结合Google Search APIBing Search,自动根据“Software Name + deprecated”关键词寻找所有相关的三方库弃用信息。

🌟 文末

好啦~以上就是本期的全部内容啦!如果你在实践过程中遇到任何疑问,欢迎在评论区留言交流,我看到都会尽量回复~咱们下期见!

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦~
三连就是对我写作道路上最好的鼓励与支持!❤️🔥

✅ 专栏持续更新中|建议收藏 + 订阅

墙裂推荐订阅专栏 👉 《Python爬虫实战》,本专栏秉承着以“入门 → 进阶 → 工程化 → 项目落地”的路线持续更新,争取让每一期内容都做到:

✅ 讲得清楚(原理)|✅ 跑得起来(代码)|✅ 用得上(场景)|✅ 扛得住(工程化)

📣想系统提升的小伙伴:强烈建议先订阅专栏 《Python爬虫实战》,再按目录大纲顺序学习,效率十倍上升~

✅ 互动征集

想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战?

评论区留言告诉我你的需求,我会优先安排实现(更新)哒~


⭐️ 若喜欢我,就请关注我叭~(更新不迷路)
⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力)
⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)


✅ 免责声明

本文爬虫思路、相关技术和代码仅用于学习参考,对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。

使用或者参考本项目即表示您已阅读并同意以下条款:

  • 合法使用: 不得将本项目用于任何违法、违规或侵犯他人权益的行为,包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。
  • 风险自负: 任何因使用本项目而产生的法律责任、技术风险或经济损失,由使用者自行承担,项目作者不承担任何形式的责任。
  • 禁止滥用: 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。
  • 使用或者参考本项目即视为同意上述条款,即 “谁使用,谁负责” 。如不同意,请立即停止使用并删除本项目。!!!
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 12:47:09

宇树GO2机器人ROS2控制实战:从零到自主导航的完整指南

宇树GO2机器人ROS2控制实战&#xff1a;从零到自主导航的完整指南 【免费下载链接】go2_ros2_sdk Unofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU 项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk Unitree GO2 ROS2 SDK是一个专为宇树科技GO2系列…

作者头像 李华
网站建设 2026/5/11 12:45:36

从global.prop入手:打造你的专属Keil5(MDK)高亮主题

1. 为什么需要定制Keil5主题&#xff1f; 作为一名嵌入式开发者&#xff0c;我每天至少有8小时盯着Keil5的代码编辑器。默认的蓝底白字主题看久了眼睛发酸&#xff0c;关键字高亮也不够明显。后来我发现&#xff0c;通过修改global.prop文件可以彻底改变编辑器的视觉体验。 glo…

作者头像 李华
网站建设 2026/5/11 12:43:46

LVGL Canvas画布实战:5分钟教你制作一个可交互的简易绘图板

LVGL Canvas画布实战&#xff1a;5分钟教你制作一个可交互的简易绘图板 在嵌入式GUI开发领域&#xff0c;LVGL因其轻量级和高度可定制性成为众多开发者的首选。而Canvas画布控件作为其核心组件之一&#xff0c;能够实现从简单图形绘制到复杂交互界面的各种功能。今天&#xff0…

作者头像 李华
网站建设 2026/5/11 12:43:29

三步掌握B站字幕提取:从观看者到内容创作者的转变

三步掌握B站字幕提取&#xff1a;从观看者到内容创作者的转变 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 想要将B站视频中的知识精华转化为可编辑的文字资料吗…

作者头像 李华