news 2026/5/6 3:28:06

Python爬虫实战:手把手教你如何低耦合提取 IETF 媒体类型(Media Types)注册表!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python爬虫实战:手把手教你如何低耦合提取 IETF 媒体类型(Media Types)注册表!

㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~
㊙️本期爬虫难度指数:⭐ (基础入门篇)
🉐福利:一次订阅后,专栏内的所有文章可永久免费看,持续更新中,保底1000+(篇)硬核实战内容。

全文目录:

      • 🌟 开篇语
      • 0️⃣ 前言(Preface)
      • 1️⃣ 摘要(Abstract)
      • 2️⃣ 背景与需求(Why)
      • 3️⃣ 合规与注意事项(必写)
      • 4️⃣ 技术选型与整体流程(What/How)
      • 5️⃣ 环境准备与依赖安装(可复现)
      • 6️⃣ 核心实现:请求层(Fetcher)
      • 7️⃣ 核心实现:解析层(Parser)
      • 8️⃣ 数据存储与导出(Storage)
      • 9️⃣ 运行方式与结果展示(必写)
      • 🔟 常见问题与排错(强烈建议写)
      • 1️⃣1️⃣ 进阶优化(可选)
      • 1️⃣2️⃣ 总结与延伸阅读
      • 🌟 文末
        • ✅ 专栏持续更新中|建议收藏 + 订阅
        • ✅ 互动征集
        • ✅ 免责声明

🌟 开篇语

哈喽,各位小伙伴们你们好呀~我是【喵手】。
运营社区: C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO
欢迎大家常来逛逛,一起学习,一起进步~🌟

我长期专注Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略反爬对抗,从数据清洗分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上

📌专栏食用指南(建议收藏)

  • ✅ 入门基础:环境搭建 / 请求与解析 / 数据落库
  • ✅ 进阶提升:登录鉴权 / 动态渲染 / 反爬对抗
  • ✅ 工程实战:异步并发 / 分布式调度 / 监控与容错
  • ✅ 项目落地:数据治理 / 可视化分析 / 场景化应用

📣专栏推广时间:如果你想系统学爬虫,而不是碎片化东拼西凑,欢迎订阅专栏👉《Python爬虫实战》👈,一次订阅后,专栏内的所有文章可永久免费阅读,持续更新中。

💕订阅后更新会优先推送,按目录学习更高效💯~

0️⃣ 前言(Preface)

  • 一句话说明:本文将带你使用 Python 编写一个高鲁棒性的爬虫,从 IANA 官网抓取最权威的媒体类型(MIME)列表,并将其标准化为结构化数据。

  • 读完获得:

    1. 掌握<table>嵌套页面的精准定位与迭代逻辑;
    2. 学会如何通过字符串切分(Split)实现字段归一化;
    3. 获取一份即插即用的全球媒体类型标准映射表。

1️⃣ 摘要(Abstract)

本文聚焦于 IANA (Internet Assigned Numbers Authority) 维护的媒体类型注册表,利用requests+BeautifulSoup组合,演示如何跨越多个分类表格抓取“顶级类型、子类型、标准状态、参考文档”四个核心维度。我们将通过工程化手段解决数据清洗中的冗余噪声,产出标准的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.10+requests+BeautifulSoup4+lxml(为了追求极致的解析速度)。

  • 逻辑流程:

    1. Fetcher:拉取 IANA 媒体类型主页 HTML。
    2. Table Locator:通过 ID 或 Header 文本定位不同分类的表格。
    3. Extractor:遍历tr行,重点处理type/subtype复合字段。
    4. 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:your@example.com)','Accept':'text/html'}try:response=requests.get(url,headers=headers,timeout=20)response.raise_for_status()returnresponse.textexceptExceptionase:print(f"⚠️ Fetch failed:{e}")returnNone

7️⃣ 核心实现:解析层(Parser)

实战重点:一个单元格里可能写着application/xml,我们要把它拆开。

frombs4importBeautifulSoupdefparse_media_tables(html_content):soup=BeautifulSoup(html_content,'lxml')# IANA 页面通常有多个带有 'class="sortable"' 的表格tables=soup.find_all('table',class_='sortable')results=[]fortableintables:rows=table.find_all('tr')forrowinrows[1:]:# 跳过表头cols=row.find_all('td')iflen(cols)>=2:# 关键:从 "application/json" 中提取顶级和子类型full_name=cols[0].get_text(strip=True)if'/'infull_name:top_type,subtype=full_name.split('/',1)else:top_type,subtype="unknown",full_name results.append({'top_level_type':top_type,'subtype':subtype,'reference':cols[1].get_text(strip=True)})returnresults

8️⃣ 数据存储与导出(Storage)

我们将结果存为 CSV。

  • 字段映射表 (Metadata Map):
Column NameTypeExample
top_level_typestringvideo
subtypestringmp4
referencestring[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爬虫实战》,再按目录大纲顺序学习,效率十倍上升~

✅ 互动征集

想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战?

评论区留言告诉我你的需求,我会优先安排实现(更新)哒~


⭐️ 若喜欢我,就请关注我叭~(更新不迷路)
⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力)
⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)


✅ 免责声明

本文爬虫思路、相关技术和代码仅用于学习参考,对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。

使用或者参考本项目即表示您已阅读并同意以下条款:

  • 合法使用: 不得将本项目用于任何违法、违规或侵犯他人权益的行为,包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。
  • 风险自负: 任何因使用本项目而产生的法律责任、技术风险或经济损失,由使用者自行承担,项目作者不承担任何形式的责任。
  • 禁止滥用: 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。
  • 使用或者参考本项目即视为同意上述条款,即 “谁使用,谁负责” 。如不同意,请立即停止使用并删除本项目。!!!
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 3:27:54

类和对象的基本知识(类的定义,实例化,this指针)

目录 一.类的定义 1.类的定义格式 1.2访问限制符 1.3类域 二.实例化 2.1实例化的概念 2.2对象大小 内存对齐&#xff1a; 三. this指针 const的三种用法&#xff1a; 经典例题&#xff1a; 四、C和C语言实现Stack对比 一.类的定义 1.类的定义格式 • class为定义类…

作者头像 李华
网站建设 2026/5/6 3:25:30

AI智能体监控平台agentwatch:从可观测性到性能优化实战

1. 项目概述&#xff1a;一个面向AI智能体生态的监控与洞察工具最近在折腾AI智能体&#xff08;Agent&#xff09;相关的项目&#xff0c;发现一个挺有意思的现象&#xff1a;当你的智能体数量从几个增长到几十个甚至更多时&#xff0c;管理它们的状态、追踪它们的决策过程、分…

作者头像 李华
网站建设 2026/5/6 3:22:28

CASIO 5444 5524 按 A 钮没有声音 按其它钮有声音 正常吗

CASIO 5444 5524 按 A 钮没有声音 按其它钮有声音 正常吗 对于 CASIO 手表&#xff08;如型号 5444、5524&#xff09;&#xff0c;按 A 钮没有声音&#xff0c;而按其他按钮有声音&#xff0c;这通常是正常现象。 这种情况并非故障&#xff0c;而是由手表的功能设计决定的。 ⌚…

作者头像 李华
网站建设 2026/5/6 3:15:40

运维效率翻倍:手把手教你制作并复用银河麒麟V10 SP2的离线Yum仓库包

银河麒麟V10 SP2离线Yum仓库全流程实战&#xff1a;从制作到多环境部署 在封闭的内网环境中&#xff0c;运维人员常常面临软件包依赖管理的噩梦。想象一下这样的场景&#xff1a;你需要在数十台隔离的银河麒麟V10 SP2服务器上部署相同的软件栈&#xff0c;每台机器都需要手动解…

作者头像 李华