㊗️本期内容已收录至专栏《Python爬虫实战》持续完善知识体系与项目实战建议先订阅收藏后续查阅更方便㊙️本期爬虫难度指数⭐ (入门级)福利一次订阅后专栏内的所有文章可永久免费看持续更新中保底1000(篇)硬核实战内容。全文目录 开篇语0️⃣ 前言Preface1️⃣ 摘要Abstract2️⃣ 背景与需求Why3️⃣ 合规与注意事项必写 4️⃣ 技术选型与整体流程What/How5️⃣ 环境准备与依赖安装可复现 ️6️⃣ 核心实现请求层Fetcher ️7️⃣ 核心实现解析层Parser 8️⃣ 数据存储与导出Storage 9️⃣ 运行方式与结果展示必写 ▶️ 常见问题与排错Troubleshooting 1️⃣1️⃣ 进阶优化可选但加分 1️⃣2️⃣ 总结与延伸阅读 文末✅ 专栏持续更新中建议收藏 订阅✅ 互动征集✅ 免责声明 开篇语哈喽各位小伙伴们你们好呀我是【喵手】。运营社区 C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO欢迎大家常来逛逛一起学习一起进步我长期专注Python 爬虫工程化实战主理专栏 《Python爬虫实战》从采集策略到反爬对抗从数据清洗到分布式调度持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”让数据价值真正做到——抓得到、洗得净、用得上。专栏食用指南建议收藏✅ 入门基础环境搭建 / 请求与解析 / 数据落库✅ 进阶提升登录鉴权 / 动态渲染 / 反爬对抗✅ 工程实战异步并发 / 分布式调度 / 监控与容错✅ 项目落地数据治理 / 可视化分析 / 场景化应用专栏推广时间如果你想系统学爬虫而不是碎片化东拼西凑欢迎订阅专栏《Python爬虫实战》一次订阅后专栏内的所有文章可永久免费阅读持续更新中。订阅后更新会优先推送按目录学习更高效0️⃣ 前言Preface天下武功唯快不破软件操作唯快捷键不破。今天我们将编写一个 Python 爬虫前往各大软件文档或快捷键聚合网站将散落在各个“功能区块”中的快捷键表格精准提取出来并转化为对开发者最友好的 JSON 格式。读完这篇教程你将获得区块解析法掌握如何将 HTML 中松散的标题 (Category)与其下方的表格 (Table)关联起来。多平台数据拆分学会处理同一种功能对应 Windows/Mac 两套快捷键的清洗逻辑。微型数据库构建获得一份可直接被前端或 NoSQL 数据库消化的shortcuts_database.json。1️⃣ 摘要Abstract本文旨在构建一个针对静态快捷键文档站点的定向爬虫。利用requests库获取软件详情页源码通过BeautifulSoup识别 HTML 中的功能分类标题如“文件操作”、“编辑”及对应的快捷键表格。程序会自动提取软件名、功能、快捷键、平台、分类五个核心字段并将关系展平最终序列化并导出为shortcuts_database.json文件。2️⃣ 背景与需求Why为什么要爬统一检索官方文档往往分散且排版各异。爬下来做成统一格式查快捷键只需要一秒钟。自动化基础有了这个 JSON 库你可以轻松编写自动化测试脚本或者开发自定义的机械键盘宏映射。目标字段映射清单Software_Name(软件名 - e.g., “VS Code”)Category(分类 - e.g., “Basic Editing / 基础编辑”)Action(功能 - e.g., “Copy Line Down / 向下复制行”)Platform(平台 - e.g., “Windows” 或 “Mac”)Shortcut(快捷键 - e.g., “ShiftAltDown” 或 “⇧⌥↓”)3️⃣ 合规与注意事项必写 数据合理使用快捷键组合本身属于公开事实不具有著作权但网站的排版和汇编结构可能有版权。我们仅为个人学习、检索目的抓取请勿将聚合后的数据直接用于商业售卖。尊重服务器文档类网站通常为静态页但也请遵守robots.txt并在循环抓取多个软件时加入time.sleep(1)做一个讲武德的爬虫。注意特殊符号Mac 的快捷键经常包含⌘,⌥,⇧,⌃等 Unicode 符号。在请求和保存时务必确保全程使用 UTF-8 编码否则会变成乱码。4️⃣ 技术选型与整体流程What/How技术选型RequestsBeautifulSoup Python 内置json模块。由于快捷键大全站极少做复杂的动态反爬传统的静态请求方案效率最高。整体流程从面到点定位软件进入“VS Code 快捷键页”。定位功能块寻找页面里的二级标题如h2基础编辑/h2。解析表格找到紧跟在标题后面的table遍历每一行tr。平台拆分一行功能往往有 Win 和 Mac 两列快捷键我们需要在代码中将其拆分为两条独立的 JSON 记录。序列化json.dump保存。5️⃣ 环境准备与依赖安装可复现 ️建议使用 Python 3.8。依赖安装pipinstallrequests beautifulsoup4项目推荐目录shortcut_spider/ ├── main.py └── db/ └── shortcuts_database.json6️⃣ 核心实现请求层Fetcher ️importrequestsimporttimeimportrandomdeffetch_doc_page(url): 抓取目标软件的快捷键说明页 headers{User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36}try:responserequests.get(url,headersheaders,timeout10)response.raise_for_status()# 强制 UTF-8防止 Mac 的特殊修饰键符号变成乱码response.encodingutf-8returnresponse.textexceptExceptionase:print(f⚠️ 无法访问该文档页:{url}| 报错:{e})returnNone7️⃣ 核心实现解析层Parser 这是本次最巧妙的地方如何把散落的分类标题和表格绑定起来使用 BeautifulSoup 的find_previous_sibling()是一个绝杀技巧frombs4importBeautifulSoupdefparse_shortcuts(html,software_name): 解析 HTML将功能块与快捷键表格对应起来 soupBeautifulSoup(html,html.parser)records[]ifnothtml:returnrecordstry:# 假设快捷键都在特定的表格 table classshortcut-table 中tablessoup.find_all(table,class_shortcut-table)fortableintables:# 【绝招】寻找该表格前面的最近一个 h2 标签作为分类名category_tagtable.find_previous_sibling(h2)category_namecategory_tag.get_text(stripTrue)ifcategory_tagelseGeneral / 通用# 遍历表格的每一行 (跳过表头 th)rowstable.find_all(tr)forrowinrows:# 假设表头是 th内容是 tdcolsrow.find_all(td)# 假设标准的表格结构是 3 列[功能说明, Windows快捷键, Mac快捷键]iflen(cols)3:action_namecols[0].get_text(stripTrue)win_keycols[1].get_text(stripTrue)mac_keycols[2].get_text(stripTrue)# 只要快捷键不是空的或者 N/A我们就将其录入数据库# 我们要把一行数据拆分成 Windows 和 Mac 两条独立记录方便后期交叉检索ifwin_keyandwin_key.upper()!N/A:records.append({Software_Name:software_name,Category:category_name,Action:action_name,Platform:Windows/Linux,Shortcut:win_key})ifmac_keyandmac_key.upper()!N/A:records.append({Software_Name:software_name,Category:category_name,Action:action_name,Platform:macOS,Shortcut:mac_key})exceptExceptionase:print(f⚠️ 解析{software_name}时发生异常:{e})returnrecords8️⃣ 数据存储与导出Storage 对于这种高度结构化、需要频繁嵌套和跨语言读取的数据JSON 是毫无争议的王者。importjsonimportosdefexport_to_json(data_list,filenameshortcuts_database.json):ifnotdata_list:print( 没有提取到快捷键数据取消保存。)returnoutput_dirdbos.makedirs(output_dir,exist_okTrue)filepathos.path.join(output_dir,filename)# 写入 JSONwithopen(filepath,w,encodingutf-8)asf:# ensure_asciiFalse 保证原样输出中文字符和 ⌘ 这类符号# indent4 保证 JSON 文件具有良好的可读性Pretty Printjson.dump(data_list,f,ensure_asciiFalse,indent4)print(f 数据库构建完毕共收录{len(data_list)}条快捷键已安全存入 ➡️{filepath})9️⃣ 运行方式与结果展示必写 ▶️为了让你零门槛、立刻跑通代码我为你搭建了一个含有典型结构的本地“模拟文档库”。请直接复制下方完整代码并运行# # 模拟器环境 (Mock Server)# USE_MOCKTruedefmock_request(url):ifvscodeinurl:return div classcontent h1VS Code 快捷键参考/h1 h2基础编辑 (Basic Editing)/h2 table classshortcut-table trth功能/ththWindows/ththMac/th/tr trtd剪切行 (空选时)/tdtdCtrlX/tdtd⌘X/td/tr trtd向下复制行/tdtdShiftAltDown/tdtd⇧⌥↓/td/tr trtd移动行到上方/tdtdAltUp/tdtd⌥↑/td/tr /table h2导航 (Navigation)/h2 table classshortcut-table trth功能/ththWindows/ththMac/th/tr trtd显示所有命令/tdtdCtrlShiftP/tdtd⇧⌘P/td/tr trtd跳转到文件/tdtdCtrlP/tdtd⌘P/td/tr trtd在文件中查找/tdtdCtrlF/tdtd⌘F/td/tr /table /div elifphotoshopinurl:return div classcontent h1Photoshop 快捷键参考/h1 h2图层操作 (Layers)/h2 table classshortcut-table trth功能/ththWindows/ththMac/th/tr trtd新建图层/tdtdShiftCtrlN/tdtd⇧⌘N/td/tr trtd向下合并图层/tdtdCtrlE/tdtd⌘E/td/tr trtd盖印可见图层/tdtdShiftCtrlAltE/tdtd⇧⌥⌘E/td/tr trtd一个不存在的功能/tdtdN/A/tdtdN/A/td/tr /table /div returnifUSE_MOCK:fetch_doc_pagemock_request# # 爬虫主程序# if__name____main__:print( 极客快捷键雷达启动准备拦截信号...)# 准备目标清单 (包含名称和 URL)targets[{name:Visual Studio Code,url:https://mock-docs.com/shortcuts/vscode},{name:Adobe Photoshop,url:https://mock-docs.com/shortcuts/photoshop}]all_shortcuts_db[]fortargetintargets:print(f 正在读取文档:{target[name]})html_contentfetch_doc_page(target[url])# 提取当前软件的快捷键并加入主库recordsparse_shortcuts(html_content,target[name])all_shortcuts_db.extend(records)print(f ↳ 成功提取{len(records)}条规则。)# 爬虫基本素养延时ifnotUSE_MOCK:time.sleep(random.uniform(1.5,2.5))# 序列化为 JSONexport_to_json(all_shortcuts_db)# 预览一下生成的 JSON 前 3 条print(\n 数据库首部预览 (JSON Preview):)ifall_shortcuts_db:print(json.dumps(all_shortcuts_db[:3],ensure_asciiFalse,indent2))示例输出结果 (shortcuts_database.json结构片段)[{Software_Name:Visual Studio Code,Category:基础编辑 (Basic Editing),Action:剪切行 (空选时),Platform:Windows/Linux,Shortcut:CtrlX},{Software_Name:Visual Studio Code,Category:基础编辑 (Basic Editing),Action:剪切行 (空选时),Platform:macOS,Shortcut:⌘X},{Software_Name:Visual Studio Code,Category:基础编辑 (Basic Editing),Action:向下复制行,Platform:Windows/Linux,Shortcut:ShiftAltDown}] 常见问题与排错Troubleshooting JSON 里出现了\u2318\u21e7这种火星文原因json.dump默认会将非 ASCII 字符如中文和特殊符号转义。解法在json.dump函数中务必加上ensure_asciiFalse这个关键参数分类名抓错了全变成了 “General / 通用”原因目标网站的 HTML 结构可能不是h2紧接着table中间可能隔了一个p描述段落。解法使用 BeautifulSoup 的find_previous([h2, h3])方法它会向上跳过p精准找到离得最近的标题。不同软件的表格列数不一样怎么办解法你需要在 parser 里针对不同的软件编写不同的解析规则策略模式或者通过读取表头th的内容动态判断哪一列是 Mac哪一列是 Win。1️⃣1️⃣ 进阶优化可选但加分 数据标准化 (Normalization)各大网站写法不同有的写Ctrl有的写Control有的写^。可以在入库前写一个正则替换函数把所有按键映射为统一规范这对于后续的精确检索至关重要。命令行快捷检索工具既然有了 JSON写一个带搜索功能的 CLI 脚本吧# search_key.pyimportjson,sys keywordsys.argv[1].lower()datajson.load(open(db/shortcuts_database.json,encodingutf-8))results[itemforitemindataifkeywordinitem[Action].lower()]forrinresults:print(f[{r[Platform]}]{r[Action]}-{r[Shortcut]})在终端里直接敲python search_key.py 复制瞬间得到答案1️⃣2️⃣ 总结与延伸阅读 太酷了你成功地将松散的网页文档转化为了高度结构化的专属微型数据库。这个项目最大的价值在于“组合”。这个 JSON 文件不仅能做检索你甚至可以利用前端框架如 React/Vue写一个带动画效果的网页屏幕上出现一个虚拟键盘当你搜索某个功能时对应键盘上的按键亮起遇到特定的软件文档抓取报错网站结构太复杂没关系随时把 URL 贴在评论区我帮你诊断 XPath 和 CSS 选择器。祝你早日变身不碰鼠标的键盘狂人 文末好啦以上就是本期的全部内容啦如果你在实践过程中遇到任何疑问欢迎在评论区留言交流我看到都会尽量回复咱们下期见小伙伴们在批阅的过程中如果觉得文章不错欢迎点赞、收藏、关注哦三连就是对我写作道路上最好的鼓励与支持❤️✅ 专栏持续更新中建议收藏 订阅墙裂推荐订阅专栏 《Python爬虫实战》本专栏秉承着以“入门 → 进阶 → 工程化 → 项目落地”的路线持续更新争取让每一期内容都做到✅ 讲得清楚原理✅ 跑得起来代码✅ 用得上场景✅ 扛得住工程化想系统提升的小伙伴强烈建议先订阅专栏 《Python爬虫实战》再按目录大纲顺序学习效率十倍上升✅ 互动征集想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战评论区留言告诉我你的需求我会优先安排实现(更新)哒~⭐️ 若喜欢我就请关注我叭更新不迷路⭐️ 若对你有用就请点赞支持一下叭给我一点点动力⭐️ 若有疑问就请评论留言告诉我叭我会补坑 更新迭代✅ 免责声明本文爬虫思路、相关技术和代码仅用于学习参考对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。使用或者参考本项目即表示您已阅读并同意以下条款合法使用 不得将本项目用于任何违法、违规或侵犯他人权益的行为包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。风险自负 任何因使用本项目而产生的法律责任、技术风险或经济损失由使用者自行承担项目作者不承担任何形式的责任。禁止滥用 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。使用或者参考本项目即视为同意上述条款,即 “谁使用谁负责” 。如不同意请立即停止使用并删除本项目。