如何避免Python爬虫重复抓取相同页面?
在网络爬虫开发过程中,重复抓取相同页面是一个常见但必须解决的问题。重复抓取不仅会浪费网络带宽和计算资源,降低爬虫效率,还可能导致目标网站服务器过载,甚至触发反爬机制。本文将深入探讨Python爬虫中避免重复抓取的多种技术方案,并提供详细的实现代码和最佳实践建议。
一、为什么需要避免重复抓取?
在深入技术实现之前,我们首先需要理解避免重复抓取的重要性:
- 资源效率:避免不必要的网络请求和数据处理
- 服务器友好:减少对目标网站服务器的压力
- 数据质量:防止重复数据污染数据集
- 遵守规则:符合robots.txt和爬虫道德规范
- 成本控制:节省网络带宽和存储空间
二、识别重复页面的关键因素
要避免重复抓取,首先需要明确如何判断两个页面是"相同"的。常见的判断依据包括:
- URL:最直接的判断标准,但需注意参数顺序、锚点等
- 内容哈希:通过页面内容生成唯一标识
- 关键元素:提取页面中的特定元素(如标题、发布时间)作为标识
- 组合标识:结合URL和内容特征进行综合判断
三、技术实现方案
3.1 基于URL的重复检测
URL是最容易获取的页面标识,实现起来也最简单。
3.1.1 使用Python集合(Set)
visited_urls = set()def should_crawl(url):if url in visited_urls:return Falsevisited_urls.add(url)return True# 使用示例
url = "https://example.com/page1"
if should_crawl(url):# 执行抓取逻辑print(f"抓取: {url}")
else:print(f"跳过: {url}")
优点:实现简单,内存中操作速度快
缺点:内存占用随URL数量增加而增长,程序重启后数据丢失
3.1.2 使用Bloom Filter(布隆过滤器)
对于超大规模URL去重,Bloom Filter是内存效率极高的解决方案。
from pybloom_live import ScalableBloomFilter
import hashlibclass BloomURLFilter:def __init__(self, initial_capacity=100000, error_rate=0.001):self.filter = ScalableBloomFilter(initial_capacity=initial_capacity, error_rate=error_rate)def should_crawl(self, url):# 对URL进行标准化处理normalized_url = self.normalize_url(url)# 生成URL的哈希作为键url_hash = self.hash_url(normalized_url)if url_hash in self.filter:return Falseself.filter.add(url_hash)return Truedef normalize_url(self, url):# 实现URL标准化逻辑,如去掉查询参数、统一大小写等return url.lower().split("#")[0].split("?")[0]def hash_url(self, url):return hashlib.sha256(url.encode('utf-8')).hexdigest()# 使用示例
bloom_filter = BloomURLFilter()
urls = ["https://example.com/page1?id=1", "https://example.com/page1?id=2", "https://example.com/page2"]for url in urls:if bloom_filter.should_crawl(url):print(f"抓取: {url}")else:print(f"跳过: {url}")
优点:内存效率极高,适合海量URL去重
缺点:存在一定的误判率(但不会漏判),无法删除已添加的URL
3.2 基于内容哈希的重复检测
有时不同URL可能返回相同内容,这时需要基于内容进行去重。
import hashlibclass ContentFilter:def __init__(self):self.content_hashes = set()def should_crawl(self, content):content_hash = self.hash_content(content)if content_hash in self.content_hashes:return Falseself.content_hashes.add(content_hash)return Truedef hash_content(self, content):# 对内容进行预处理,如去掉空白字符、特定标签等processed_content = self.preprocess_content(content)return hashlib.sha256(processed_content.encode('utf-8')).hexdigest()def preprocess_content(self, content):# 实现内容预处理逻辑return " ".join(content.split()) # 简单示例:合并多余空白字符# 使用示例
content_filter = ContentFilter()
contents = ["<html><body>Hello World</body></html>","<html><body> Hello World </body></html>","<html><body>Different Content</body></html>"
]for content in contents:if content_filter.should_crawl(content):print("新内容,需要处理")else:print("重复内容,跳过")
优点:能检测到不同URL相同内容的情况
缺点:计算哈希消耗CPU资源,存储所有内容哈希占用内存
3.3 分布式爬虫的去重方案
在分布式爬虫系统中,去重需要跨多台机器协同工作。常见的解决方案是使用Redis。
3.3.1 使用Redis实现分布式URL去重
import redis
import hashlibclass RedisURLFilter:def __init__(self, host='localhost', port=6379, db=0, key='visited_urls'):self.redis = redis.StrictRedis(host=host, port=port, db=db)self.key = keydef should_crawl(self, url):url_hash = self.hash_url(url)added = self.redis.sadd(self.key, url_hash)return added == 1def hash_url(self, url):return hashlib.sha256(url.encode('utf-8')).hexdigest()# 使用示例
redis_filter = RedisURLFilter()
urls = ["https://example.com/page1", "https://example.com/page2", "https://example.com/page1"]for url in urls:if redis_filter.should_crawl(url):print(f"抓取: {url}")else:print(f"跳过: {url}")
优点:支持分布式环境,性能好
缺点:需要维护Redis服务器
四、高级技巧与最佳实践
4.1 增量爬取策略
对于需要定期更新的网站,实现增量爬取:
import sqlite3
import timeclass IncrementalCrawler:def __init__(self, db_path="crawler.db"):self.conn = sqlite3.connect(db_path)self._init_db()def _init_db(self):cursor = self.conn.cursor()cursor.execute("""CREATE TABLE IF NOT EXISTS page_updates (url TEXT PRIMARY KEY,last_modified TIMESTAMP,content_hash TEXT,last_crawled TIMESTAMP)""")self.conn.commit()def should_update(self, url, last_modified=None, content_hash=None):cursor = self.conn.cursor()cursor.execute("""SELECT last_modified, content_hash FROM page_updates WHERE url=?""", (url,))row = cursor.fetchone()if not row:return True # 新URL,需要抓取db_last_modified, db_content_hash = row# 检查最后修改时间if last_modified and db_last_modified:if last_modified > db_last_modified:return True# 检查内容哈希if content_hash and content_hash != db_content_hash:return Truereturn Falsedef record_crawl(self, url, last_modified=None, content_hash=None):cursor = self.conn.cursor()cursor.execute("""INSERT OR REPLACE INTO page_updates (url, last_modified, content_hash, last_crawled) VALUES (?, ?, ?, ?)""", (url, last_modified, content_hash, int(time.time())))self.conn.commit()def close(self):self.conn.close()# 使用示例
crawler = IncrementalCrawler()
url = "https://example.com/news"# 模拟HTTP请求获取Last-Modified和内容
last_modified = "Wed, 21 Oct 2022 07:28:00 GMT"
content = "<html>最新新闻内容</html>"
content_hash = hashlib.sha256(content.encode()).hexdigest()if crawler.should_update(url, last_modified, content_hash):print("页面需要更新")# 执行实际抓取逻辑...crawler.record_crawl(url, last_modified, content_hash)
else:print("页面无需更新")crawler.close()
4.2 结合多种策略的混合去重
class HybridDeduplicator:def __init__(self):self.url_filter = BloomURLFilter()self.content_filter = ContentFilter()def should_crawl(self, url, content=None):# 第一层:URL去重if not self.url_filter.should_crawl(url):return False# 第二层:内容去重(如果有内容)if content is not None:if not self.content_filter.should_crawl(content):return Falsereturn True# 使用示例
deduplicator = HybridDeduplicator()# 第一次出现
url1 = "https://example.com/page1"
content1 = "相同内容"
print(deduplicator.should_crawl(url1, content1)) # True# 相同URL不同内容(不太可能发生)
url2 = "https://example.com/page1"
content2 = "不同内容"
print(deduplicator.should_crawl(url2, content2)) # False (URL重复)# 不同URL相同内容
url3 = "https://example.com/page2"
content3 = "相同内容"
print(deduplicator.should_crawl(url3, content3)) # False (内容重复)
五、性能优化与注意事项
- 内存管理:对于大型爬虫,考虑使用磁盘存储或数据库代替内存存储
- 哈希算法选择:平衡速度与碰撞概率,SHA256是较好选择
- 定期维护:清理长时间未访问的URL记录
- 异常处理:确保网络问题不会导致去重状态不一致
- 测试验证:验证去重逻辑是否按预期工作
- 使用代理:使用代理能更好的应对反爬策略,例如:https://www.16yun.cn/
六、总结
避免Python爬虫重复抓取相同页面是开发高效、友好爬虫的关键技术。根据爬虫规模、目标网站特点和运行环境,开发者可以选择合适的去重策略:
- 小型爬虫:内存集合或SQLite数据库
- 中型爬虫:Bloom Filter
- 大型分布式爬虫:Redis等分布式存储
- 高精度需求:结合URL和内容去重的混合策略
相关文章:
如何避免Python爬虫重复抓取相同页面?
在网络爬虫开发过程中,重复抓取相同页面是一个常见但必须解决的问题。重复抓取不仅会浪费网络带宽和计算资源,降低爬虫效率,还可能导致目标网站服务器过载,甚至触发反爬机制。本文将深入探讨Python爬虫中避免重复抓取的多种技术方…...
LeetCode.02.04.分割链表
分割链表 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1: 输入:head [1,4,3,2,5,2], x …...
鸿蒙开发_ARKTS快速入门_语法说明_渲染控制---纯血鸿蒙HarmonyOS5.0工作笔记012
然后我们再来看渲染控制 首先看条件渲染,其实就是根据不同的状态,渲染不同的UI界面 比如下面这个暂停 开启播放的 可以看到就是通过if 这种条件语句 修改状态变量的值 然后我们再来看这个, 下面点击哪个,上面横线就让让他显示哪个 去看一下代码 可以看到,有两个状态变量opt…...
MOP数据库中的EXPLAIN用法
EXPLAIN 是 SQL 中的一个非常有用的工具,主要用于分析查询语句的执行计划。执行计划能展示数据库在执行查询时的具体操作步骤,像表的读取顺序、使用的索引情况、数据的访问方式等,这有助于我们对查询性能进行优化。 语法 不同的数据库系统&…...
软考 系统架构设计师系列知识点 —— 设计模式之抽象工厂模式
本文内容参考: 软考 系统架构设计师系列知识点之设计模式(2)_系统架构设计师中考设计模式吗-CSDN博客 https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/2361182 特此致谢! Abstract Fac…...
告别水下模糊!SU-YOLO:轻量化+尖峰神经网络,用“类脑计算”实现水下目标毫秒级识别
目录 一、摘要 二、引言 三、相关工作 SNN 物体检测 水下物体探测 水下图像去噪 归一化 四、方法 水下尖峰YOLO 尖峰干扰器 SU-Block SpikeSPP 编码器和检测头 分批归一化 五、Coovally AI模型训练与应用平台 六、实验结果 数据集和实施细节 数据集 实施细节…...
Three.js 系列专题 8:实战项目 - 构建一个小型 3D 游戏
内容概述 本专题将通过一个实战项目展示 Three.js 的综合应用。游戏包含迷宫生成、角色移动、相机控制和简单的物理碰撞检测(可选)。这将帮助你将之前学到的知识融会贯通。 学习目标 整合几何体、光照、动画和交互知识。实现基本的游戏逻辑和用户控制。可选:使用 Cannon.j…...
嵌入式笔试(一)
C语言和嵌入式软件 面试题(共10题 时间30分钟) 1. 请写出下面声明的含义。 int(*s[10])(int);定义了一个数组为s包含十个元素,每个元素都是函数指针,函数的参数为一个int类型,返回值也是int类型2. 选择题 设有一台计算机,它有一条加法指令,每次可计算三个数的和。如果要…...
spark 的流量统计案例
创建一个目录为data...
局域网访问 Redis 方法
局域网访问 Redis 方法 默认情况下,Redis 只允许本机 (127.0.0.1) 访问。如果你想让局域网中的其他设备访问 Redis,需要 修改 Redis 配置,并确保 防火墙放行端口。 方法 1:修改 Redis 配置 1. 修改 redis.conf(或 me…...
LeetCode题五:合并两个有序链表
基本思路其实就是:先建立一个空链表,然后将尾节点放在头结点上; 如果第一个链表节点值较小,那么先将list1插入新链表中,然后将尾节点后移;相同的,第二个也需要比较;移动新链表的指针…...
深入探索 `malloc`:内存分配失败的原因及正确使用规范
文章目录 一、malloc 内存分配失败的常见原因1. 内存不足2. 内存越界访问3. 内存碎片化4. 系统限制5. 错误的使用方式 二、如何正确使用 malloc1. 检查返回值2. 释放内存3. 避免内存越界4. 优化内存使用5. 调整系统参数6. 使用高效的内存分配器 三、总结 在 C 语言中࿰…...
处理Excel的python库openpyxl、xlrd、xlwt、panda区别
openpyxl、xlrd、xlwt、pandas 都能处理 Excel 表格,但用途和适合的场景不同。今天做个总结: 库名功能支持格式读写支持样式备注openpyxl全面的.xlsx处理库.xlsx(Excel2007)✅✅✅首选xlrd读取.xls文件的老牌工具.xls(…...
【C++11】特殊类的设计 单例模式 类型转换
目录 一、特殊类的设计: 1、设计一个不能够拷贝的类: 2、设计一个只能在堆上创建的类 3、设计一个只能在栈上创建的类 4、设计一个不能被继承的类: 二、单例模式: 设计一个只能创建一个对象的类: 饿汉模式&…...
基于vue框架的助农特色农产品销售系统i7957(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,商品分类,农产品信息,特价商品,爱心捐赠 开题报告内容 基于Vue框架的助农特色农产品销售系统开题报告 一、研究背景与意义 (一)研究背景 随着乡村振兴战略的深入实施,特色农产品作为农村经济的重要组成部…...
Linux 学习笔记(3):ls 命令深入剖析与实践应用(期末、期中复习必备)
前言 一、ls 命令基础语法 命令示例 二、工作目录与 HOME 目录 1.工作目录 2.HOME 目录 三、结语 前言 在 Linux 系统的学习旅程中,基础命令的掌握是迈向熟练操作的关键一步。其中,ls 命令作为我们探索系统文件和目录结构的常用工具,有着…...
最简CNN based RNN源码
1.源码: GitCode - 全球开发者的开源社区,开源代码托管平台 最终的效果: 数据集是20个周期,1024点sin(x)加了偏置。其中用于训练的有1024-300点。最后300点用来进行测试。上面的右侧输出的,其实对应左侧x73之后的波形࿰…...
大模型是如何把向量解码成文字输出的
hidden state 向量 当我们把一句话输入模型后,例如 “Hello world”: token IDs: [15496, 995]经过 Embedding Transformer 层后,会得到每个 token 的中间表示,形状为: hidden_states: (batch_size, seq_len, hidd…...
Elasticsearch:加快 HNSW 图的合并速度
作者:来自 Elastic Thomas Veasey 及 Mayya Sharipova 过去,我们曾讨论过搜索多个 HNSW 图时所面临的一些挑战,以及我们是如何缓解这些问题的。当时,我们也提到了一些计划中的改进措施。本文正是这项工作的成果汇总。 你可能会问…...
Elasticsearch单节点安装手册
Elasticsearch单节点安装手册 以下是一份 Elasticsearch 单节点搭建手册,适用于 Linux 系统(如 CentOS/Ubuntu),供学习和测试环境使用。 Elasticsearch 单节点搭建手册 1. 系统要求 操作系统:Linux(Cent…...
前端用户列表与后端分页协同设计
分页实现方案 在现代Web应用中,用户列表展示与分页是一个常见的功能需求。前端与后端通过API协同工作,使用PageHelper等工具实现高效分页。 例如: 后端实现 (使用PageHelper) public PageResult DishPage(DishPageQueryDTO dishPageQuery…...
MyBatis的第四天学习笔记下
10.MyBatis参数处理 10.1 项目信息 模块名:mybatis-007-param数据库表:t_student表结构: id: 主键name: 姓名age: 年龄height: 身高sex: 性别birth: 出生日期 sql文件: create table t_student ( id bigint auto_increm…...
三类人解决困境的方法
有一个视频讲述了三类人解决困境的方法,视频中有持续流出干净水源的水龙头,一杯装满脏水的玻璃杯。第一类普通人是拿着玻璃杯放到水龙头下不断接水,水龙头一直开着的第二类高手是把脏水倒到水池里,然后打开水龙头接水,…...
蓝桥杯第十一届省赛C++B组真题解析
蓝桥杯第十一届省赛CB组真题解析 八、回文日期https://www.lanqiao.cn/problems/348/learning 方法一:暴力枚举所有的日期,记录有多少个回文日期。 #include <bits/stdc.h> using namespace std; int month[13]{0,31,28,31,30,31,30,31,31,30,31…...
Tailscale 的工作原理*
Tailscale 的核心原理基于 WireGuard VPN,它实现了端到端加密的 点对点(P2P)连接,但在必要时会通过 中继服务器(DERP) 进行中转。整体来说,它是一个 零配置的 Mesh VPN,让所有设备看…...
PyTorch张量范数计算终极指南:从基础到高阶实战
在深度学习领域,张量范数计算是模型正则化、梯度裁剪、特征归一化的核心技术。本文将以20代码实例,深度剖析torch.norm的9大核心用法,并揭示其在Transformer模型中的关键应用场景。 🚀 快速入门(5分钟掌握核心操作&…...
Innovus DRC Violation和Calibre DRC Violation分析和修复案例
今天把小编昨天帮助社区训练营学员远程协助的一个经典案例分享给大家。希望能够帮助到更多需要帮助的人。如果各位想跟小编来系统学习数字后端设计实现的,可以联系小编。 数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方…...
数据库7(数据定义语句,视图,索引)
1.数据定义语句 SQL数据定义语言(DDL)用于定义和管理数据库结构,包括创建、修改和删除 数据库对象。常见的DDL语句包括CREATE、DROP和ALTER。 它的操作的是对象,区分操作数据的语句:INSERT,DELETE,UPDATE 示例&#x…...
Cadence 修改 铜和pin脚 连接属性 和 光绘参数修改
光绘层叠设置,参考 光绘参数修改, 中英文对照...
秒杀业务的实现过程
一.后台创建秒杀的活动场次信息,并关联到要秒杀的商品或服务; 二.通过定时任务,将秒杀的活动信息和商品服务信息存储到redis; 三.在商品展示页的显眼位置加载秒杀活动信息; 四.用户参与秒杀,创建订单,将…...
✅ Ultralytics YOLO 训练(Train)时实时获取 COCO 指标(AP):2025最新配置与代码详解 (小白友好 + B站视频)
✅ YOLO获取COCO指标(4): 训练(Train)启用COCO API评估(实时监控AP指标)| 发论文必看! | Ultralytics | 小白友好 文章目录 一、问题定位二、原理分析三、解决方案与实践案例步骤 1: 在 model.train() 调用中设置 save_jsonTrue步骤 2: 修改 …...
java基础 流(Stream)
Stream Stream 的核心概念核心特点 Stream 的操作分类中间操作(Intermediate Operations)终止操作(Terminal Operations) Stream 的流分类顺序流(Sequential Stream)并行流(Parallel Stream&…...
基于springboot+vue的课程管理系统
一、系统架构 前端:vue | element-ui 后端:springboot | mybatis-plus 环境:jdk1.8 | mysql8 | maven | node v16.20.2 | idea 二、代码及数据 三、功能介绍 01. 登录 02. 管理员-首页 03. 管理员-系管理 04. 管理员-专业管理 05. 管…...
android14 keycode 上报 0 解决办法
驱动改完后发现上报了keycode=0 04-07 13:02:33.201 2323 2662 D WindowManager: interceptKeyTq keycode=0 interactive=false keyguardActive=true policyFlags=2000000 04-07 13:02:33.458 2323 2662 D WindowManager: interceptKeyTq keycode=0 interactive=false key…...
小说现代修仙理论
修仙理论 灵魂感应与感知强化:通过特定的修炼方法,感应自身灵魂,以此提升感知能力,使修炼者对周围环境及自身状态的察觉更为敏锐。 生物电的感知与运用 生物电感知:修炼者需凝神静气,感知体内生物…...
6.综合练习1-创建文件
题目: 分析: 本例中使用mkdirs方法创建aaa文件夹。 题目要求是"在当前模块下的aaa文件夹",此时在左侧的目录中,是没有aaa文件夹的,所以要先创建a.txt文件的父级路径aaa文件夹,由于是在当前模块下…...
PostgreSQL的内存管理机制
目录 V1.0PostgreSQL的内存管理机制文件系统缓存作为二级缓存内存切换机制性能影响总结 V2.0PostgreSQL 内存管理机制:双缓存体系验证与笔记完善1. 现有描述验证2. 完善后的内存管理笔记2.1 双缓存体系2.2 其他关键内存区域2.3 验证方法 3. 注意事项 V1.0 PostgreS…...
ReplicaSet、Deployment功能是怎么实现的?
在Kubernetes中,ReplicaSet 和 Deployment 是用于管理 Pod 副本的关键对象。它们各自的功能和实现机制如下: 1. ReplicaSet 功能 管理 Pod 副本:确保指定数量的 Pod 副本一直在运行。如果有 Pod 副本崩溃或被删除,ReplicaSet 会…...
544 eff.c:1761处loop vect 分析
2.6 带有mask的向量数学函数 gcc 支持的svml向量数学函数 32652 GCC currently emits calls to code{vmldExp2}, 32653 code{vmldLn2}, code{vmldLog102}, code{vmldPow2}, 32654 code{vmldTanh2}, code{vmldTan2}, code{vmldAtan2}, code{vmldAtanh2}, 32655 code{vmldCbrt2}…...
搜狗拼音输入法纯净优化版:去广告,更流畅输入体验15.2.0.1758
前言 搜狗输入法电脑版无疑是装机必备的神器。它打字精准,词库丰富全面,功能强大,极大地提升了输入效率。最新版的搜狗拼音输入法更是借助AI技术,让打字变得既准确又高效。而搜狗输入法的去广告精简优化版,通过移除广…...
YOLOv11改进 | YOLOv11引入MobileNetV4
前言: 主要是对该文章YOLOv11改进 | YOLOv11引入MobileNetV4进行复现,以及对一些问题进行解答 1、mobilenetv4核心代码 from typing import Optional import torch import torch.nn as nn import torch.nn.functional as F__all__ [MobileNetV4ConvLa…...
Java中的ArrayList方法
1. 创建 ArrayList 实例 你可以通过多种方式创建 ArrayList 实例: <JAVA> ArrayList<String> list new ArrayList<>(); // 创建一个空的 ArrayList ArrayList<String> list new ArrayList<>(10); // 创建容量为 10 的 ArrayList …...
wordpress 利用 All-in-One WP Migration全站转移
导出导入站点 在插件中查询 All-in-One WP Migration备份并导出全站数据 导入 注意事项: 1.导入部分限制50MB 宝塔解决方案,其他类似,修改php.ini配置文件即可 2. 全站转移需要修改域名 3. 大文件版本,大于1G的可以参考我的…...
零基础教程:Windows电脑安装Linux系统(双系统/虚拟机)全攻略
一、安装方式选择 方案对比表 特性双系统安装虚拟机安装性能原生硬件性能依赖宿主机资源分配磁盘空间需要独立分区(建议50GB)动态分配(默认20GB起)内存占用独占全部内存需手动分配(建议4GB)启动方式开机选…...
聚焦AI与大模型创新,紫光云如何引领云计算行业快速演进?
【全球云观察 | 科技热点关注】 随着近年来AI与大模型的兴起,云计算行业正在发生着一场大变局。 “在2025年春节期间,DeepSeek两周火爆全球,如何进行私域部署成了企业关心的问题。”紫光云公司总裁王燕平强调指出,AI与…...
mapreduce 过程中,maptask的partitioner是在map阶段中具体什么阶段分区的?
在MapReduce的Map阶段中,Partitioner(分区器)的作用发生在map函数输出键值对之后,但在数据被写入磁盘(spill到本地文件)之前。具体流程如下: 分区发生的具体阶段: Map函数处理完成 当…...
找到字符串中所以字母异位词 --- 滑动窗口
目录 一:题目 二:算法原理 三:代码实现 一:题目 题目链接:438. 找到字符串中所有字母异位词 - 力扣(LeetCode) 二:算法原理 三:代码实现 版本一:无co…...
密码破解工具
1. 引言 密码是信息安全的核心之一,而攻击者往往利用各种工具和技术来破解密码。密码破解工具可以分为 离线破解(Offline Cracking) 和 在线破解(Online Cracking) 两大类: 离线破解:攻击者已经获取了加密的密码哈希(hash),可以在本地进行破解,无需与目标系统交互。…...
路由策略在双点双向路由重发布的应用
一、背景叙述 路由重发布通常是解决两个不同路由协议之间的互通问题,也就是路由双向引入。有时候,单点路由重发布在大规模网络中压力较大,缺乏冗余性,于是就有了双点双向路由重发布 问题:但是双点双向路由重发布也会…...
在Python软件中集成智能体:以百度文心一言和阿里通义千问为例
摘要 本文旨在探讨如何在Python软件中集成智能体,具体以百度文心一言和阿里通义千问等大模型生成的智能体为例。文章详细介绍了集成这些智能体的方法,包括环境准备、API调用、代码实现等步骤,并提供了相关的示例代码。通过集成这些智能体&…...