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

Python全站链接爬取工具优化-支持过滤和断点续爬

Python全站链接爬取工具优化支持过滤和断点续爬标签#Python #Playwright #爬虫 #AI知识库日期2026-05-03摘要本文介绍对全站链接爬取工具的优化升级新增链接过滤、断点续爬、默认不下载文件三个优化点让工具更加实用和人性化。前言上一篇文章发布后我在实际使用中遇到了一些痛点❌ 某些网站的静态资源链接如老旧版本的文档不需要爬取❌ 爬取过程中发现要排除某些链接中断后重新开始太浪费时间❌ 默认下载文件会污染本地目录并且也浪费时间于是我对工具进行了优化升级本文分享这些改进。一、优化点一览优化项说明使用场景链接过滤支持排除以指定前缀开头的链接过滤不需要的页面断点续爬异常退出时保存状态下次可继续长耗时任务防中断默认不下载不自动下载网页触发的文件保持目录整洁二、优化后的源码 全站站内链接爬取脚本 v2.0 功能递归爬取指定网站的所有内部链接支持过滤、断点续爬 frombs4importBeautifulSoupfromurllib.parseimporturljoin,urlparsefrommy_playwrightimportMyPlaywrightimportatexitimportCommonimportosdefget_internal_links(base_url:str,filters:set[str]set())-set[str]: 递归爬取全站内部链接 Args: base_url: 目标网站根 URL filters: 需要过滤的 URL 前缀集合 Returns: visited: 所有发现的内部链接集合 def_crawl_links(url:str)-None:爬取指定 URL 的所有内部链接放到 unvisited 集合中print(f{len(visited)}:{len(unvisited)}[] 正在抓取:{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:continueif#infull_url:continueifparsed.schemenotin(http,https):continueiffull_urlinvisited:continue# ⭐ 新增过滤指定前缀的链接ifany(full_url.startswith(s)forsinfilters):continueunvisited.add(full_url)exceptExceptionase:print(f[!] 请求失败:{url}-{e})defon_exit()-None:⭐ 异常退出时保存当前状态ifunvisited:print([!] 异常退出正在保存当前状态到文件...)Common.WriteAllText(tmp_links.txt,str((visited,unvisited)))else:print([!] 所有链接都被访问了)atexit.register(on_exit)visited:set[str]set()# 已访问的 URL 集合unvisited:set[str]{base_url}# 未访问的 URL 集合# ⭐ 新增断点续爬 - 从临时文件恢复状态ifos.path.exists(tmp_links.txt):print([!] 从临时文件读取状态...)visited,unvisitedeval(Common.ReadAllText(tmp_links.txt))# ⭐ 新增默认不下载文件pageMyPlaywright(headlessTrue,accept_downloadsFalse).page target_netlocurlparse(base_url).netlocwhileunvisited:urlnext(iter(unvisited))_crawl_links(url)visited.add(url)unvisited.remove(url)print(f[✓] 已完成{len(visited)}条链接的爬取)returnvisiteddefsave_to_markdown(links,output_pathinternal_links.md):将链接列表保存为 Markdown 文件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://codemirror.net/filters{https://codemirror.net/5/}# ⭐ 过滤旧版本文档linksget_internal_links(base_url,filters)save_to_markdown(links)三、优化详解1️⃣ 链接过滤# 新增 filters 参数defget_internal_links(base_url:str,filters:set[str]set())-set[str]:...ifany(full_url.startswith(s)forsinfilters):continue# 跳过过滤的链接使用示例# 过滤 codemirror 旧版本文档filters{https://codemirror.net/5/}# 或者过滤多个filters{https://example.com/api/,https://example.com/docs/v1/,}2️⃣ 断点续爬核心思路用visited和unvisited两个集合分离管理异常退出时保存状态。正常执行流程 ┌─────────────────────────────────────┐ │ unvisited {url1, url2, url3...} │ │ visited {} │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 取出一个 url1解析所有子链接 │ │ unvisited {url2, url3, url4...} │ │ visited {url1} │ └─────────────────────────────────────┘ ↓ (循环直到 unvisited 为空)异常恢复流程# 程序启动时检查临时文件ifos.path.exists(tmp_links.txt):print([!] 从临时文件读取状态...)visited,unvisitedeval(Common.ReadAllText(tmp_links.txt))使用场景用户开始爬取... 总数50 [] 正在抓取: https://example.com/page45... 总数51 [] 正在抓取: https://example.com/page46... ^C 中断 (CtrlC) 用户发现 page46 不需要过滤掉它 filters {https://example.com/page46} 用户重新运行... [!] 从临时文件读取状态... [] 正在抓取: https://example.com/page47... # ⭐ 从断点继续3️⃣ 默认不下载文件# 新增 accept_downloadsFalsepageMyPlaywright(headlessTrue,accept_downloadsFalse).page这样网页中的下载链接就不会触发自动下载保持工作目录整洁。四、关键技术点总结 核心改进从递归到循环版本方式优点缺点v1.0递归代码直观栈溢出风险、不易中断v2.0循环状态可控、易于断点续爬代码稍复杂 状态持久化# 使用 atexit 注册退出回调atexit.register(on_exit)defon_exit():ifunvisited:Common.WriteAllText(tmp_links.txt,str((visited,unvisited)))⚠️ 注意这里使用eval()反序列化有安全风险生产环境建议用json替代。五、使用效果以 CodeMirror 官网为例用户python crawl.py [] 正在抓取: https://codemirror.net/... [] 正在抓取: https://codemirror.net/5/... # 自动过滤 [✓] 已完成 128 条链接的爬取 用户发现不需要 /5/ 版本 filters {https://codemirror.net/5/} 用户rm internal_links.md python crawl.py [!] 从临时文件读取状态... [] 正在抓取: https://codemirror.net/6/... # 从断点继续 [✓] 已完成 118 条链接的爬取六、后续计划这个工具将继续迭代未来计划 封装成命令行工具支持--url、--filter、--output参数 支持从配置文件读取过滤规则 增加进度显示和预估剩余时间 集成到 AI Agent实现自动化学习流程七、总结 要点回顾链接过滤filters参数支持排除指定前缀的链接断点续爬通过visited/unvisited分离 临时文件实现默认不下载accept_downloadsFalse保持目录整洁核心改进从递归改为循环状态更可控 相关资源上一篇文章Python实现全站链接爬取工具助力打造AI知识库学习人最好的时代技术学习实践分享本文为本人原创首发于掘金。如果你有任何问题或想法欢迎在评论区交流

相关文章:

Python全站链接爬取工具优化-支持过滤和断点续爬

Python全站链接爬取工具优化:支持过滤和断点续爬 标签:#Python #Playwright #爬虫 #AI知识库 日期:2026-05-03 摘要:本文介绍对全站链接爬取工具的优化升级,新增链接过滤、断点续爬、默认不下载文件三个优化点&#xf…...

LLM 技能的本质:带代码的标准化包,还是仅Markdown文档?

最值得推荐的20个宝藏Skills 目录 最值得推荐的20个宝藏Skills 一、链接核心内容解释 二、技能的本质:带代码的标准化包,还是仅Markdown文档? 1. 标准Skill的必填核心结构(符合Anthropic官方规范) 2. 文章中不同类型技能的构成说明 三、通过代码Agent直接使用的核心前提 …...

【物理应用】基于极限学习机的 DC-DC 转换器建模附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

学习c语言第4天

全局变量在int main外,局部变量在int mian内,当变量名字相同局部优先全局;全局变量的作用域是整个工程,局部变量的作用域是变量所在的局部范围。int a100;int main(){int a25;printf…...

【RT-DETR涨点改进】ICME 2026 |独家创新首发、注意力改进篇| 引入SFC显著特征校准模块,通过双分支门控与全局统计信息引导实现特征精细校准,含7种创新改进,助力遥感目标检测任务有效涨点

一、本文介绍 🔥本文给大家介绍使用 SFC显著特征校准模块 改进RT-DETR网络模型,对检测特征进行更细致的自适应校准,使模型在特征融合和预测阶段能够更加准确地突出目标区域、边界轮廓以及局部细节信息。由于SFC能够结合全局统计信息与局部响应,通过双分支门控方式动态调节…...

2026最新一键AI自动生成软著申请表最新格式:AI-Skills自动化生成全套材料,从申请表到源代码文档、用户手册、设计说明书一应俱全,还支持Java、Python、Go等多技术栈,完全适配独立开发

2026最新一键AI自动生成软著申请表最新格式:AI-Skills自动化生成全套材料,从申请表到源代码文档、用户手册、设计说明书一应俱全,还支持Java、Python、Go等多技术栈,完全适配独立开发者和小团队的需求 上周帮一个独立开发者朋友处…...

9 种 RAG 架构,每位 AI 开发者必学:完整实战指南

每个 AI 开发者必须了解的 9 种 RAG 架构(附示例完整指南) 超越基础 RAG,构建可靠的生产级 AI 系统 你的聊天机器人自信地告诉客户:退货政策是 90 天。但实际上是 30 天。它还描述了一些你的产品根本不存在的功能。 这就是“演…...

PPTist终极指南:5分钟掌握免费在线PPT制作工具,告别PowerPoint依赖

PPTist终极指南:5分钟掌握免费在线PPT制作工具,告别PowerPoint依赖 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS …...

零基础转行项目管理,到底要不要考 PMP?

很多零基础想转行项目管理的朋友,都绕不开一个灵魂拷问:花几千块考PMP,到底值不值?不考证就找不到工作吗?作为深耕行业十多年的老PM,今天用最直白的话讲透,帮你精准决策,不花冤枉钱&…...

WeiboImageReverse:一键追溯微博图片来源的Chrome神器,轻松找到图片原作者

WeiboImageReverse:一键追溯微博图片来源的Chrome神器,轻松找到图片原作者 【免费下载链接】WeiboImageReverse Chrome 插件,反查微博图片po主 项目地址: https://gitcode.com/gh_mirrors/we/WeiboImageReverse 在微博这个信息海洋中&…...

本体论Ontology:让企业级AI大模型真正有效运作的隐藏层

摘要 当今大多数企业并不缺乏数据,缺乏的是让数据在所有系统、团队和工具中保持一致语义的能力。本文深入探讨数据本体论(Data Ontology)如何弥合"数据存在"与"数据被理解"之间的鸿沟,阐述其作为AI、知识图谱…...

A-03转义字符、字符串基础、String类

[转义字符]# 转义符基础概述:c#在处理字符串的过程中,无法正确识别空格、斜杠、单、双引号等特殊字符或符号,需使用转义字符才可正确读取1、c#程序中,转义字符使用反斜杠“\”开头,后面紧跟特殊字符或指定字母2、因为c…...

pgBackRest 已死。接下来怎么办?

pgBackRest 已死。接下来怎么办? ** 摘要:** 本文宣布了 pgBackRest 的终止运营。pgBackRest 是顶级的 PostgreSQL 备份工具,在经过十三年的开发后,由唯一的维护者 David Steele 宣布停止维护。本文探讨了该项目终止的原因&#…...

控制权之争:从 Workflow 到 Claude Skills,AI 正在进入「执行契约时代」

读:本文作为《LLM进化史》三部曲终章,让我们看穿AI世界层出不穷的新概念背后的真正本质——所有技术演进,其实都是围绕"谁来决定AI的行为"这一核心问题展开的控制权之争。一、AI圈最大的幻觉:每天都在诞生新技术图&…...

基于改进粒子群模糊PID的颗粒烤炉温度控制【附代码】

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。 ✅ 如需沟通交流,扫描文章底部二维码。(1)基于改进天牛须搜索的模糊PID参数初始化:颗粒烤炉…...

发明vibe coding这个词的人说“从没感觉自己这么落后过”

发明vibe coding这个词的人说“从没感觉自己这么落后过” ⛳️ Karpathy 最近在2026年AI Ascent大会与红杉资本合伙人访谈中里说了一句话: 「我作为程序员,从来没感觉自己这么落后过。」 🔗访谈连接:https://www.youtube.com/wa…...

QKeyMapper:重新定义你的Windows操作体验,免费开源按键映射终极方案

QKeyMapper:重新定义你的Windows操作体验,免费开源按键映射终极方案 【免费下载链接】QKeyMapper [按键映射工具] QKeyMapper,Qt开发Win10&Win11可用,不修改注册表、不需重新启动系统,可立即生效和停止。支持游戏手…...

生成器不是性能银弹:什么时候该用 `yield` 省内存,什么时候它会拖慢 Python 数据处理吞吐?

生成器不是性能银弹:什么时候该用 yield 省内存,什么时候它会拖慢 Python 数据处理吞吐? 在 Python 编程里,生成器常被描述成一种“优雅又高效”的工具。它懒加载、按需计算、不一次性占用大量内存,尤其适合处理大文件…...

SharpKeys键盘重映射工具:彻底解决Windows按键布局烦恼的5个实用场景

SharpKeys键盘重映射工具:彻底解决Windows按键布局烦恼的5个实用场景 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sh…...

虚拟线程CPU绑定率飙升87%?Java 25 Scheduler Tuning Checklist,90%团队漏配的3个关键参数

更多请点击: https://intelliparadigm.com 第一章:Java 25虚拟线程调度机制演进与性能危机溯源 Java 25 将虚拟线程(Virtual Threads)从预览特性正式纳入标准运行时,并重构了ForkJoinPool与CarrierThread的协同调度模…...

Python 性能分析实战:接口从 50ms 飙到 500ms,我会先查什么?

Python 性能分析实战:接口从 50ms 飙到 500ms,我会先查什么? Python 很优雅,但优雅不等于天然高性能。真正成熟的 Python 编程,不是看到慢就立刻改代码,而是先问一句:慢在哪里?CPU、…...

在Windows上无缝安装Android应用:APK Installer的革新之路

在Windows上无缝安装Android应用:APK Installer的革新之路 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想过,为什么在Windows上运行…...

个性化AI推理技术:如何实现用户偏好精准对齐

1. 项目背景与核心挑战社交推理类AI产品近年来呈现爆发式增长,从早期的简单问答机器人发展到如今能够进行多轮复杂对话的智能体。但在实际应用中,我们经常遇到这样的困境:同一个AI模型,有些用户觉得"太啰嗦"&#xff0c…...

C盘告急别慌!保姆级教程:用WSL2自带命令把Ubuntu搬到D盘(附默认用户修复)

C盘空间告急?WSL2迁移至D盘的完整解决方案与深度优化指南 每次打开资源管理器看到C盘那刺眼的红色警告条,心跳是不是都会漏跳一拍?作为Windows开发者,我们既依赖WSL2带来的Linux开发便利,又苦于它不断蚕食宝贵的C盘空间…...

WAM-202602:DreamZero

WAM-202602:DreamZero...

分布式链路追踪核心原理与Go Web服务集成实践

1. 项目概述与核心价值最近在排查一个线上服务的性能瓶颈时,我又一次用到了User1334/Trace这个工具。说实话,在分布式系统和微服务架构成为主流的今天,一个请求从用户端到数据库,中间可能穿越十几个甚至几十个不同的服务节点。当这…...

别再手动算日期了!用C语言实现BCD码与十进制互转(附完整代码)

嵌入式开发中的BCD码高效转换实战指南 在汽车电子和物联网设备的开发中,实时时钟(RTC)模块输出的日期时间数据往往采用BCD码格式。我曾在一个车载信息娱乐系统项目中,因为对BCD码处理不当导致仪表盘时间显示错误,花了整…...

从‘开口三角’到系统接地:手把手教你分析PT在单相接地故障时的电压变化

从‘开口三角’到系统接地:手把手教你分析PT在单相接地故障时的电压变化 在变电站日常运维中,电压互感器(PT)的开口三角电压监测是判断系统接地故障的"晴雨表"。当中性点接地方式不同的电力系统发生单相接地时&#xff…...

四旋翼无人机自适应控制:RAPTOR框架解析与实践

1. 项目背景与核心价值四旋翼飞行器的控制策略一直是无人机领域的核心挑战。传统PID控制器虽然结构简单,但在面对复杂环境扰动、负载变化或模型不确定性时,往往需要频繁手动调参。我在实际工程中遇到过多次这样的场景:同一套参数在实验室表现…...

终极指南:如何用开源工具SubtitleOCR实现10倍速硬字幕提取

终极指南:如何用开源工具SubtitleOCR实现10倍速硬字幕提取 【免费下载链接】SubtitleOCR 快如闪电的硬字幕提取工具。仅需苹果M1芯片或英伟达3060显卡即可达到10倍速提取。A very fast tool for video hardcode subtitle extraction 项目地址: https://gitcode.co…...