Python爬虫实战:抓取维基百科人物年表并清洗时间线!

发布时间:2026/5/30 8:34:16

Python爬虫实战:抓取维基百科人物年表并清洗时间线! ㊗️本期内容已收录至专栏《Python爬虫实战》持续完善知识体系与项目实战建议先订阅收藏后续查阅更方便㊙️本期爬虫难度指数⭐ (入门级)福利一次订阅后专栏内的所有文章可永久免费看持续更新中保底1000(篇)硬核实战内容。全文目录 开篇语0️⃣ 前言Preface1️⃣ 摘要Abstract2️⃣ 背景与需求Why3️⃣ 合规与注意事项必写 ⚖️4️⃣ 技术选型与整体流程What/How5️⃣ 环境准备与依赖安装可复现 ️6️⃣ 核心实现请求层Fetcher 7️⃣ 核心实现解析层与清洗Parser Cleaner 8️⃣ 数据存储与导出Storage 9️⃣ 运行方式与结果展示必写 常见问题与排错老司机经验 1️⃣1️⃣ 进阶优化可选但加分 ⚡1️⃣2️⃣ 总结与延伸阅读 文末✅ 专栏持续更新中建议收藏 订阅✅ 互动征集✅ 免责声明 开篇语哈喽各位小伙伴们你们好呀我是【喵手】。运营社区 C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO欢迎大家常来逛逛一起学习一起进步我长期专注Python 爬虫工程化实战主理专栏 《Python爬虫实战》从采集策略到反爬对抗从数据清洗到分布式调度持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”让数据价值真正做到——抓得到、洗得净、用得上。专栏食用指南建议收藏✅ 入门基础环境搭建 / 请求与解析 / 数据落库✅ 进阶提升登录鉴权 / 动态渲染 / 反爬对抗✅ 工程实战异步并发 / 分布式调度 / 监控与容错✅ 项目落地数据治理 / 可视化分析 / 场景化应用专栏推广时间如果你想系统学爬虫而不是碎片化东拼西凑欢迎订阅专栏《Python爬虫实战》一次订阅后专栏内的所有文章可永久免费阅读持续更新中。订阅后更新会优先推送按目录学习更高效0️⃣ 前言Preface一句话说明我们将利用 Python 抓取维基百科的“Timeline of Steve Jobs”页面提取年份、日期、事件描述及来源重点攻克日期格式统一化的难题最终输出一份干净的时间线 Excel 表。读完能获得什么掌握HTML 表格Table的高效解析技巧。学会使用dateutil或pandas里的神器来自动清洗各种奇形怪状的日期格式。获得一份标准化的名人履历数据集。1️⃣ 摘要Abstract本文将构建一个针对 Wikipedia 列表页的定向爬虫。我们将使用requests获取 HTML利用BeautifulSoup定位wikitable重点讲解如何去除文本中的引用角标如[1]并编写一个智能时间转换函数将 “Feb 24, 1955” 统一转换为 “1955-02-24”最终产出结构化数据。2️⃣ 背景与需求Why为什么要爬人物画像构建人物知识图谱分析其生涯的“高光时刻”和“低谷期”。历史归档将非结构化的网页文本转化为可存入数据库的结构化时间轴。目标站点https://en.wikipedia.org/wiki/Timeline_of_Steve_Jobs目标字段清单Name人物“Steve Jobs”Raw_Date原始时间如 “February 24, 1955”Standard_Date清洗后“1955-02-24”Year年份“1955”Event事件“Born in San Francisco…”Source来源维基百科链接3️⃣ 合规与注意事项必写 ⚖️Robots.txtWikipedia 是全球最开放的知识库之一允许爬虫访问但要求 User-Agent 必须包含联系方式或明确标识。频率控制虽然维基百科服务器强大但作为 Python 社区的“练手场”我们要自觉请求间隔至少 1-2 秒。版权声明抓取的数据遵循 CC BY-SA 3.0 协议仅供个人学习分析引用时请注明出处。4️⃣ 技术选型与整体流程What/How技术栈Requests BeautifulSoup Pandas。维基百科是纯静态 HTML不需要 JS 渲染。Pandas 在这里不仅用于存储更用于时间序列处理。流程图请求网页➔解析表格➔清洗引用脚注([1])➔标准化日期➔存储 Excel5️⃣ 环境准备与依赖安装可复现 ️Python 版本Python 3.8依赖安装python-dateutil是 Python 强大的第三方时间库能听懂人话比如识别 “Jan 21st”。pipinstallrequests beautifulsoup4 pandas python-dateutil openpyxl6️⃣ 核心实现请求层Fetcher 维基百科对 Headers 检查较松但建议加上 User-Agent。importrequestsfromrequests.exceptionsimportRequestExceptiondeffetch_wiki_page(url):headers{# 维基百科建议在 UA 里留下联系方式或项目地址User-Agent:TimelineScraper_Bot/1.0 (Student Project; python_learnerexample.com)}try:responserequests.get(url,headersheaders,timeout15)response.raise_for_status()returnresponse.textexceptRequestExceptionase:print(f❌ 访问失败:{e})returnNone7️⃣ 核心实现解析层与清洗Parser Cleaner 这是本篇的精华我们需要处理两个脏数据问题引用角标比如1955[1]我们需要把[1]删掉。时间格式把24 Feb 1955变成1955-02-24。frombs4importBeautifulSoupimportrefromdateutilimportparserasdate_parserdefclean_text(text): 清洗文本去除引用角标 [1], [2] 等 ifnottext:return# 正则替换掉 [数字] 这种模式returnre.sub(r\[\d\],,text).strip()defstandardize_date(date_str): 核心时间标准化函数 输入: February 24, 1955 或 1976 输出: (1955-02-24, 1955) clean_date_strclean_text(date_str)try:# dateutil 非常智能能解析大部分英文日期# default 参数用于补充缺失部分比如只写了 1999默认补成 1999-01-01dtdate_parser.parse(clean_date_str)returndt.strftime(%Y-%m-%d),str(dt.year)except:# 如果解析失败比如写的是 Late 1970s则保留原样或标记未知returnclean_date_str,Unknowndefparse_timeline(html):soupBeautifulSoup(html,html.parser)events[]# 维基百科的年表通常在 classwikitable 中tablessoup.select(table.wikitable)ifnottables:print(⚠️ 未找到 wikitable请检查页面结构。)return[]# 假设我们要找的是第一个表格通常是主要年表target_tabletables[0]# 遍历表格行跳过表头forrowintarget_table.find_all(tr)[1:]:colsrow.find_all([td,th])# 有时候日期在 th 里# 维基百科表格结构多变需根据实际情况判断列数# Steve Jobs 页面结构[Year/Date] [Event]iflen(cols)2:raw_datecols[0].get_text().strip()event_textcols[1].get_text().strip()# 1. 清洗引用raw_dateclean_text(raw_date)event_textclean_text(event_text)# 2. 标准化时间std_date,yearstandardize_date(raw_date)events.append({Person:Steve Jobs,Raw_Date:raw_date,# 原始数据留底Standard_Date:std_date,# 清洗后数据便于排序Year:year,# 提取年份便于分组Event:event_text,Source_Link:https://en.wikipedia.org/wiki/Timeline_of_Steve_Jobs})returnevents8️⃣ 数据存储与导出Storage importpandasaspddefsave_timeline(data):ifnotdata:returndfpd.DataFrame(data)# 按时间排序因为 Standard_Date 是 YYYY-MM-DD 格式字符串可以直接排# 注意无法解析日期的行可能会排在前面或后面df.sort_values(byStandard_Date,inplaceTrue)filenamesteve_jobs_timeline.xlsxdf.to_excel(filename,indexFalse)print(f 成功生成年表{filename})print(df[[Standard_Date,Event]].head())# 预览9️⃣ 运行方式与结果展示必写 defmain():target_urlhttps://en.wikipedia.org/wiki/Timeline_of_Steve_Jobsprint(f 开始抓取人物年表:{target_url})htmlfetch_wiki_page(target_url)ifhtml:timeline_dataparse_timeline(html)print(f✅ 提取到{len(timeline_data)}个历史事件。)save_timeline(timeline_data)else:print(❌ 抓取失败。)if__name____main__:main()示例输出结果 (Excel)PersonRaw_DateStandard_DateYearEventSteve JobsFebruary 24, 19551955-02-241955Born in San Francisco to Abdulfattah Jandali…Steve Jobs19721972-01-01*1972Enrolls at Reed College in Portland, Oregon.Steve JobsApril 1, 19761976-04-011976Apple Computer is formed by Steve Jobs…Steve JobsJanuary 24, 19841984-01-241984Macintosh is launched.注对于只有年份的数据dateutil默认可能会补全为当月当日或 1月1日这取决于配置需在分析时注意。 常见问题与排错老司机经验 日期解析报错场景遇到 “Summer 1999” 或 “Late 2000s”。解法dateutil搞不定这种模糊时间。建议在except块里加个正则判断提取前 4 位数字作为年份月份设为01或者保留原样人工清洗。表格错位场景维基百科表格经常有rowspan跨行单元格。解法如果不处理 rowpsan数据会错位。处理rowspan比较复杂通常建议先把 HTML 喂给pd.read_html(url)pandas 会自动处理大部分表格布局问题这是个偷懒的神技。SSL 错误解法如果是 Mac 用户可能需要更新certifi库或者在 requests 里加verifyFalse不推荐但能应急。1️⃣1️⃣ 进阶优化可选但加分 ⚡Pandas 读表大法其实parse_timeline函数可以用一行代码代替dfspd.read_html(html,attrs{class:wikitable})dfdfs[0]# 直接拿到 DataFrame这种方法极其省事但如果表格里的数据需要复杂的清洗比如去除[1]还是得配合apply函数来做。NLP 实体提取使用spaCy库处理Event文本自动提取出事件中的“地点”GPE和“组织机构”ORG让你的 Excel 变身高级数据库。1️⃣2️⃣ 总结与延伸阅读 这篇教程的核心价值在于数据清洗。抓取网页只是第一步让杂乱的字符串变成整齐的YYYY-MM-DD才是数据分析师的功底所在。复盘我们利用dateutil解决了 80% 的日期格式化问题利用Regex解决了引用干扰。下一步试试去抓取IMDb的影人页面那里有更复杂的“作品年表”而且图片和介绍更多适合做可视化的时间轴网页Enjoy Coding! 文末好啦以上就是本期的全部内容啦如果你在实践过程中遇到任何疑问欢迎在评论区留言交流我看到都会尽量回复咱们下期见小伙伴们在批阅的过程中如果觉得文章不错欢迎点赞、收藏、关注哦三连就是对我写作道路上最好的鼓励与支持❤️✅ 专栏持续更新中建议收藏 订阅墙裂推荐订阅专栏 《Python爬虫实战》本专栏秉承着以“入门 → 进阶 → 工程化 → 项目落地”的路线持续更新争取让每一期内容都做到✅ 讲得清楚原理✅ 跑得起来代码✅ 用得上场景✅ 扛得住工程化想系统提升的小伙伴强烈建议先订阅专栏 《Python爬虫实战》再按目录大纲顺序学习效率十倍上升✅ 互动征集想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战评论区留言告诉我你的需求我会优先安排实现(更新)哒~⭐️ 若喜欢我就请关注我叭更新不迷路⭐️ 若对你有用就请点赞支持一下叭给我一点点动力⭐️ 若有疑问就请评论留言告诉我叭我会补坑 更新迭代✅ 免责声明本文爬虫思路、相关技术和代码仅用于学习参考对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。使用或者参考本项目即表示您已阅读并同意以下条款合法使用 不得将本项目用于任何违法、违规或侵犯他人权益的行为包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。风险自负 任何因使用本项目而产生的法律责任、技术风险或经济损失由使用者自行承担项目作者不承担任何形式的责任。禁止滥用 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。使用或者参考本项目即视为同意上述条款,即 “谁使用谁负责” 。如不同意请立即停止使用并删除本项目。

相关新闻