当前位置: 首页 > news >正文

Python实现全站链接爬取工具-助力打造AI知识库

Python实现全站链接爬取工具:助力打造AI 知识库

标签:#Python #Playwright #爬虫 #AI知识库
日期:2026-05-01
摘要:本文介绍一个自己开发的基于 Playwright 的全站站内链接爬取工具,通过递归爬取 + BeautifulSoup 解析实现自动收集网站所有内部链接,支持导出为 Markdown 格式,方便批量导入 AI 知识库进行"提问式学习"。


前言

最近在学习 NiceGUI 时,发现官方文档内容非常丰富,组件数量有一百多个。按照传统方式逐页阅读,效率很低。

有了 AI 之后,更高效的学习方式是:把官方文档变成你的私人 AI 知识库,用提问代替搜索

具体分三步走:

  1. 收集:抓取技术网站的所有站内链接
  2. 导入:将链接批量导入 AI 知识库工具(我用的是腾讯 IMA)
  3. 对话:像和老师一对一交流一样,用自然语言提问学习

本文重点介绍:如何高效抓取全站链接


一、实现原理

🎯 核心思路

用户输入URL ↓ 递归爬取每个页面的内部链接 ↓ BeautifulSoup 解析 HTML,提取 <a> 标签 ↓ 过滤:同域名、非锚点、HTTP/HTTPS ↓ 去重后保存为 Markdown 文件

🔑 关键技术点

技术作用
Playwright渲染 JavaScript,获取动态加载后的完整 HTML
BeautifulSoup解析 HTML,快速定位所有链接
urljoin将相对路径转换为绝对路径
递归爬取从首页开始,自动发现并访问所有子页面

二、完整源码

''' 全站站内链接爬取脚本 功能:递归爬取指定网站的所有内部链接,自动过滤锚点链接 '''frombs4importBeautifulSoupfromurllib.parseimporturljoin,urlparsefrommy_playwrightimportMyPlaywrightdefget_internal_links(base_url:str)->set[str]:""" 递归爬取全站内部链接 Args: base_url: 目标网站根 URL Returns: visited: 所有发现的内部链接集合 """visited:set[str]=set()# 已访问的 URL 集合page=MyPlaywright(headless=True).page# 获取 Playwright Page 对象target_netloc=urlparse(base_url).netloc# 提取目标网站的域名def_crawl_links(url:str)->None:'''爬取指定 URL 的所有内部链接'''print(f"总数:{len(visited)}[+] 正在抓取:{url}...")visited.add(url)try:page.goto(url,wait_until='networkidle',timeout=30000)page.wait_for_timeout(500)# 等待确保页面加载完成html=page.content()soup=BeautifulSoup(html,'html.parser')forainsoup.find_all('a',href=True):href=a['href']full_url=urljoin(url,href)parsed=urlparse(full_url)# 过滤非内部链接ifnotparsed.netloc==target_netloc:continue# 跳过其他域名的链接if'#'infull_url:continue# 跳过锚点链接ifparsed.schemenotin('http','https'):continue# 跳过非 HTTP/HTTPS 链接iffull_urlinvisited:continue# 跳过已访问的链接_crawl_links(full_url)# 递归爬取子链接exceptExceptionase:print(f"[!] 请求失败:{url}-{e}")_crawl_links(base_url)print(f"[✓] 已完成{len(visited)}条链接的爬取")returnvisiteddefsave_to_markdown(links,output_path='internal_links.md'):"""将链接列表保存为 Markdown 文件,每 10 条为一组"""sorted_links=sorted(links)chunk_size=10chunks=[sorted_links[i:i+chunk_size]foriinrange(0,len(sorted_links),chunk_size)]markdown_content=[]markdown_content.append("# 全站内部链接列表\n")markdown_content.append(f"共发现 **{len(links)}** 条链接\n\n")markdown_content.append("---\n\n")foridx,chunkinenumerate(chunks,1):start_num=(idx-1)*chunk_size+1markdown_content.append(f"### 第{start_num}-{start_num+len(chunk)-1}条链接\n\n")forlinkinchunk:markdown_content.append(f"{link}\n")markdown_content.append("\n")withopen(output_path,'w',encoding='utf-8')asf:f.writelines(markdown_content)print(f"[✓] 已保存到:{output_path}")if__name__=='__main__':base_url='https://nicegui.io/'links=get_internal_links(base_url)save_to_markdown(links)

三、源码解析

🔍 MyPlaywright 封装

这里的MyPlaywright是我对 Playwright 的封装,核心特点:

特性说明
永久上下文浏览器状态持久化,只需创建一次
自动资源释放程序退出时自动关闭浏览器
跨平台Windows 显示浏览器,Linux 自动无头
自动下载监听下载事件,自动保存文件

使用方式极其简单:

page=MyPlaywright(headless=True).page page.goto("https://example.com")

🔍 链接过滤逻辑

# 1. 只爬取同域名的链接ifnotparsed.netloc==target_netloc:continue# 2. 跳过锚点链接(如 #section)if'#'infull_url:continue# 3. 只处理 HTTP/HTTPS 链接ifparsed.schemenotin('http','https'):continue# 4. 已访问过的跳过iffull_urlinvisited:continue

🔍 递归爬取流程

nicegui.io (起始页) ├── /documentation │ ├── /documentation/button │ │ └── (发现更多子链接...) │ ├── /documentation/input │ └── ... ├── /examples │ └── ... └── ...

四、使用效果

以 NiceGUI 官网为例,运行脚本后:

总数:0 [+] 正在抓取: https://nicegui.io/... 总数:1 [+] 正在抓取: https://nicegui.io/documentation... 总数:2 [+] 正在抓取: https://nicegui.io/documentation/button... ... [✓] 已完成 139 条链接的爬取 [✓] 已保存到: internal_links.md

生成的 Markdown 文件示例:

# 全站内部链接列表 共发现 **139** 条链接 --- ### 第 1-10 条链接 https://nicegui.io https://nicegui.io/documentation https://nicegui.io/documentation/button https://nicegui.io/documentation/switch ...

每 10 条链接为一组,方便批量导入到 IMA 等 AI 知识库工具。


五、后续计划

这个工具将被整合到类似于龙虾的Agent中,作为一个自动化子任务:

AI Agent ├── 任务:学习 NiceGUI │ ├── 子任务:爬取全站链接 → 调用 crawl_internal_links.py │ ├── 子任务:整理分组格式 │ └── 子任务:导入 AI 知识库 └── ...

目标是实现:一句话,让 AI 自动完成整个学习准备工作


六、总结

📌 要点回顾

  1. Playwright解决了 JavaScript 动态渲染页面的抓取问题
  2. 递归爬取确保覆盖全站所有页面
  3. BeautifulSoup高效解析 HTML 中的链接
  4. Markdown 分组导出方便批量导入 AI 知识库
  5. 配合 AI 知识库实现"提问式学习",效率倍增

💡 适用场景

  • 学习新技术框架的官方文档
  • 构建个人技术知识库
  • 批量收集某网站的所有页面

⚠️ 注意事项

  • 如果使用腾讯IMA知识库的话,很多网上资源可能已经有人已经整理过了,只要点击IMA的“发现”按钮,就可以搜索并寻找自己感兴趣的知识库,订阅即可。

七、相关资源

  • 学习人最好的时代:技术学习实践分享
  • Playwright理解与封装

本文为本人原创,首发于掘金。
如果你有任何问题或想法,欢迎在评论区交流!

http://www.jsqmd.com/news/735187/

相关文章:

  • DRM互操作性解决方案:Coral联盟与NEMO技术解析
  • PHP Swoole 与大模型深度协同的长连接设计范式(LLM Token流精准控制、心跳保活、上下文隔离三重权威实践)
  • 别再只用Ctrl+C/V了!这15个Win11快捷键组合,让你办公效率翻倍(附场景化使用指南)
  • 通过用量看板清晰观测团队AI模型成本与消耗趋势
  • pip install 报错大盘点:从 read time out 到 PyTorch GPU 安装失败的终极解法(附超大离线 .whl 包)
  • 别再写满屏if-else了!用SystemVerilog断言(SVA)给你的RTL代码做个‘体检’
  • 2026年,呼和浩特市这些专业床垫品牌名声如何?一起揭秘!
  • 告别云服务:手把手教你在安卓Termux里离线部署ChatGLM,当个随身AI助手
  • 【2026 Laravel 12+ AI集成终极指南】:零代码接入LLM、实时推理优化与生产级安全加固(含官方未公开API清单)
  • Apple Silicon本地大模型性能测试工具Anubis:从原理到实战
  • Spartan-II FPGA集成8051微控制器的工业应用与优化
  • Bili2text完整指南:3步将B站视频转文字稿,学习工作效率提升10倍!
  • 缠论三类买点
  • 智能内存数据库中间件:预测性缓存与性能优化实践
  • 金融风控场景中的LLM偏见暴雷预警,R语言实现Bias Score实时监控与监管报送合规闭环
  • Khadas Edge2 Pro评测:RK3588S在Ubuntu下的性能与应用
  • ES分页踩坑实录:从一次线上OOM排查,到max_result_window参数调优与Search After实战
  • OpenClaw 只能手动写脚本?我用 Chrome 插件实现了“录制即生成“
  • Swoole WebSocket + LLM流式输出:从内存泄漏到零GC抖动的8次迭代调优实录
  • 3分钟解决Linux无线网络难题:Realtek RTL8821CE驱动完整指南
  • 含电转气-碳捕集耦合的综合能源系统低碳经济调度模型分析
  • 打造 AI 级 Agent 架构
  • Codex + Git 开发环境配置指南(WSL版)
  • 告别手动切换!盘点2024年那些支持自动换向的RS485芯片(ADI/TI/国产平替全收录)
  • AI 正从“会聊天”走向“能干活”,开发者和普通人都该重新看待这波变化
  • AI智能体赋能B2B销售:自然语言查询数据库精准挖掘客户线索
  • 2026年防腐木休闲长椅技术解析:欧式铁艺桌椅、漫步机、简约铁艺桌椅、组合式花箱、运动器材、钢木垃圾桶、钢板垃圾桶选择指南 - 优质品牌商家
  • Cursor编辑器光标样式自定义:基于规则的动态视觉反馈系统
  • 城市智能化的底层基石:基于腾讯地图服务生态的移动定位与导航架构指引
  • 别再手动配Samba了!用Docker Compose 5分钟搞定家庭NAS文件共享(附dperson/samba镜像配置详解)