欢迎光临
我们一直在努力

Python爬虫实战:手把手教你如何解构 ICD-11 医学分类体系,构建标准树结构索引库!

㊗️本期内容已收录至专栏《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)

本文将带你利用 Python 爬取 WHO(世界卫生组织)发布的 ICD-11 章节目录。我们将通过代码自动化提取医学编码的层级关系,为后续开发智能病案编码或医学检索系统打下基础。

读完本文你将获得:

  • 分级解析方案:掌握如何处理医学分类中的父子(Parent-Child)关联逻辑。
  • 树结构索引思维:学会如何将嵌套的网页链接转化为结构化的层级数据。
  • 工业级异常处理:应对医学专业术语中特殊字符和复杂链接的实战经验。
  • 1️⃣ 摘要(Abstract)

    本文演示使用 requests 结合 BeautifulSoup(或官方 API 模拟)采集 ICD-11 章节索引。通过核心解析逻辑,处理章节名、编码、上级分类及简介,最终产出名为 icd11_chapters_index.csv 的标准化数据集。

    2️⃣ 背景与需求(Why)

    • 为什么要爬:ICD-11 是全球临床记录和统计的标准。手动查阅网页非常低效,将这些数据结构化后,可以轻松集成到电子病历(EMR)系统或医疗大数据分析平台中。

    • 目标字段清单:

      • Chapter Name: 章节名称(如:Certain infectious or parasitic diseases)。
      • Chapter Code: 章节编码(如:01)。
      • Parent Category: 上级分类编码(根目录默认为 ROOT)。
      • Description: 章节简介。
      • Detail_Link: 进一步展开的链接。

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

    • 尊重官方 API/站点:WHO 提供了正式的 ICD API。如果是大规模抓取,强烈建议注册 API 密钥。本教程以教学解析逻辑为主,请务必设置合理的 time.sleep(3)。
    • 不绕过授权:请勿尝试抓取未公开的草案(Drafts)或付费内容,保持技术分享的合规性。
    • 非医疗建议说明:抓取的数据仅供参考和科研使用,不得作为临床诊断的唯一依据。

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

    • 技术选型:

      • Requests: 处理网络连接。
      • BeautifulSoup (LXML): ICD 页面层级分明,使用 CSS 选择器可以快速定位节点。
      • JSON/CSV: 适合存储树状映射关系。
    • 整体流程: 首页加载 → 获取章节根节点 → 提取层级信息 → 解析描述文本 → 递归/循环构建索引 → 导出。

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

    • Python 版本: 3.9+

    • 依赖安装:

      pip install requests beautifulsoup4 pandas lxml

    • 项目结构:

      icd11_project/
      ├── data/
      │ └── icd11_chapters_index.csv # 最终产出
      ├── src/
      │ └── parser.py # 解析核心逻辑
      └── main.py # 运行主入口

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

    由于 WHO 站点可能涉及多语言切换,我们需要在 Headers 中明确语言偏好。

    import requests
    import time

    def fetch_icd_content(url):
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Medical-Indexer-Bot/1.0',
    'Accept-Language': 'en-US,en;q=0.9',
    'Accept': 'text/html,application/xhtml+xml,xml;q=0.9',
    }
    try:
    response = requests.get(url, headers=headers, timeout=25)
    response.raise_for_status()
    # 强制指定 UTF-8,确保医学特殊字符不乱码
    response.encoding = 'utf-8'
    return response.text
    except Exception as e:
    print(f"❌ Connection Error: {e}")
    return None

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

    实战重点:提取编码与父子关系。

    from bs4 import BeautifulSoup

    def parse_icd_chapters(html_content, parent_code="ROOT"):
    soup = BeautifulSoup(html_content, 'lxml')
    chapters = []

    # 假设章节列表包含在 class="category-list" 的元素中
    items = soup.select('.category-list-item')

    for item in items:
    try:
    # 提取编码和名称,如 "01 Certain infectious…"
    full_text = item.select_one('.code-name').get_text(strip=True)
    code = full_text.split(' ')[0]
    name = " ".join(full_text.split(' ')[1:])

    # 提取描述(可能在详情面板中)
    description = item.select_one('.description').get_text(strip=True) if item.select_one('.description') else ""

    link = item.select_one('a')['href']

    chapters.append({
    'chapter_code': code,
    'chapter_name': name,
    'parent_code': parent_code,
    'description': description,
    'link': link
    })
    except (AttributeError, IndexError):
    continue

    return chapters

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

    我们要建立一个字段映射表,方便后续导入图数据库(Graph Database)或关系型数据库。

    • 文件名: icd11_chapters_index.csv
    • 字段映射表:
    Field (CSV)TypeExampleDescription
    chapter_code String 01 ICD-11 Chapter Code
    chapter_name String Neoplasms Title of the chapter
    parent_code String ROOT Hierarchy parent
    description String This chapter covers… Brief definition
    link URL http://… URL for drill-down

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

    • 启动命令: python main.py

    • CSV 结果预览:

      chapter_code,chapter_name,parent_code,description,link
      01,Certain infectious or parasitic diseases,ROOT,Diseases caused by…,http://…
      02,Neoplasms,ROOT,Tumors and other…,http://…

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

  • 页面是通过 AJAX 动态加载的:

    • 现象:直接请求返回的 HTML 找不到分类列表。
    • 对策:使用 F12 监控 XHR 请求,直接抓取后端返回的 JSON 数据(通常比解析 HTML 更稳定)。
  • 编码包含特殊拉丁字符:

    • 对策:保存 CSV 时务必使用 encoding='utf-8-sig',否则 Excel 打开会乱码。
  • 树结构太深导致递归溢出:

    • 对策:建议使用**广度优先搜索(BFS)**逻辑,配合队列(Queue)逐层抓取,而不是深层递归。
  • 1️⃣1️⃣ 进阶优化(可视化演示)

    为了验证我们抓取的层级关系,可以生成一个简单的层级分布图(采用英文标签)。

    import matplotlib.pyplot as plt

    def plot_chapter_distribution(df):
    plt.figure(figsize=(12, 6))
    # 统计各父节点下的子节点数量
    df['parent_code'].value_counts().plot(kind='bar', color='teal')
    plt.title('ICD-11 Hierarchy Distribution')
    plt.xlabel('Parent Category Code')
    plt.ylabel('Sub-category Count')
    plt.grid(axis='y', alpha=0.3)
    plt.savefig('icd_tree_structure.png')
    print("📈 Tree visualization saved as icd_tree_structure.png")

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

    通过本次实战,我们成功将 ICD-11 的复杂分类体系转化为了可索引的树结构字典。这不仅是爬虫技术的胜利,更是医学数据治理的重要一步。

    下一步建议:

    • 尝试接入 WHO ICD API,获取更详尽的术语定义。
    • 学习如何将这些层级数据存入 Neo4j 图数据库,实现医学知识图谱的检索。

    🌟 文末

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

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

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

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

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

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

    ✅ 互动征集

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

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


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


    ✅ 免责声明

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

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

    • 合法使用: 不得将本项目用于任何违法、违规或侵犯他人权益的行为,包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。
    • 风险自负: 任何因使用本项目而产生的法律责任、技术风险或经济损失,由使用者自行承担,项目作者不承担任何形式的责任。
    • 禁止滥用: 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。
    • 使用或者参考本项目即视为同意上述条款,即 “谁使用,谁负责” 。如不同意,请立即停止使用并删除本项目。!!!

    赞(0)
    未经允许不得转载:171主机测评 » Python爬虫实战:手把手教你如何解构 ICD-11 医学分类体系,构建标准树结构索引库!
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址