㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~
㊙️本期爬虫难度指数:⭐ (基础入门篇)
🉐福利:一次订阅后,专栏内的所有文章可永久免费看,持续更新中,保底1000+(篇)硬核实战内容。
全文目录:
- 🌟 开篇语
- 0️⃣ 前言(Preface)
- 1️⃣ 摘要(Abstract)
- 2️⃣ 背景与需求(Why)
- 3️⃣ 合规与注意事项(Legal & Notice)
- 4️⃣ 技术选型与整体流程(What/How)
- 5️⃣ 环境准备与依赖安装(Setup)
- 6️⃣ 核心实现:请求层(Fetcher)
- 7️⃣ 核心实现:解析层(Parser)
- 8️⃣ 数据存储与导出(Storage)
- 9️⃣ 运行方式与结果展示(Operation)
- 🔟 常见问题与排错(FAQ)
- 1️⃣1️⃣ 进阶优化(Optimization)
- 1️⃣2️⃣ 总结与延伸阅读(Summary)
- 🌟 文末
- ✅ 专栏持续更新中|建议收藏 + 订阅
- ✅ 互动征集
- ✅ 免责声明
🌟 开篇语
哈喽,各位小伙伴们你们好呀~我是【喵手】。
运营社区: C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO
欢迎大家常来逛逛,一起学习,一起进步~🌟
我长期专注Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。
📌专栏食用指南(建议收藏)
- ✅ 入门基础:环境搭建 / 请求与解析 / 数据落库
- ✅ 进阶提升:登录鉴权 / 动态渲染 / 反爬对抗
- ✅ 工程实战:异步并发 / 分布式调度 / 监控与容错
- ✅ 项目落地:数据治理 / 可视化分析 / 场景化应用
📣专栏推广时间:如果你想系统学爬虫,而不是碎片化东拼西凑,欢迎订阅专栏👉《Python爬虫实战》👈,一次订阅后,专栏内的所有文章可永久免费阅读,持续更新中。
💕订阅后更新会优先推送,按目录学习更高效💯~
0️⃣ 前言(Preface)
目标:使用 Python 爬取 MDN Web Docs 权威 MIME 类型列表,产出包含“MIME类型、扩展名、说明、用途”的结构化字典。
读完获得:
- 掌握
requests+BeautifulSoup处理复杂 HTML 表格的实战技巧。 - 学会编写具备“工业级”鲁棒性的爬虫代码结构。
- 获得一份可直接用于 Web 开发项目的
mime_types.json配置文件。
- 掌握
1️⃣ 摘要(Abstract)
本文将通过分析 MDN 静态页面结构,利用BeautifulSoup4定位目标表格,并针对“一个 MIME 对应多个后缀”的特殊情况进行数据清洗。最终代码将实现自动化采集、标准化清洗及多格式存储,是爬虫爱好者从“写脚本”转向“写工程”的典型案例。
2️⃣ 背景与需求(Why)
为什么要爬:
- 自动化配置:编写静态服务器(如 Nginx 逻辑)时,需要配置大量的
Content-Type。 - 文件识别:在处理上传文件或流媒体抓取时,需要根据后缀名反查其标准 MIME 类型。
- 自动化配置:编写静态服务器(如 Nginx 逻辑)时,需要配置大量的
目标站点:MDN - Common MIME types
目标字段:
MIME Type(例:application/javascript)Extension(例:.js)Description(文本说明)Common Use(常见用途)
3️⃣ 合规与注意事项(Legal & Notice)
- robots.txt:经过检查,MDN 允许对文档内容进行学术性或技术分享性质的非高频采集。
- 频率控制:我们将设置随机 User-Agent 和请求间隔,不给服务器造成压力,做一名温和的“数字公民”。
- 合规性:本项目仅抓取公开展示的技术文档,不涉及任何用户敏感数据或破解行为。
4️⃣ 技术选型与整体流程(What/How)
选型:该页面为标准的服务器端渲染(SSR)静态页面,无需动用 Selenium 等重型武器,选用
requests+BeautifulSoup4组合,追求极速与稳定。技术流程:
- 采集(Fetch):模拟真实浏览器行为获取 HTML 源码。
- 解析(Parse):提取
<table>标签,遍历每一行<tr>。 - 清洗(Clean):处理空格、换行符,拆分合并的单元格。
- 存储(Store):持久化到 CSV 和 JSON 文件。
5️⃣ 环境准备与依赖安装(Setup)
Python 版本:3.9+ (推荐 3.10+)
依赖安装:
pipinstallrequests beautifulsoup4 pandas推荐项目目录:
mime_toolkit/ ├── data/ # 存放生成的 CSV/JSON ├── src/ │ ├── __init__.py │ └── scraper.py # 核心逻辑 └── main.py # 运行入口
6️⃣ 核心实现:请求层(Fetcher)
在抓取时,最忌讳“裸奔”。我们需要伪造请求头(Headers),并处理可能出现的超时异常。
importrequestsimportrandomclassMIMEFetcher:def__init__(self):self.url="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types"self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36","Accept-Language":"en-US,en;q=0.9"}deffetch_html(self):try:response=requests.get(self.url,headers=self.headers,timeout=15)response.raise_for_status()# 状态码 4xx/5xx 会直接抛出异常returnresponse.textexceptrequests.exceptions.RequestExceptionase:print(f"❌ Error during fetching:{e}")returnNone7️⃣ 核心实现:解析层(Parser)
MDN 的表格每一行<tr>包含四个<td>。难点在于某些后缀可能有多个(如.jpg和.jpeg),我们需要对数据进行去空处理。
frombs4importBeautifulSoupclassMIMEParser:@staticmethoddefparse(html_content):soup=BeautifulSoup(html_content,'html.parser')results=[]# 定位文章中的表格table=soup.find('table',class_='standard-table')ifnottable:return[]rows=table.find('tbody').find_all('tr')forrowinrows:cols=row.find_all('td')iflen(cols)>=3:# 清洗数据:去除冗余空格和换行ext=cols[0].get_text(strip=True)mtype=cols[1].get_text(strip=True)desc=cols[2].get_text(strip=True)# 有些行可能没有第四列(常见用途)usage=cols[3].get_text(strip=True)iflen(cols)>3else"N/A"results.append({"extension":ext,"mime_type":mtype,"description":desc,"common_use":usage})returnresults8️⃣ 数据存储与导出(Storage)
我们要同时导出 CSV(方便分析)和 JSON(方便程序调用)。
| Field Name | Type | Example |
|---|---|---|
| extension | string | .json |
| mime_type | string | application/json |
| description | string | JSON format |
importpandasaspdimportjsondefsave_data(data):# 保存为 CSV (Using English Filename)df=pd.DataFrame(data)df.to_csv("data/mime_types_registry.csv",index=False,encoding='utf-8-sig')# 保存为 JSONwithopen("data/mime_types_registry.json","w",encoding='utf-8')asf:json.dump(data,f,indent=4,ensure_ascii=False)print(f"✅ Data saved:{len(data)}items recorded.")9️⃣ 运行方式与结果展示(Operation)
- 运行:运行
main.py即可。 - 示例结果展示:
| extension | mime_type | description | common_use |
|---|---|---|---|
| .aac | audio/aac | AAC audio | AAC audio |
| .bin | application/octet-stream | Any kind of binary data | Binary data |
| .csv | text/csv | Comma-separated values (CSV) | CSV files |
🔟 常见问题与排错(FAQ)
- 403 Forbidden:MDN 开启了部分防护,如果遇到 403,请检查是否缺少
Accept请求头,或者降低采集频率。 - HTML 结构变化:MDN 会不定期重构,若发现
find_all抓不到数据,请先print(soup.prettify())查看实时结构,重点检查standard-table类名。 - 乱码:使用
utf-8-sig保存 CSV 可以在 Excel 中完美显示中文。
1️⃣1️⃣ 进阶优化(Optimization)
- 多源聚合:除了 MDN,还可以接入 IANA 的官方数据进行横向比对,确保准确性。
- 反向索引:建议在代码中生成一个
reverse_mapping,即以extension为 Key,mime_type为 Value 的哈希表,实现O ( 1 ) O(1)O(1)的查询速度。
1️⃣2️⃣ 总结与延伸阅读(Summary)
通过本次实战,我们不仅成功抓取了 MIME Type 对照表,更重要的是掌握了从网页表格到结构化数据库的工程方法。
下一步建议:
- 尝试使用
asyncio+httpx改造代码,实现异步并发。 - 研究如何将此脚本集成到你的自动化部署流程中。
🌟 文末
好啦~以上就是本期的全部内容啦!如果你在实践过程中遇到任何疑问,欢迎在评论区留言交流,我看到都会尽量回复~咱们下期见!
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦~
三连就是对我写作道路上最好的鼓励与支持!❤️🔥
✅ 专栏持续更新中|建议收藏 + 订阅
墙裂推荐订阅专栏 👉 《Python爬虫实战》,本专栏秉承着以“入门 → 进阶 → 工程化 → 项目落地”的路线持续更新,争取让每一期内容都做到:
✅ 讲得清楚(原理)|✅ 跑得起来(代码)|✅ 用得上(场景)|✅ 扛得住(工程化)
📣想系统提升的小伙伴:强烈建议先订阅专栏 《Python爬虫实战》,再按目录大纲顺序学习,效率十倍上升~
✅ 互动征集
想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战?
评论区留言告诉我你的需求,我会优先安排实现(更新)哒~
⭐️ 若喜欢我,就请关注我叭~(更新不迷路)
⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力)
⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)
✅ 免责声明
本文爬虫思路、相关技术和代码仅用于学习参考,对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。
使用或者参考本项目即表示您已阅读并同意以下条款:
- 合法使用: 不得将本项目用于任何违法、违规或侵犯他人权益的行为,包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。
- 风险自负: 任何因使用本项目而产生的法律责任、技术风险或经济损失,由使用者自行承担,项目作者不承担任何形式的责任。
- 禁止滥用: 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。
- 使用或者参考本项目即视为同意上述条款,即 “谁使用,谁负责” 。如不同意,请立即停止使用并删除本项目。!!!