Python爬虫实战:手把手教你如何低耦合提取 IETF 媒体类型(Media Types)注册表!
㊗️本期内容已收录至专栏《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 编写一个高鲁棒性的爬虫从 IANA 官网抓取最权威的媒体类型MIME列表并将其标准化为结构化数据。读完获得掌握多table嵌套页面的精准定位与迭代逻辑学会如何通过字符串切分Split实现字段归一化获取一份即插即用的全球媒体类型标准映射表。1️⃣ 摘要Abstract本文聚焦于 IANA (Internet Assigned Numbers Authority) 维护的媒体类型注册表利用requestsBeautifulSoup组合演示如何跨越多个分类表格抓取“顶级类型、子类型、标准状态、参考文档”四个核心维度。我们将通过工程化手段解决数据清洗中的冗余噪声产出标准的ietf_media_types.csv。2️⃣ 背景与需求Why为什么要爬后端开发构建文件上传服务时需要一份完整的 MIME 类型白皮书进行严格校验。协议分析在自研网络协议或抓包工具时用于自动识别 Content-Type。目标字段清单Top-level Type: 顶级类型如application,image。Subtype: 子类型如json,png。Status: 标准状态通常在参考文档中体现或作为表格属性。Reference: 参考文档RFC 链接或组织名称。3️⃣ 合规与注意事项必写robots.txt 说明IANA 的注册表数据属于公共资产但在大规模抓取时仍需遵守其访问频控。频率控制由于数据量较大且涉及多个表格建议在处理完每个表格后休眠 1 秒保持谦逊的爬取姿态。✨不攻击并发此页面更新频率极低完全没必要开启高并发单线程足以应付。4️⃣ 技术选型与整体流程What/How选型静态页面抓取。这类注册表通常是服务端直接生成不涉及复杂的 JS 渲染。工具Python 3.10requestsBeautifulSoup4lxml为了追求极致的解析速度。逻辑流程Fetcher拉取 IANA 媒体类型主页 HTML。Table Locator通过 ID 或 Header 文本定位不同分类的表格。Extractor遍历tr行重点处理type/subtype复合字段。Storage持久化为 CSV。5️⃣ 环境准备与依赖安装可复现# 建议使用干净的虚拟环境pipinstallrequests beautifulsoup4 lxml pandas项目目录ietf_registry_project/ ├── ietf_media_types_scraper.py # 主脚本 └── output/ # 存储结果6️⃣ 核心实现请求层Fetcher在爬取此类权威机构网站时设置一个清晰的User-Agent是最基本的礼仪。importrequestsdeffetch_registry(url):headers{User-Agent:Mozilla/5.0 (IETF Registry Research Bot; mailto:yourexample.com),Accept:text/html}try:responserequests.get(url,headersheaders,timeout20)response.raise_for_status()returnresponse.textexceptExceptionase:print(f⚠️ Fetch failed:{e})returnNone7️⃣ 核心实现解析层Parser实战重点一个单元格里可能写着application/xml我们要把它拆开。frombs4importBeautifulSoupdefparse_media_tables(html_content):soupBeautifulSoup(html_content,lxml)# IANA 页面通常有多个带有 classsortable 的表格tablessoup.find_all(table,class_sortable)results[]fortableintables:rowstable.find_all(tr)forrowinrows[1:]:# 跳过表头colsrow.find_all(td)iflen(cols)2:# 关键从 application/json 中提取顶级和子类型full_namecols[0].get_text(stripTrue)if/infull_name:top_type,subtypefull_name.split(/,1)else:top_type,subtypeunknown,full_name results.append({top_level_type:top_type,subtype:subtype,reference:cols[1].get_text(stripTrue)})returnresults8️⃣ 数据存储与导出Storage我们将结果存为 CSV。字段映射表 (Metadata Map):Column NameTypeExampletop_level_typestringvideosubtypestringmp4referencestring[RFC4337]9️⃣ 运行方式与结果展示必写运行python ietf_media_types_scraper.py展示 3 行示例结果[OK] Total 1400 types found. Sample output: - application, json, [RFC8259] - image, png, [RFC2083] - audio, mpeg, [RFC3003] 常见问题与排错强烈建议写多行参考链接某些子类型对应多个 RFC 链接。我们的处理方案是将其合并为一个由逗号分隔的字符串。链接解析发现[RFCXXXX]只是文本如果要抓取链接需进一步提取td a[href]。数据缺失某些新提交的草案Draft没有明确的子类型需加入if-else兜底。1️⃣1️⃣ 进阶优化可选自动下载 RFC根据抓取到的参考文档链接自动下载对应的文本版 RFC 文件。可视化分析统计哪类媒体类型如 Application占有的子类型最多。1️⃣2️⃣ 总结与延伸阅读复盘我们成功将一份巨大的在线注册表“降维打击”成了本地 CSV极大地提升了二次开发效率。下一步可以尝试抓取更复杂的IETF 协议参数Protocol Parameters页面那里的结构更加多变 文末好啦以上就是本期的全部内容啦如果你在实践过程中遇到任何疑问欢迎在评论区留言交流我看到都会尽量回复咱们下期见小伙伴们在批阅的过程中如果觉得文章不错欢迎点赞、收藏、关注哦三连就是对我写作道路上最好的鼓励与支持❤️✅ 专栏持续更新中建议收藏 订阅墙裂推荐订阅专栏 《Python爬虫实战》本专栏秉承着以“入门 → 进阶 → 工程化 → 项目落地”的路线持续更新争取让每一期内容都做到✅ 讲得清楚原理✅ 跑得起来代码✅ 用得上场景✅ 扛得住工程化想系统提升的小伙伴强烈建议先订阅专栏 《Python爬虫实战》再按目录大纲顺序学习效率十倍上升✅ 互动征集想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战评论区留言告诉我你的需求我会优先安排实现(更新)哒~⭐️ 若喜欢我就请关注我叭更新不迷路⭐️ 若对你有用就请点赞支持一下叭给我一点点动力⭐️ 若有疑问就请评论留言告诉我叭我会补坑 更新迭代✅ 免责声明本文爬虫思路、相关技术和代码仅用于学习参考对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。使用或者参考本项目即表示您已阅读并同意以下条款合法使用 不得将本项目用于任何违法、违规或侵犯他人权益的行为包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。风险自负 任何因使用本项目而产生的法律责任、技术风险或经济损失由使用者自行承担项目作者不承担任何形式的责任。禁止滥用 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。使用或者参考本项目即视为同意上述条款,即 “谁使用谁负责” 。如不同意请立即停止使用并删除本项目。