Python爬虫实战:手把手教你如何历史建筑保护名录元数据深度采集!
㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~
㊙️本期爬虫难度指数:⭐ (基础入门篇)
🉐福利:一次订阅后,专栏内的所有文章可永久免费看,持续更新中,保底1000+(篇)硬核实战内容。
全文目录:
- 🌟 开篇语
- 0️⃣ 前言(Preface)
- 1️⃣ 摘要(Abstract)
- 2️⃣ 背景与需求(Why)
- 3️⃣ 合规与注意事项(必写)
- 4️⃣ 技术选型与整体流程(What/How)
- 5️⃣ 环境准备与依赖安装(Setup)
- 6️⃣ 核心实现:请求层(Fetcher)
- 7️⃣ 核心实现:解析层(Parser)
- 8️⃣ 数据存储与导出(Storage)
- 9️⃣ 运行方式与结果展示(Execution)
- 🔟 常见问题与排错(Troubleshooting)
- 1️⃣1️⃣ 进阶优化(Optional)
- 1️⃣2️⃣ 总结与延伸阅读
- 🌟 文末
- ✅ 专栏持续更新中|建议收藏 + 订阅
- ✅ 互动征集
- ✅ 免责声明
🌟 开篇语
哈喽,各位小伙伴们你们好呀~我是【喵手】。
运营社区: C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO
欢迎大家常来逛逛,一起学习,一起进步~🌟
我长期专注Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。
📌专栏食用指南(建议收藏)
- ✅ 入门基础:环境搭建 / 请求与解析 / 数据落库
- ✅ 进阶提升:登录鉴权 / 动态渲染 / 反爬对抗
- ✅ 工程实战:异步并发 / 分布式调度 / 监控与容错
- ✅ 项目落地:数据治理 / 可视化分析 / 场景化应用
📣专栏推广时间:如果你想系统学爬虫,而不是碎片化东拼西凑,欢迎订阅专栏👉《Python爬虫实战》👈,一次订阅后,专栏内的所有文章可永久免费阅读,持续更新中。
💕订阅后更新会优先推送,按目录学习更高效💯~
0️⃣ 前言(Preface)
一句话说明:本文将利用 Python 自动化采集政府公开的历史建筑保护名录,将零散的网页表格转化为包含建筑名、地点、年代及保护级别的结构化 CSV 数据库。
读完能获得什么:
- 掌握**文化遗产类元数据(Cultural Heritage Metadata)**的精准解析与归一化技巧。
- 学会处理政府类静态站点常见的“嵌套表格”与“多行合并”难题。
- 产出一份可用于城市规划分析或文化研究的标准数据集。🏰
1️⃣ 摘要(Abstract)
本文聚焦于历史建筑名录的自动化提取。通过Requests获取页面,利用BeautifulSoup的层级遍历能力,攻克非标准化年代描述的提取痛点,并最终实现数据的持久化存储。
2️⃣ 背景与需求(Why)
为什么要爬:历史建筑是不可再生的文化资源。通过数据爬取,我们可以进行城市建筑年代分布分析、保护级别权重研究,甚至为古建筑爱好者提供离线地图支持。
目标字段清单:
Building_Name: 建筑名称(如:武康大楼)Address: 具体地点/街道Era: 建造年代(如:1924年)Protection_Level: 保护级别(如:国家级、市级)Brief_Description: 建筑特色或保护说明
3️⃣ 合规与注意事项(必写)
- robots.txt 基本说明:政府信息公开类页面通常允许抓取,但禁止用于商业镜像或恶意篡改。
- 频率控制:此类站点通常维护频率较低,服务器带宽有限。建议单线程爬取,每请求一次休息 2s 以上,避免造成“拒绝服务攻击”的假象。
- 敏感性声明:不涉及未公开的内部保护档案,仅采集官方已公示的社会公开数据。
4️⃣ 技术选型与整体流程(What/How)
- 类型:静态 HTML 列表页(部分含二级跳转)。
- 选型理由:
Requests+BS4组合在处理这种结构相对传统(多为 Table 标签嵌套)的政府页面时,比 Scrapy 更轻便,调试更直观。 - 流程图:
5️⃣ 环境准备与依赖安装(Setup)
Python 版本:3.10+
安装命令:
pipinstallrequests beautifulsoup4 pandas lxml项目结构:
heritage_scraper/ ├── main.py # 核心运行逻辑 ├── utils.py # 年代清洗工具函数 └── output/ # 存放生成的 CSV 文件
6️⃣ 核心实现:请求层(Fetcher)
政府站点往往对Referer和User-Agent有特定要求,必须完整伪装。
importrequestsclassHeritageFetcher:def__init__(self):self.headers={"User-Agent":"Heritage-Data-Bot/1.0 (Educational Research)","Referer":"http://www.heritage-gov.example/",# 模拟来源页"Accept":"text/html,application/xhtml+xml"}deffetch(self,url):try:# 增加 timeout 应对响应缓慢的政府服务器response=requests.get(url,headers=self.headers,timeout=20)response.raise_for_status()response.encoding='utf-8'# 显式指定编码防止乱码returnresponse.textexceptExceptionase:print(f"❌ Error fetching data:{e}")returnNone7️⃣ 核心实现:解析层(Parser)
实战重点:跨行合并(Rowspan)的字段补全。在很多名录中,同一地点的多个建筑会合并单元格,直接抓取会导致字段缺失。
frombs4importBeautifulSoupdefparse_heritage_table(html):soup=BeautifulSoup(html,'lxml')table=soup.find('table')buildings=[]current_address=""# 用于补全跨行合并的地点forrowintable.find_all('tr')[1:]:# 略过表头cols=row.find_all('td')ifnotcols:continue# 补全逻辑:如果当前单元格为空,沿用上一行的地点addr=cols[1].get_text(strip=True)ifaddr:current_address=addrelse:addr=current_address data={"name":cols[0].get_text(strip=True),"address":addr,"era":cols[2].get_text(strip=True),"level":cols[3].get_text(strip=True)}buildings.append(data)returnbuildings8️⃣ 数据存储与导出(Storage)
我们将使用 Pandas 的DataFrame来导出数据,并进行去重处理(防止页面翻页导致的重复项)。
Field Mapping Table:
| Field Name | Type | Example |
|---|---|---|
| building_name | String | Old British Consulate |
| address | String | No.33 Bund, Shanghai |
| era | String | 1872 |
| protection_level | String | National Level |
9️⃣ 运行方式与结果展示(Execution)
运行:
python main.py输出:
./output/heritage_buildings_2023.csv结果示例:
Rockbund, No.14 Yuanmingyuan Rd, 1920s, Municipal LevelCustoms House, No.13 Bund, 1927, National Level
🔟 常见问题与排错(Troubleshooting)
解析年代乱码:部分文档将“1920年”写成“一九二〇年”。
- 对策:在清洗层加入数字转化映射表。
403 Forbidden:
- 对策:检查是否开启了代理,或者降低抓取速度。政府网站防火墙对“突发性流量”非常敏感。
HTML 结构不规范(标签未闭合):
- 对策:强制使用
lxml作为 BeautifulSoup 的解析核,它的容错性最强。🌟
- 对策:强制使用
1️⃣1️⃣ 进阶优化(Optional)
- 可视化分析:利用
Matplotlib绘制一份“Buildings Count by Era”的柱状图(Chart labels will be in English)。 - 经纬度逆解析:通过
Address字段调用地理编码接口(Geocoding API),获取经纬度,在地图上打点。 - 断点续爬:记录已经抓取的页码,防止中途断网导致从头开始。
1️⃣2️⃣ 总结与延伸阅读
复盘:我们攻克了文化遗产名录中“合并单元格”和“非标准文本描述”两大技术坑点,构建了一个稳健的采集链路。
下一步:
- 尝试学习使用PyPDF2抓取那些藏在扫描版 PDF 里的名录。
- 将建筑照片进行异步下载,构建视觉索引库。🖼️
🌟 文末
好啦~以上就是本期的全部内容啦!如果你在实践过程中遇到任何疑问,欢迎在评论区留言交流,我看到都会尽量回复~咱们下期见!
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦~
三连就是对我写作道路上最好的鼓励与支持!❤️🔥
✅ 专栏持续更新中|建议收藏 + 订阅
墙裂推荐订阅专栏 👉 《Python爬虫实战》,本专栏秉承着以“入门 → 进阶 → 工程化 → 项目落地”的路线持续更新,争取让每一期内容都做到:
✅ 讲得清楚(原理)|✅ 跑得起来(代码)|✅ 用得上(场景)|✅ 扛得住(工程化)
📣想系统提升的小伙伴:强烈建议先订阅专栏 《Python爬虫实战》,再按目录大纲顺序学习,效率十倍上升~
✅ 互动征集
想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战?
评论区留言告诉我你的需求,我会优先安排实现(更新)哒~
⭐️ 若喜欢我,就请关注我叭~(更新不迷路)
⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力)
⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)
✅ 免责声明
本文爬虫思路、相关技术和代码仅用于学习参考,对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。
使用或者参考本项目即表示您已阅读并同意以下条款:
- 合法使用: 不得将本项目用于任何违法、违规或侵犯他人权益的行为,包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。
- 风险自负: 任何因使用本项目而产生的法律责任、技术风险或经济损失,由使用者自行承担,项目作者不承担任何形式的责任。
- 禁止滥用: 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。
- 使用或者参考本项目即视为同意上述条款,即 “谁使用,谁负责” 。如不同意,请立即停止使用并删除本项目。!!!
