Python爬虫实战:手把手教你如何采集灌区基础信息公开页!

发布时间:2026/5/21 15:27:29

Python爬虫实战:手把手教你如何采集灌区基础信息公开页! ㊗️本期内容已收录至专栏《Python爬虫实战》持续完善知识体系与项目实战建议先订阅收藏后续查阅更方便㊙️本期爬虫难度指数⭐ (基础入门篇)福利一次订阅后专栏内的所有文章可永久免费看持续更新中保底1000(篇)硬核实战内容。全文目录 开篇语0️⃣ 前言Preface1️⃣ 摘要Abstract2️⃣ 背景与需求Why3️⃣ 合规与注意事项必写4️⃣ 技术选型与整体流程What/How5️⃣ 环境准备与依赖安装可复现6️⃣ 核心实现请求层Fetcher7️⃣ 核心实现解析层Parser8️⃣ 数据存储与导出Storage9️⃣ 运行方式与结果展示必写 常见问题与排错强烈建议写1️⃣1️⃣ 进阶优化可选但加分1️⃣2️⃣ 总结与延伸阅读 文末✅ 专栏持续更新中建议收藏 订阅✅ 互动征集✅ 免责声明 开篇语哈喽各位小伙伴们你们好呀我是【喵手】。运营社区 C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO欢迎大家常来逛逛一起学习一起进步我长期专注Python 爬虫工程化实战主理专栏 《Python爬虫实战》从采集策略到反爬对抗从数据清洗到分布式调度持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”让数据价值真正做到——抓得到、洗得净、用得上。专栏食用指南建议收藏✅ 入门基础环境搭建 / 请求与解析 / 数据落库✅ 进阶提升登录鉴权 / 动态渲染 / 反爬对抗✅ 工程实战异步并发 / 分布式调度 / 监控与容错✅ 项目落地数据治理 / 可视化分析 / 场景化应用专栏推广时间如果你想系统学爬虫而不是碎片化东拼西凑欢迎订阅专栏《Python爬虫实战》一次订阅后专栏内的所有文章可永久免费阅读持续更新中。订阅后更新会优先推送按目录学习更高效0️⃣ 前言Preface本文目标利用 Python 的requestslxml库从灌区信息公开页抓取完整的名录信息并重点解决“面积单位”和“建设时间”的自动化归一化问题。读完收益掌握XPath 定位嵌套表格的万能公式。学会利用正则表达式Regex优雅地进行单位换算与数值提取。产出一份干净、可直接用于计算的结构化灌区数据集。1️⃣ 摘要Abstract项目概况本项目针对灌区基础信息公开页通过封装请求与解析模块实现对灌区名、流域、面积、地区等 5 个维度的自动化采集。技术亮点重点攻克文本型数值的“脱壳”与单位转换。核心收获掌握规则型名录抓取全流程提升数据清洗Data Cleaning的工程化思维。2️⃣ 背景与需求Why为什么要爬水资源分析评估不同流域的农业灌溉压力。历史演变研究分析不同年代建设灌区的分布规律。自动化整合将原本需要手动翻页、复制的表格数据瞬间转化为 Excel。目标字段清单灌区名 (District Name)流域 (Basin)设计灌溉面积 (Design Area) ——清洗重点地区 (Region)建设时间 (Construction Time) ——格式归一化3️⃣ 合规与注意事项必写robots.txt此类站点通常属于公益性信息公开遵守基础抓取协议。频率控制建议设置1s 左右的抓取间隔。我们要像春雨润物细无声不要给对方服务器造成压力。合规声明一切以技术分享和学术分析为主不涉及非公开敏感信息不绕过登录限制。4️⃣ 技术选型与整体流程What/How技术栈静态解析流Static Scraper。选型理由灌区页面多为传统的服务端渲染结构稳定。使用lxml配合 XPath 的解析速度极快且代码可读性极佳。逻辑流程采集 (Fetcher)→解析 (XPath Extraction)→清洗 (Unit Normalization)→存储 (CSV)5️⃣ 环境准备与依赖安装可复现Python 版本3.10依赖安装pipinstallrequests lxml pandas推荐项目目录irrigation_project/ ├── main.py # 逻辑入口 ├── data_cleaner.py # 核心清洗工具函数 └── irrigation_basic_info.csv # 最终产出数据6️⃣ 核心实现请求层Fetcher我们需要一个稳健的请求头防止被误判。importrequestsdeffetch_irrigation_html(url):headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) Irrigation-Data-Bot/1.0,Accept:text/html,application/xhtmlxml,xml;q0.9,Connection:keep-alive}try:responserequests.get(url,headersheaders,timeout15)response.raise_for_status()# 很多老站点用的是 gbk建议自动识别response.encodingresponse.apparent_encodingreturnresponse.textexceptExceptionase:print(f❌ Oops, failed to link:{e})returnNone7️⃣ 核心实现解析层Parser实战重点单位清洗逻辑这是最展现基本功的地方。fromlxmlimportetreeimportredefclean_area(text): 清洗面积字段将 12.5万亩 或 800公顷 统一转为 亩 (mu) ifnottext:return0.0# 提取数字含小数点num_matchre.search(r\d\.?\d*,text.replace(,,))ifnotnum_match:return0.0valfloat(num_match.group())if万intext:val*10000if公顷intext:val*15# 1公顷 15亩returnround(val,2)defparse_irrigation_table(html):treeetree.HTML(html)# 定位表格中的数据行rowstree.xpath(//table[classdata-list]//tr[position()1])records[]forrowinrows:tdsrow.xpath(./td)iflen(tds)5:continueraw_area.join(tds[2].xpath(.//text())).strip()records.append({district_name:.join(tds[0].xpath(.//text())).strip(),basin:.join(tds[1].xpath(.//text())).strip(),design_area_mu:clean_area(raw_area),# 这里的清洗是灵魂region:.join(tds[3].xpath(.//text())).strip(),construction_year:re.search(r\d{4},.join(tds[4].xpath(.//text()))).group()ifre.search(r\d{4},.join(tds[4].xpath(.//text())))elseUnknown})returnrecords8️⃣ 数据存储与导出Storage导出为 CSV。文件名为irrigation_districts_basic_info.csv。字段映射表Field (En)TypeExampledistrict_nameStringDujiangyan (都江堰)basinStringMin River (岷江)design_area_muFloat11300000.0regionStringSichuan Provinceconstruction_yearString19509️⃣ 运行方式与结果展示必写运行命令python main.py结果展示district_name,basin,design_area_mu,region,construction_year Dujiangyan,Min River,11300000.0,Sichuan,1950 Hetao Irrigation,Yellow River,10000000.0,Inner Mongolia,1960 常见问题与排错强烈建议写Q: 拿到的面积是 0A:检查你的正则是否漏掉了带逗号的数字如1,250。我在代码里加了replace(,, )来兼容。Q: 表格跨行导致数据错位A:很多灌区名录有合并单元格。你可以先用item.xpath(normalize-space(.))这种方式预处理整行文本。Q: 建设时间写的是“清代”或者“汉代”A:这种情况正则\d{4}会失效建议在清洗函数中增加一个if 代 in text: return text的特殊判断逻辑。1️⃣1️⃣ 进阶优化可选但加分数据可视化Visualizations如果抓取完数据你可以用 Matplotlib 生成一个图表。请确保使用英文标注。Title: “Distribution of Irrigation Areas by Basin”X-axis: “Basin Name”Y-axis: “Total Area (Million Mu)”并发提升使用ThreadPoolExecutor开启 4-8 个线程并行处理多个页面效率翻倍⚡️1️⃣2️⃣ 总结与延伸阅读复盘今天我们攻克了灌区名录抓取中最核心的“单位归一化”问题这是一切数据分析的基础。下一步如果你想更进一步可以尝试抓取灌区渠道的地理矢量数据那会涉及到更复杂的地理空间解析逻辑 文末好啦以上就是本期的全部内容啦如果你在实践过程中遇到任何疑问欢迎在评论区留言交流我看到都会尽量回复咱们下期见小伙伴们在批阅的过程中如果觉得文章不错欢迎点赞、收藏、关注哦三连就是对我写作道路上最好的鼓励与支持❤️✅ 专栏持续更新中建议收藏 订阅墙裂推荐订阅专栏 《Python爬虫实战》本专栏秉承着以“入门 → 进阶 → 工程化 → 项目落地”的路线持续更新争取让每一期内容都做到✅ 讲得清楚原理✅ 跑得起来代码✅ 用得上场景✅ 扛得住工程化想系统提升的小伙伴强烈建议先订阅专栏 《Python爬虫实战》再按目录大纲顺序学习效率十倍上升✅ 互动征集想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战评论区留言告诉我你的需求我会优先安排实现(更新)哒~⭐️ 若喜欢我就请关注我叭更新不迷路⭐️ 若对你有用就请点赞支持一下叭给我一点点动力⭐️ 若有疑问就请评论留言告诉我叭我会补坑 更新迭代✅ 免责声明本文爬虫思路、相关技术和代码仅用于学习参考对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。使用或者参考本项目即表示您已阅读并同意以下条款合法使用 不得将本项目用于任何违法、违规或侵犯他人权益的行为包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。风险自负 任何因使用本项目而产生的法律责任、技术风险或经济损失由使用者自行承担项目作者不承担任何形式的责任。禁止滥用 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。使用或者参考本项目即视为同意上述条款,即 “谁使用谁负责” 。如不同意请立即停止使用并删除本项目。

相关新闻