Python实现全站链接爬取工具-助力打造AI知识库
Python实现全站链接爬取工具助力打造AI 知识库标签#Python #Playwright #爬虫 #AI知识库日期2026-05-01摘要本文介绍一个自己开发的基于 Playwright 的全站站内链接爬取工具通过递归爬取 BeautifulSoup 解析实现自动收集网站所有内部链接支持导出为 Markdown 格式方便批量导入 AI 知识库进行提问式学习。前言最近在学习 NiceGUI 时发现官方文档内容非常丰富组件数量有一百多个。按照传统方式逐页阅读效率很低。有了 AI 之后更高效的学习方式是把官方文档变成你的私人 AI 知识库用提问代替搜索。具体分三步走收集抓取技术网站的所有站内链接导入将链接批量导入 AI 知识库工具我用的是腾讯 IMA对话像和老师一对一交流一样用自然语言提问学习本文重点介绍如何高效抓取全站链接。一、实现原理 核心思路用户输入URL ↓ 递归爬取每个页面的内部链接 ↓ BeautifulSoup 解析 HTML提取 a 标签 ↓ 过滤同域名、非锚点、HTTP/HTTPS ↓ 去重后保存为 Markdown 文件 关键技术点技术作用Playwright渲染 JavaScript获取动态加载后的完整 HTMLBeautifulSoup解析 HTML快速定位所有链接urljoin将相对路径转换为绝对路径递归爬取从首页开始自动发现并访问所有子页面二、完整源码 全站站内链接爬取脚本 功能递归爬取指定网站的所有内部链接自动过滤锚点链接 frombs4importBeautifulSoupfromurllib.parseimporturljoin,urlparsefrommy_playwrightimportMyPlaywrightdefget_internal_links(base_url:str)-set[str]: 递归爬取全站内部链接 Args: base_url: 目标网站根 URL Returns: visited: 所有发现的内部链接集合 visited:set[str]set()# 已访问的 URL 集合pageMyPlaywright(headlessTrue).page# 获取 Playwright Page 对象target_netlocurlparse(base_url).netloc# 提取目标网站的域名def_crawl_links(url:str)-None:爬取指定 URL 的所有内部链接print(f总数{len(visited)}[] 正在抓取:{url}...)visited.add(url)try:page.goto(url,wait_untilnetworkidle,timeout30000)page.wait_for_timeout(500)# 等待确保页面加载完成htmlpage.content()soupBeautifulSoup(html,html.parser)forainsoup.find_all(a,hrefTrue):hrefa[href]full_urlurljoin(url,href)parsedurlparse(full_url)# 过滤非内部链接ifnotparsed.netloctarget_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_pathinternal_links.md):将链接列表保存为 Markdown 文件每 10 条为一组sorted_linkssorted(links)chunk_size10chunks[sorted_links[i:ichunk_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_size1markdown_content.append(f### 第{start_num}-{start_numlen(chunk)-1}条链接\n\n)forlinkinchunk:markdown_content.append(f{link}\n)markdown_content.append(\n)withopen(output_path,w,encodingutf-8)asf:f.writelines(markdown_content)print(f[✓] 已保存到:{output_path})if__name____main__:base_urlhttps://nicegui.io/linksget_internal_links(base_url)save_to_markdown(links)三、源码解析 MyPlaywright 封装这里的MyPlaywright是我对 Playwright 的封装核心特点特性说明永久上下文浏览器状态持久化只需创建一次自动资源释放程序退出时自动关闭浏览器跨平台Windows 显示浏览器Linux 自动无头自动下载监听下载事件自动保存文件使用方式极其简单pageMyPlaywright(headlessTrue).page page.goto(https://example.com) 链接过滤逻辑# 1. 只爬取同域名的链接ifnotparsed.netloctarget_netloc:continue# 2. 跳过锚点链接如 #sectionif#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 自动完成整个学习准备工作。六、总结 要点回顾Playwright解决了 JavaScript 动态渲染页面的抓取问题递归爬取确保覆盖全站所有页面BeautifulSoup高效解析 HTML 中的链接Markdown 分组导出方便批量导入 AI 知识库配合 AI 知识库实现提问式学习效率倍增 适用场景学习新技术框架的官方文档构建个人技术知识库批量收集某网站的所有页面⚠️ 注意事项如果使用腾讯IMA知识库的话很多网上资源可能已经有人已经整理过了只要点击IMA的“发现”按钮就可以搜索并寻找自己感兴趣的知识库订阅即可。七、相关资源学习人最好的时代技术学习实践分享Playwright理解与封装本文为本人原创首发于掘金。如果你有任何问题或想法欢迎在评论区交流