ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

河湖长制公开水质公报与饮用水源地监测框架:用 Python 自动解析 PDF/Excel 表格并统一入库

河湖长制公开水质公报与饮用水源地监测框架:用 Python 自动解析 PDF/Excel 表格并统一入库 ㊗️本期内容已收录至专栏《Python爬虫实战》持续完善知识体系与项目实战建议先订阅收藏后续查阅更方便㊙️本期爬虫难度指数⭐⭐⭐⭐⭐专家级福利一次订阅后专栏内的所有文章可永久免费看持续更新中保底1000(篇)硬核实战内容。全文目录 开篇语0️⃣ 前言Preface1️⃣ 摘要Abstract2️⃣ 背景与需求Why目标站点类型目标字段清单3️⃣ 合规与注意事项3.1 robots.txt 基本说明3.2 频率控制3.3 不采集敏感信息3.4 中性技术用途4️⃣ 技术选型与整体流程What/How4.1 静态、动态与 API 的判断4.2 整体流程4.3 为什么选择这些工具5️⃣ 环境准备与依赖安装可复现5.1 创建虚拟环境5.2 安装依赖5.3 推荐项目结构 文末✅ 专栏持续更新中建议收藏 订阅✅ 互动征集✅ 免责声明 开篇语哈喽各位小伙伴们你们好呀我是【喵手】。运营社区 C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO欢迎大家常来逛逛一起学习一起进步我长期专注Python 爬虫工程化实战主理专栏 《Python爬虫实战》从采集策略到反爬对抗从数据清洗到分布式调度持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”让数据价值真正做到——抓得到、洗得净、用得上。专栏食用指南建议收藏✅ 入门基础环境搭建 / 请求与解析 / 数据落库✅ 进阶提升登录鉴权 / 动态渲染 / 反爬对抗✅ 工程实战异步并发 / 分布式调度 / 监控与容错✅ 项目落地数据治理 / 可视化分析 / 场景化应用专栏推广时间如果你想系统学爬虫而不是碎片化东拼西凑欢迎订阅专栏《Python爬虫实战》一次订阅后专栏内的所有文章可永久免费阅读持续更新中。订阅后更新会优先推送按目录学习更高效0️⃣ 前言Preface这篇文章要做的事情很明确使用 Python 采集公开发布的河湖长制水质公报、饮用水源地监测报告和地方水务局定期公示文件并把 PDF、Excel 中不太规整的水质表格统一整理成结构化数据最终导出为 CSV 与 SQLite 数据库。读完本文你可以获得一套面向公开水质公报的采集、解析、清洗、存储完整流程。一份可运行的 Python 项目代码支持公开网页列表页、PDF 文件、Excel 文件的自动化处理。一套字段标准化思路能够把不同地区、不同格式的水质表格统一到section_id、river_name、ph、do、nh3_n、water_quality_class、date等字段中。我个人比较喜欢做这类“半结构化公开数据”的处理。它不像普通网页列表那样整齐也不像标准 API 那样舒服。真实工作中很多公报数据藏在 PDF、Excel、Word 附件里标题写法不同、列名不统一、表格还经常跨页。要把这些材料变成可以长期分析的数据最重要的不是写一个“能跑一次”的脚本而是搭一个足够稳、足够宽容的解析框架。1️⃣ 摘要Abstract本文围绕河湖长制公开水质公报、饮用水源地监测结果和公开水文站指标使用requests BeautifulSoup pdfplumber pandas SQLite构建一个自动化采集与解析框架将不规则 PDF/Excel 报告统一整理成标准水质监测数据表。读完本文你能掌握如何从公开水务、水利、生态环境相关网站的公示页面中提取 PDF/Excel 附件链接。如何解析 PDF 与 Excel 中的水质指标表格并处理列名不一致、缺失值、跨行、空格、单位混杂等问题。如何设计字段映射、去重、失败重试、日志记录和数据导出流程让脚本更接近真实项目而不是一次性玩具代码。本文默认处理的核心字段如下字段名含义section_id断面编号或断面名称river_name河流、湖泊、水库或水源地名称phpH 值do溶解氧nh3_n氨氮water_quality_class水质类别date监测日期或公报日期2️⃣ 背景与需求Why水质公报属于典型的公开信息聚合场景。不同地区会定期发布河流断面、水库、湖泊、集中式饮用水源地的监测结果。这些数据本身具备较强的分析价值比如按月份追踪某个断面的水质类别变化。对比不同河流、不同水源地的 pH、溶解氧、氨氮等指标。把分散在多个公开网站、多个 PDF 或 Excel 附件中的数据集中到一个数据库里。为后续可视化、预警分析、报告自动生成提供基础数据。但实际采集时麻烦通常不在“下载文件”而在“解析文件”。公开公报常见形式包括网页正文里的 HTML 表格。附件 PDF表格可能跨页、合并单元格、列名换行。附件 Excel列名可能在第二行或第三行前几行是标题和说明。文件命名不统一例如“2024年7月水质监测结果.pdf”“饮用水源地水质状况表.xlsx”“河湖长制水质断面情况公示表.xls”。因此本文不把目标做成“只适配某一个网页”而是设计一个通用框架。你只需要配置公开公示页面 URL程序会尽量识别页面中的 PDF、XLS、XLSX 附件下载后自动解析并标准化。目标站点类型本文适用的目标来源主要是公开网页和公开附件例如水利部门公开公报页面。地方水务局、水利局、生态环境局定期公示页面。公开水文站、水质断面监测结果公告。河湖长制专题栏目中的监测结果附件。目标字段清单标准字段说明常见原始列名section_id断面编号、断面名称、采样点名称断面、断面名称、监测点位、采样点、水源地名称river_name河流、湖泊、水库、饮用水源地名称河流名称、河湖名称、所在水体、水源地、河流phpH 值pH、PH、pH值、酸碱度do溶解氧溶解氧、DO、DO(mg/L)、溶解氧(mg/L)nh3_n氨氮氨氮、NH3-N、氨氮(mg/L)、NH₃-Nwater_quality_class水质类别水质类别、类别、现状类别、评价类别date日期监测时间、采样日期、发布日期、公报日期、月份3️⃣ 合规与注意事项做爬虫之前先把合规边界说清楚。技术分享不等于无边界采集。公开水质公报一般是公开发布的信息但公开不代表可以高频、无节制、绕限制地抓取。3.1 robots.txt 基本说明robots.txt是网站用于说明爬虫访问规则的文本文件通常位于网站根目录下例如https://example.gov.cn/robots.txt在采集前建议先查看目标网站是否声明了不允许抓取的目录。即使robots.txt没有禁止也应保持低频访问避免对服务器造成压力。本文代码只面向公开页面与公开附件不涉及绕过登录、验证码、权限控制或付费限制。3.2 频率控制本文的示例程序默认采用低频请求策略每次请求设置timeout避免长时间阻塞。请求失败后进行有限次数重试。重试时采用退避等待不做攻击式并发。下载附件时对文件做缓存已经下载过的不重复请求。真实项目中如果目标网站服务器响应较慢建议进一步降低频率例如每次请求间隔 1–3 秒或只在业务低峰时段运行。3.3 不采集敏感信息本文只处理公开的水质监测数据字段不采集个人身份信息、不采集账号信息、不采集需要授权访问的数据。对于登录可见、付费可见、验证码保护、接口加密或明确禁止自动访问的内容应停止采集。3.4 中性技术用途本文讨论的是公开数据整理、格式统一、数据分析准备工作。示例代码只用于学习、研究和内部数据治理场景。正式使用前应结合目标网站的使用条款、公开信息使用规则和单位内部数据管理要求进行评估。4️⃣ 技术选型与整体流程What/How本文处理的是公开网页列表页和公开附件文件主要属于“静态页面 附件解析”类型。多数水质公报页面并不需要复杂浏览器渲染使用requests就能获取页面 HTML如果某些站点的列表由 JavaScript 动态加载再考虑抓接口或使用 Playwright。4.1 静态、动态与 API 的判断一般可以按下面方式判断类型特征推荐工具静态 HTML浏览器查看源代码能看到标题和附件链接requests BeautifulSoup/lxml动态渲染查看源代码没有数据开发者工具 Network 里有接口优先抓公开接口其次 Playwright标准 API返回 JSON 数据requests附件型数据PDF、Excel、Word 附件中含数据pdfplumber、pandas、openpyxl本文的重点是附件型数据尤其是 PDF 和 Excel 表格解析。4.2 整体流程完整流程可以概括为公开公示页面 ↓ 采集 Fetcher请求列表页提取 PDF/Excel 附件链接 ↓ 下载 Downloader保存附件到本地 data/raw ↓ 解析 Parser根据文件类型解析 PDF 或 Excel 表格 ↓ 清洗 Cleaner统一列名、数值、日期、水质类别 ↓ 存储 Storage写入 CSV 与 SQLite ↓ 复核 Review输出样例、日志、失败文件清单也可以写成四个核心步骤采集 → 解析 → 清洗 → 存储其中最容易出错的是“解析”和“清洗”。例如同样表示氨氮不同表格里可能写成氨氮 氨氮(mg/L) NH3-N NH₃-N 氨氮以N计如果不做列名映射数据就会散掉。4.3 为什么选择这些工具本文选型如下工具用途选择原因requests请求网页和附件轻量、稳定、适合静态页面BeautifulSoup提取附件链接对不规范 HTML 容错较好lxml加速解析解析速度快兼容 XPath 思路pdfplumber提取 PDF 表格对文本型 PDF 表格支持较好pandas读取 Excel、清洗表格表格处理方便openpyxl读取 xlsxpandas 读取 xlsx 的常用依赖xlrd读取 xls兼容旧版 Excelsqlite3本地数据库Python 内置适合轻量落地loguru日志输出清晰便于排错如果规模很大可以换成 Scrapy如果页面必须浏览器渲染可以加入 Playwright如果后期要做调度可以接入 Airflow 或 cron。5️⃣ 环境准备与依赖安装可复现建议使用 Python 3.11 或 Python 3.12。本文代码在 Python 3.11 风格下编写。5.1 创建虚拟环境mkdirwater_quality_spidercdwater_quality_spider python-mvenv .venvWindows 激活方式.venv\Scripts\activatemacOS / Linux 激活方式source.venv/bin/activate5.2 安装依赖pipinstallrequests beautifulsoup4 lxml pandas openpyxl xlrd pdfplumber python-dateutil loguru tqdm如果希望使用配置文件也可以安装pipinstallpyyaml5.3 推荐项目结构water_quality_spider/ ├── main.py ├── config.py ├── requirements.txt ├── README.md ├── data/ │ ├── raw/ │ │ ├── pdf/ │ │ └── excel/ │ ├── output/ │ │ ├── water_quality.csv │ │ └── water_quality.sqlite │ └── logs/ │ └── run.log └── water_spider/ ├── __init__.py ├── fetcher.py ├── parser_pdf.py ├── parser_excel.py ├── cleaner.py ├── storage.py └── utils.py为了方便复制运行后文会给出主要文件代码。你可以按照这个结构创建文件也可以先把代码 文末好啦以上就是本期的全部内容啦如果你在实践过程中遇到任何疑问欢迎在评论区留言交流我看到都会尽量回复咱们下期见小伙伴们在批阅的过程中如果觉得文章不错欢迎点赞、收藏、关注哦三连就是对我写作道路上最好的鼓励与支持❤️✅ 专栏持续更新中建议收藏 订阅墙裂推荐订阅专栏 《Python爬虫实战》本专栏秉承着以“入门 → 进阶 → 工程化 → 项目落地”的路线持续更新争取让每一期内容都做到✅ 讲得清楚原理✅ 跑得起来代码✅ 用得上场景✅ 扛得住工程化想系统提升的小伙伴强烈建议先订阅专栏 《Python爬虫实战》再按目录大纲顺序学习效率十倍上升✅ 互动征集想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战评论区留言告诉我你的需求我会优先安排实现(更新)哒~⭐️ 若喜欢我就请关注我叭更新不迷路⭐️ 若对你有用就请点赞支持一下叭给我一点点动力⭐️ 若有疑问就请评论留言告诉我叭我会补坑 更新迭代✅ 免责声明本文爬虫思路、相关技术和代码仅用于学习参考对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。使用或者参考本项目即表示您已阅读并同意以下条款合法使用 不得将本项目用于任何违法、违规或侵犯他人权益的行为包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。风险自负 任何因使用本项目而产生的法律责任、技术风险或经济损失由使用者自行承担项目作者不承担任何形式的责任。禁止滥用 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。使用或者参考本项目即视为同意上述条款,即 “谁使用谁负责” 。如不同意请立即停止使用并删除本项目。
返回列表