医疗数据采集怕踩红线?Python合规抓取公开病历与疾病趋势分析全流程
做医疗相关数据分析或者公共卫生研究的朋友应该都遇到过数据难题想做疾病趋势分析却不知道哪些数据能合法采集要么找不到公开数据源要么怕一不小心触碰患者隐私红线。网上很多教程一上来就教爬医院系统殊不知很多操作已经踩了合规的红线甚至涉嫌违法。前段时间帮朋友做一组公开疾病数据的趋势分析从数据源筛选、合规采集、文本清洗结构化到最后的趋势分析与可视化完整走了一遍流程。全程只采集完全公开的匿名聚合数据不碰任何个人隐私信息最终出来的分析结果完全能满足常规研究需求。今天就把完整的实现思路、核心代码和合规注意事项全部分享出来全程合法合规新手也能照着复现。一、先划红线医疗数据采集的合规边界与数据源选择做医疗数据采集合规永远是第一位的比技术实现重要一百倍。一旦触碰了个人隐私数据后果不堪设想。先把不能碰的红线划清楚绝对不能爬取医院内部系统、非公开的电子病历系统哪怕有可访问账号也不行绝对不能采集包含患者姓名、身份证号、联系方式、具体就诊记录等可识别个人身份的信息不能突破网站的授权机制爬取需要权限才能查看的非公开数据不能对采集到的数据进行二次传播、商用要严格遵守数据使用协议合规可采集的公开医疗数据不是所有医疗数据都不能碰以下几类公开数据是可以合规采集的各级卫健委、疾控局官方发布的公开疾病监测数据、统计报表公立医疗机构公开的年度医疗质量报告、疾病科普与汇总数据公开医学期刊、学术平台发布的匿名化病例汇总数据国家公共卫生科学数据中心等官方平台开放的共享数据集法定公开的传染病疫情通报、公共卫生事件数据这些数据都是经过匿名化、聚合处理的公开信息采集时遵守网站robots协议和使用规定控制请求频率就完全合规。技术选型为什么选这套轻量方案而不是更复杂的技术栈采集层官方公开站点大多是传统服务端渲染页面没有复杂的前端反爬requestsBeautifulSoup完全够用轻量高效处理层医疗文本结构化用正则自定义医疗词典配合pandas做数据处理比通用大模型更可控准确率也能满足需求分析层pandas做统计聚合、时间序列分析搭配matplotlib做可视化本地就能跑无需额外部署合规性全程只处理公开聚合数据不涉及任何个人隐私识别整体处理流程二、分步实操从采集到分析的完整实现2.1 公开数据采集以官方疾病监测数据为例这里以某地方卫健委公开的月度疾病监测数据为例这类数据通常以表格形式分页展示没有复杂反爬重点是控制频率规范采集。核心思路先获取列表页解析每条数据的详情链接再逐个采集详情页的内容最后汇总成结构化表。注意不要开高并发单线程加间隔避免给服务器造成压力。核心代码片段import requests from bs4 import BeautifulSoup import pandas as pd import time session requests.Session() session.headers.update({ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Referer: [http://wjw.xxx.gov.cn/disease/list/](http://wjw.xxx.gov.cn/disease/list/) }) disease_list [] total_page 12 # 公开数据总页数 for page in range(1, total_page 1): url f[http://wjw.xxx.gov.cn/disease/list/index_{page}.html](http://wjw.xxx.gov.cn/disease/list/index_{page}.html) resp session.get(url, timeout10) resp.encoding utf-8 soup BeautifulSoup(resp.text, html.parser) # 解析列表中的每条数据 items soup.find_all(div, class_list-item) for item in items: title item.find(a).text.strip() detail_url item.find(a)[href] publish_date item.find(span, class_date).text.strip() # 只采集月度疾病监测通报 if 月度疾病监测 in title: disease_list.append({ title: title, detail_url: detail_url, publish_date: publish_date }) print(f第{page}页采集完成当前累计{len(disease_list)}条) time.sleep(1.5) # 控制请求频率避免给服务器造成压力 # 采集详情页数据 detail_data [] for idx, item in enumerate(disease_list): resp session.get(item[detail_url], timeout10) resp.encoding utf-8 soup BeautifulSoup(resp.text, html.parser) content soup.find(div, class_content).text.strip() detail_data.append({ month: item[title], publish_date: item[publish_date], content: content }) time.sleep(1) if idx % 10 0: print(f详情页采集进度{idx1}/{len(disease_list)}) # 保存原始数据 df pd.DataFrame(detail_data) df.to_csv(disease_raw.csv, indexFalse, encodingutf-8-sig) print(f采集完成共获取{len(df)}份月度监测数据)几个关键的合规细节严格控制请求频率每页间隔1秒以上绝不使用多并发轰炸官方站点只采集公开可访问的页面不尝试绕过登录、不破解权限采集的数据仅用于研究分析不二次传播、不商用2.2 医疗文本清洗与实体结构化提取采集下来的原始数据大多是自然语言文本比如“本月报告甲类传染病2例乙类传染病1256例其中病毒性肝炎320例肺结核280例…”需要从中提取出疾病名称、病例数、时间这些结构化字段。通用的NLP模型对医疗术语的识别准确率很低这里不用复杂模型用正则匹配自定义疾病词典的方案准确率高可控性强完全能处理标准化的公开报告。第一步先构建自定义疾病词典把常见的传染病、慢性病名称整理进去# 自定义疾病词典示例可根据需求扩展 DISEASE_DICT [ 病毒性肝炎, 肺结核, 梅毒, 淋病, 细菌性痢疾, 流行性感冒, 手足口病, 水痘, 麻疹, 风疹, 高血压, 糖尿病, 冠心病, 脑梗死, 恶性肿瘤 ]然后写提取函数从文本中匹配疾病名称和对应的病例数import re import pandas as pd df pd.read_csv(disease_raw.csv) def extract_disease_data(text, month): 从监测文本中提取疾病名称和病例数 results [] # 预处理去掉多余空格和换行 text re.sub(r\s, , text) for disease in DISEASE_DICT: # 匹配模式疾病名称 数字 例 pattern re.compile(f{disease}[^0-9]*(\d)[^0-9]*例) match pattern.search(text) if match: count int(match.group(1)) results.append({ month: month, disease: disease, case_count: count }) return results # 批量提取所有月份的数据 all_data [] for _, row in df.iterrows(): month_data extract_disease_data(row[content], row[month]) all_data.extend(month_data) # 转成DataFrame structured_df pd.DataFrame(all_data) # 数据校验剔除异常值 structured_df structured_df[structured_df[case_count] 0] structured_df structured_df[structured_df[case_count] 100000] # 合理范围校验 structured_df.to_csv(disease_structured.csv, indexFalse, encodingutf-8-sig) print(f结构化完成共提取{len(structured_df)}条疾病数据)补充说明真实场景的文本格式会更多样需要根据实际报告的格式调整正则规则可以加入同义词映射比如“乙肝”对应“病毒性肝炎乙型”提高召回率提取完一定要做数据校验剔除明显不符合常理的异常值避免影响分析结果2.3 疾病趋势统计分析与可视化数据结构化之后就可以做多维度的趋势分析了。常规的分析维度包括时间维度的发病趋势、疾病类型的占比分布、季节性特征分析、同比环比变化等。这里做两个最常用的分析月度发病趋势变化、疾病类型占比分析。核心代码片段import pandas as pd import matplotlib.pyplot as plt import matplotlib # 设置中文显示 matplotlib.rcParams[font.sans-serif] [SimHei] matplotlib.rcParams[axes.unicode_minus] False df pd.read_csv(disease_structured.csv) # 1. 月度总发病数趋势 monthly_total df.groupby(month)[case_count].sum().reset_index() plt.figure(figsize(12, 6)) plt.plot(monthly_total[month], monthly_total[case_count], markero, linewidth2, color#1f77b4) plt.title(月度法定传染病发病数趋势, fontsize14) plt.xlabel(月份, fontsize12) plt.ylabel(发病数例, fontsize12) plt.xticks(rotation45) plt.grid(alpha0.3) plt.tight_layout() plt.savefig(monthly_trend.png, dpi300) plt.close() # 2. 疾病类型占比全年汇总 disease_total df.groupby(disease)[case_count].sum().reset_index() disease_total disease_total.sort_values(case_count, ascendingFalse).head(10) plt.figure(figsize(10, 6)) plt.bar(disease_total[disease], disease_total[case_count], color#2ca02c) plt.title(全年各类疾病发病数TOP10, fontsize14) plt.xlabel(疾病类型, fontsize12) plt.ylabel(发病数例, fontsize12) plt.xticks(rotation45) plt.tight_layout() plt.savefig(disease_rank.png, dpi300) plt.close() # 3. 计算同比环比 monthly_total[month_num] range(1, len(monthly_total)1) monthly_total[mom] monthly_total[case_count].pct_change() * 100 # 环比 monthly_total[yoy] monthly_total[case_count].pct_change(12) * 100 # 同比 print(月度发病数同比环比) print(monthly_total[[month, case_count, mom, yoy]].tail(6))这样就能得到直观的趋势图表和统计数据满足常规的公共卫生研究、数据分析需求。如果需要更深入的分析还可以加入地区维度、人群维度的交叉分析。三、踩坑实录医疗数据采集分析最容易踩的5个坑这套流程跑下来踩了不少和医疗数据特性相关的坑很多都是做普通数据采集碰不到的整理出来帮大家避坑。3.1 合规红线坑别拿隐私数据开玩笑这是最重要的一条。很多人觉得反正数据在网页上就能看到爬下来也没事。实际上只要包含可识别的个人信息哪怕是公开在医院网站上的批量采集也可能涉嫌侵犯个人信息。记住一个原则只采集聚合的、匿名的、统计类的数据不碰任何具体的个人就诊记录。哪怕是公开的病例也要确认是完全匿名化、无法定位到个人的。3.2 数据口径不一致坑直接对比等于白分析不同地区、不同年份的疾病统计口径很可能不一样比如有的地方把疑似病例算进去有的只算确诊有的月份调整了统计范围。如果不看说明直接拉过来就对比分析出来的趋势完全是错的。采集的时候一定要把每个报告的统计说明、口径注释一起保存下来分析前先对齐口径不一致的数据不能放在一起比。3.3 医疗实体识别坑通用NLP根本不好用最开始图省事用通用的分词工具做实体提取结果疾病名称识别错漏百出把“病毒性肝炎”拆成“病毒”“性”“肝炎”根本没法用。医疗领域有大量专业术语通用模型没有经过专项训练准确率极低。不要迷信大模型小批量标准化的数据用自定义词典正则的方案准确率更高还更可控。3.4 数据失真坑公开数据也会“改数”官方公开的监测数据有时候会有修正比如本月发布的数据下个月可能会订正。如果采集完就不管了后面数据更新了你也不知道分析结果就会有偏差。建议定期增量更新数据同时保留历史版本标注数据的采集时间和发布版本出现差异的时候可以追溯。3.5 采集频率坑别给官方服务器添乱医疗相关的官方站点服务器资源大多优先保障业务使用尤其是疾控、卫健委的网站遇到公共卫生事件的时候访问量本来就大。这时候开多线程高并发去爬不仅不道德还很容易被封IP甚至可能承担相应责任。单线程1秒以上间隔是基本操作数据量不大的话慢一点也没关系合规稳定最重要。四、总结医疗数据采集分析技术从来都不是最大的难点合规才是。很多人一上来就研究怎么爬医院系统、怎么搞病历数据方向从一开始就错了。实际上公开的官方统计数据、学术共享数据已经足够满足绝大多数研究和学习需求。

相关新闻

咨询报告和商业方案发给客户,怎么避免“方案看完了,项目却没签”?

咨询报告和商业方案发给客户,怎么避免“方案看完了,项目却没签”?

咨询公司、独立顾问、市场研究机构经常遇到一个很现实的问题:客户需要先看方案,才能决定是否合作。但问题是:方案本身往往就是服务价值的一部分。例如:市场分析;企业诊断;品牌策略;商业方案&…

2026/9/25 13:15:26 阅读更多 →
LTspice变压器仿真:耦合电感建模与参数化扫描实战

LTspice变压器仿真:耦合电感建模与参数化扫描实战

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

2026/9/24 7:49:15 阅读更多 →
计算机网络课后答案高效利用:从对答案到建错题索引

计算机网络课后答案高效利用:从对答案到建错题索引

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

2026/9/24 7:49:15 阅读更多 →

最新新闻

3D校园导航系统开发实战:Three.js与A*算法应用解析

3D校园导航系统开发实战:Three.js与A*算法应用解析

1. 项目立项与需求分析1.1 为什么选择3D校园导航这个思路来源于一次典型的“软件工程课程设计”式需求:给学校做一个校园导航系统。但一开始大家讨论的是平面地图导航,类似百度地图那种。后来聊到新生报到的时候,很多人在校园里找不到楼、找不…

2026/9/25 13:54:16 阅读更多 →
5个免费AI写作软件搭配TaoToken:效率办公告别熬夜加班苦日子

5个免费AI写作软件搭配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/25 13:54:16 阅读更多 →
AI视频生成新手第一课:用Seedance2-Skill快速上手即梦Seedance 2.0提示词(完整指南)

AI视频生成新手第一课:用Seedance2-Skill快速上手即梦Seedance 2.0提示词(完整指南)

AI视频生成新手第一课:用Seedance2-Skill快速上手即梦Seedance 2.0提示词(完整指南) 【免费下载链接】seedance2-skill skill to create best prompts for generating videos with seedance2.0 项目地址: https://gitcode.com/gh_mirrors/s…

2026/9/25 13:54:16 阅读更多 →
C#酒店管理系统源码实战:WinForms前台与SQL Server后台全解析

C#酒店管理系统源码实战:WinForms前台与SQL Server后台全解析

简介:这是一套基于C#的酒店管理系统源码,适合学习桌面应用程序开发、酒店业务信息化管理的学生或初级开发者使用。系统覆盖前台与后台两大核心场景:前台支持预约、入住、换房、退房结算、客户信息维护及按房间号消费;后台提供财产…

2026/9/25 13:54:16 阅读更多 →
Atlas 300V 24G加速卡详解与YOLO部署实战指南

Atlas 300V 24G加速卡详解与YOLO部署实战指南

如果你最近在网络上看过"atlas"这个词,八成绕不开华为昇腾系列AI加速卡。作为长期做深度学习部署的从业者,我几乎每天都要跟它打交道。最近不少朋友在问两件事:一是"atlas部署yolo怎么搞",二是"atlas 30…

2026/9/25 13:54:16 阅读更多 →
Agent技能模块化实战:解耦、注册表与稳定性设计

Agent技能模块化实战:解耦、注册表与稳定性设计

第一次尝试构建一个全能型Agent时,我很快发现了一个尴尬的事实:无论我把主循环写得多么巧妙,真正决定好不好用的,永远是那些挂在外面的小工具。我最早的那个Agent,里塞了几十种能力,从查天气到读PDF再到调用…

2026/9/25 13:53:15 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →