青训营:简易分布式爬虫
一、项目介绍
该项目是一个简易分布式爬虫系统,以分布式思想为基础,通过多节点协作的方式,将大规模的网页抓取任务分解,从而高效、快速地获取网络数据 。
项目地址:https://github.com/yanchengsi/distributed_crawler
三、项目实现
3.1 技术选型与相关开发文档
一、场景分析
(一)要解决的问题
- 高效数据采集:需要从大量网页中快速、准确地抓取目标数据,满足数据需求方对数据及时性和完整性的要求。在面对海量网页时,传统单节点爬虫效率低下,难以在规定时间内完成数据采集任务。
- 分布式任务管理:实现多节点协作,合理分配爬虫任务,避免任务分配不均导致部分节点负载过高,而部分节点闲置的情况。同时,要确保任务的可靠分发与状态跟踪,保证每个任务都能得到妥善处理。
- 数据存储与管理:对采集到的大量数据进行有效的存储和管理,便于后续的数据处理、分析和查询。需要保证数据的安全性和完整性,防止数据丢失或损坏。
- 系统稳定性与扩展性:系统应具备高稳定性,能够长时间稳定运行,应对可能出现的网络波动、节点故障等问题。同时,随着业务规模的扩大,能够方便地进行扩展,增加爬虫节点或存储资源。
(二)前提假设
- 数据规模假设:预计在项目运行初期,每天需要采集的数据量约为10GB,随着业务的发展,数据量可能会以每月20%的速度增长。
- 硬件资源假设:假设每个爬虫节点服务器的配置为8核CPU、16GB内存、1TB硬盘,网络带宽为100Mbps。存储服务器配置为16核CPU、64GB内存、10TB硬盘,网络带宽为1Gbps。
- 网络环境假设:项目运行在稳定的企业内部网络环境中,网络延迟较低且波动较小。但可能会受到外部网络(如目标网站所在网络)不稳定因素的影响。
- 数据类型假设:采集的数据主要为文本数据,包含少量图片和视频数据,数据结构相对较为规范。
(三)资源预估
- 存储空间:根据数据规模假设,初期每天10GB的数据量,考虑到数据的存储冗余和备份需求,预计初期需要500GB的存储空间。随着数据量的增长,每月需增加约100GB的存储空间。
- 服务器数量:在项目初期,预计需要5台爬虫节点服务器和1台存储服务器。随着业务发展,根据数据量增长和任务负载情况,适时增加爬虫节点服务器和存储服务器数量。
二、技术选型
(一)编程语言
选择Python作为主要编程语言。Python具有丰富的第三方库,如用于网络请求的requests库、用于数据处理的pandas库、用于构建Web服务的Flask库等,能够大大提高开发效率。同时,Python语言简洁易读,便于团队成员之间的协作开发和代码维护。
(二)Web框架
采用Flask框架构建主节点的API服务。Flask是一个轻量级的Web框架,具有简单易用、灵活可扩展的特点。通过Flask可以快速搭建出用于任务分配和状态报告的API接口,满足分布式爬虫系统中主从节点之间的通信需求。
(三)消息队列
选择RabbitMQ作为消息队列。RabbitMQ是一个开源的、高性能的消息代理软件,支持多种消息协议,具有高可靠性、高扩展性和高可用性。在分布式爬虫系统中,使用RabbitMQ可以实现任务的异步分发和结果的异步收集,解耦爬虫任务的生产和消费过程,提高系统的整体性能和稳定性。
(四)数据存储
- 数据采集阶段:在数据采集过程中,对于临时存储采集到的数据,采用文件存储方式(如FileStorage将数据存储在data.json文件中)。这种方式简单直接,适用于数据量较小、对读写性能要求不是特别高的场景。
- 数据长期存储与管理:对于长期存储和管理大量数据,选用MongoDB数据库。MongoDB是一个面向文档的NoSQL数据库,具有灵活的数据模型、高扩展性和高读写性能。它能够很好地适应爬虫系统中数据结构多样、数据量快速增长的特点,方便进行数据的插入、查询和更新操作。
(五)辅助工具
- 代理池:使用自定义的ProxyPool工具。在爬虫过程中,为了避免被目标网站封禁IP,需要使用代理IP。ProxyPool可以实现代理IP的获取、验证和管理,为爬虫提供稳定可靠的代理IP资源。
- Robots协议检查器:利用RobotsChecker工具检查目标网站的Robots协议。遵守Robots协议是爬虫合法合规运行的基础,RobotsChecker能够根据目标网站的Robots协议规则,判断是否可以对特定页面进行爬取,避免违反网站规定。
三、相关开发文档
(一)技术文档
- 系统架构设计文档:详细描述分布式爬虫系统的整体架构,包括主节点、从节点、消息队列、数据存储等各个组件的功能和交互关系。通过架构图和文字说明,使开发人员对系统的整体框架有清晰的认识,便于进行后续的开发和维护工作。
- 模块设计文档:针对每个功能模块(如URLManager、DataCrawler、DataStorage等),编写详细的模块设计文档。文档内容包括模块的功能概述、输入输出接口、内部实现逻辑、关键算法和数据结构等。这有助于开发人员深入理解每个模块的功能,提高代码开发的准确性和效率。
- 数据库设计文档:如果使用数据库(如MongoDB)进行数据存储,需要编写数据库设计文档。文档中应包含数据库的架构设计、集合(表)结构设计、索引设计、数据存储策略等内容。这对于保证数据库的性能和数据的一致性非常重要。
(二)使用文档
- 安装部署文档:提供详细的项目安装和部署步骤,包括Python环境的搭建、依赖库的安装、项目代码的部署、消息队列和数据库的配置等。确保开发人员和运维人员能够按照文档顺利完成项目的部署工作。
- 使用指南:编写用户使用指南,介绍如何启动分布式爬虫系统,如何配置爬虫任务(如设置爬取的URL列表、爬取深度等参数),如何查看爬虫任务的运行状态和结果等。这有助于用户快速上手使用分布式爬虫系统。
(三)测试文档
- 测试计划文档:制定详细的测试计划,包括测试目标、测试范围、测试策略、测试资源安排、测试进度计划等内容。明确测试的重点和难点,合理安排测试资源和时间,确保测试工作的顺利进行。
- 测试用例文档:根据项目的功能需求和设计文档,编写详细的测试用例。测试用例应覆盖系统的各个功能模块和关键业务流程,包括功能测试、性能测试、兼容性测试等方面。通过执行测试用例,可以发现系统中存在的缺陷和问题,及时进行修复和优化。
3.2 架构设计
可以补充场景分析环节,明确要解决的问题和前提假设,比如预计0.5%的用户属于大V,粉丝很多,也会经常上传视频,当前架构的解决方案是xxx。 |
一、场景分析
(一)要解决的问题
- 高效大规模数据采集:互联网上海量的网页数据是本项目的采集目标,需快速、全面地获取。传统单节点爬虫面对大规模数据时效率极低,无法满足数据需求,且在采集过程中容易因网络波动、网站反爬机制等问题中断,导致数据采集不完整。
- 应对网站反爬策略:众多网站设置了多种反爬机制,如IP限制、User - Agent检测、验证码验证等。爬虫需具备应对这些反爬策略的能力,否则频繁被封IP或禁止访问,会严重影响数据采集工作。
- 分布式任务调度与协同:实现多节点的高效协作,合理分配爬虫任务。避免出现任务分配不均的情况,防止部分节点负载过高而部分闲置,同时要确保任务在节点间可靠分发与状态跟踪,保障任务顺利完成。
- 数据的有效存储与管理:采集到的大量数据需进行妥善存储和管理,方便后续处理、分析与查询。要保证数据的安全性和完整性,避免数据丢失或损坏,且在数据量不断增长的情况下,存储系统仍能高效运行。
- 系统的高稳定性与扩展性:系统需长时间稳定运行,能应对网络波动、节点故障等突发状况。随着业务发展,数据采集规模扩大,系统要便于扩展,可灵活增加爬虫节点或存储资源。
(二)前提假设
- 数据规模假设:预计初期每天需采集的数据量约为5GB,数据类型主要为网页文本、少量图片和链接信息。随着业务拓展,数据量将以每月15%的速度增长。
- 硬件资源假设:每个爬虫节点服务器配置为4核CPU、8GB内存、500GB硬盘,网络带宽为50Mbps。存储服务器配置为8核CPU、16GB内存、2TB硬盘,网络带宽为100Mbps。
- 网络环境假设:项目运行在相对稳定的网络环境中,但可能受外部网络(如目标网站所在网络)不稳定因素影响,存在一定网络延迟和丢包率。
- 网站反爬假设:假设约30%的目标网站存在一定程度的反爬机制,其中10%的网站反爬机制较为复杂,需要采用多种策略应对。
(三)当前架构解决方案
- 针对高效大规模数据采集:采用分布式爬虫架构,多节点并行工作,提高数据采集效率。通过URL管理器统一管理待爬取URL,合理分配任务到各个爬虫节点,实现高效的数据采集。
- 应对网站反爬策略:利用代理池获取大量代理IP,定期更换IP地址,规避IP限制。同时,在请求头中设置多样化的User - Agent,模拟不同的访问终端。对于验证码验证,考虑引入第三方验证码识别服务或开发智能识别算法。
- 分布式任务调度与协同:使用消息队列(如RabbitMQ)实现任务异步分发和结果异步收集。主节点将任务发送到消息队列,从节点从队列中获取任务并执行,完成后将结果返回。主节点通过消息队列监控任务状态,进行任务重试和调度优化。
- 数据的有效存储与管理:根据数据量和业务需求,初期采用文件存储(如FileStorage将数据存储在data.json文件中)进行临时存储,后期随着数据量增长,切换到数据库存储(如MongoDB或MySQL)。MongoDB适合处理海量、结构灵活的数据,MySQL适合对数据一致性和事务性要求较高的场景。利用数据库的索引、分区等技术,提高数据存储和查询性能。
- 系统的高稳定性与扩展性:在系统设计上,各个模块之间相对独立,通过接口进行交互。当某个节点出现故障时,其他节点可以继续工作,消息队列会暂存任务,待故障节点恢复后重新分配任务。如需扩展系统,只需增加爬虫节点服务器和存储服务器,调整相关配置即可。
二、架构设计
(一)整体架构概述
本分布式爬虫系统主要由主节点、从节点、URL管理器、消息队列、数据采集模块、数据解析模块、数据存储模块和辅助工具(代理池、Robots协议检查器)组成。各部分协同工作,实现数据的高效采集、处理和存储。
(二)模块设计
- 主节点:作为整个系统的核心控制单元,负责初始化任务队列,将种子URL添加到URL管理器中。通过Flask框架搭建API服务,提供任务分配接口(如/get_task)和任务状态报告接口(如/report_status)。接收从节点的任务状态报告,根据任务执行情况调整任务分配策略,确保任务的有效调度。
- 从节点:从消息队列中获取爬虫任务,调用数据采集模块、数据解析模块和数据存储模块完成任务。数据采集模块负责根据URL获取网页内容,数据解析模块对采集到的网页内容进行解析,提取有用信息,数据存储模块将解析后的数据保存到指定存储介质。从节点执行完任务后,将任务状态(成功或失败)通过消息队列或API报告给主节点。
- URL管理器(URLManager):使用Redis数据库存储URL。负责管理待爬取URL集合和已爬取URL集合。提供添加种子URL、获取待爬取URL、添加新发现URL、获取已访问URL等功能。利用Redis的集合数据结构,确保URL的唯一性和高效的添加、查询操作。
- 消息队列(如RabbitMQ):在主节点和从节点之间传递任务和任务结果。主节点将任务发送到任务队列(如crawler_tasks),从节点从任务队列中获取任务进行处理。从节点完成任务后,将结果发送到结果队列(如crawler_results),主节点从结果队列获取任务状态,实现任务的异步处理和解耦。
- 数据采集模块(DataCrawler):从URL管理器获取待爬取URL,根据配置决定是否使用代理IP访问目标网站。检查目标网站的Robots协议,确保合法爬取。获取网页内容后,传递给数据解析模块,并根据任务执行情况标记URL为已访问或失败。
- 数据解析模块(DataParser):对采集到的网页内容进行解析,提取页面标题、正文、元数据、图片链接、页面链接等信息。提供多种解析方法,适应不同类型网页的解析需求,确保解析结果的准确性和完整性。
- 数据存储模块(DataStorage):提供多种存储实现方式,如文件存储(FileStorage)、MongoDB存储(MongoDBStorage)和MySQL存储(MySQLStorage)。根据项目需求和数据特点选择合适的存储方式,负责将解析后的数据保存到相应存储介质中,并提供数据查询和管理功能。
- 辅助工具
- 代理池(ProxyPool):负责管理代理IP资源,提供获取代理IP的接口。定期检查代理IP的可用性,剔除无效代理IP,确保数据采集模块使用的代理IP有效,提高爬虫的抗反爬能力。
- Robots协议检查器(RobotsChecker):根据目标网站的Robots协议,检查是否允许爬取特定URL。获取Robots协议中规定的爬取延迟时间,控制爬虫的访问频率,遵守网站的访问规则,避免过度爬取。
(三)模块交互流程
- 主节点启动时,将种子URL添加到URL管理器中,并初始化消息队列。
- 从节点启动后,持续监听消息队列中的任务。当有任务时,从URL管理器获取待爬取URL。
- 数据采集模块使用代理IP(若配置启用),根据Robots协议检查结果访问目标网站,获取网页内容。
- 采集到的网页内容传递给数据解析模块,解析提取相关信息。
- 解析后的数据由数据存储模块保存到指定存储介质。
- 数据采集模块根据任务执行情况标记URL状态,并将任务结果(成功或失败)通过消息队列报告给主节点。
- 主节点根据任务结果调整任务分配策略,继续分配新任务,循环执行上述流程,直至完成所有任务。
3.3 项目代码介绍
- 主节点 API 代码(master_api.py):基于 Flask 框架构建。/get_task接口用于从URLManager获取待爬取 URL 并返回;/report_status接口接收爬虫任务状态报告,根据状态调用URLManager相应方法标记 URL 状态,日志记录状态报告信息。主程序启动 Flask 应用,监听0.0.0.0:5000。
- 消息队列操作代码(mq_operations.py):借助pika库与 RabbitMQ 交互。send_task_to_queue将 URL 任务发送到crawler_tasks队列;receive_task_from_queue从队列获取任务,实例化相关类执行爬取,根据结果调用send_result_to_queue将任务状态发送到crawler_results队列。
- 主程序代码(newMain.py):使用argparse处理命令行参数。main函数根据is_master参数区分主从节点逻辑,目前主从节点逻辑部分暂未实现。实例化多个爬虫相关类后调用data_crawler.crawl()执行爬虫操作。
四、测试结果
- 功能测试
- 测试用例
- 测试master_api.py中/get_task接口:准备一个有等待 URL 的URLManager实例场景,发起 GET 请求到/get_task,预期返回包含有效 URL 的 JSON 数据;再准备URLManager中无等待 URL 的场景,请求后预期返回{"task": null}。
- 测试master_api.py中/report_status接口:模拟向/report_status发送 POST 请求,请求体分别设置status为success和failed,同时携带一个已存在于URLManager中的 URL,查看URLManager中对应 URL 的状态是否按预期更新,并且检查日志是否正确记录状态报告信息。
- 测试mq_operations.py消息队列操作:使用消息队列客户端工具向crawler_tasks队列发送一个测试 URL 任务,观察receive_task_from_queue函数是否能正确获取任务并调用DataCrawler进行爬取,同时检查crawler_results队列是否收到正确的任务状态消息。
- 测试newMain.py主程序:分别使用--master参数和不使用该参数运行程序,检查是否能按预期进入主节点或从节点逻辑(尽管目前部分逻辑未实现,但可检查程序流程是否正确),并且观察DataCrawler的crawl方法是否能被正确调用。
- 测试结果分析:如果各接口和函数按照测试用例预期执行,如接口返回正确数据、状态更新无误、消息队列正常通信、主程序流程正确,那么功能测试通过。若出现如接口返回错误数据、状态未更新、消息丢失、程序崩溃等问题,则功能测试不通过,需根据错误提示和日志信息排查代码错误,如模块导入问题、函数逻辑错误、配置错误等。
- 性能测试
- 性能分析报告:在测试环境中模拟多任务并发场景,向crawler_tasks队列批量发送 URL 任务,使用性能测试工具(如 JMeter 等)监控系统性能。记录系统响应时间,包括从任务发送到receive_task_from_queue获取任务的时间、任务处理完成并返回结果的时间;统计系统吞吐量,即单位时间内处理的任务数量;监控服务器资源利用率,如 CPU、内存、网络带宽等。如果响应时间过长,可能是消息队列处理速度慢、DataCrawler处理任务效率低;吞吐量低可能是系统资源瓶颈、任务处理逻辑复杂导致;资源利用率过高则表明系统在当前配置下无法高效处理任务。
- 可优化点:若消息队列成为性能瓶颈,可考虑优化消息队列配置,如增加队列容量、优化消息存储方式,或更换更高效的消息队列系统。若DataCrawler处理任务慢,检查handle_crawl方法中网络请求、数据解析、存储操作等环节,优化代码逻辑,如使用异步请求提高网络请求效率、优化数据解析算法、采用更高效的存储方式(如数据库索引优化、批量存储等)。针对系统资源利用率高的问题,可进行硬件升级,如增加内存、更换高性能 CPU,或优化代码减少资源消耗,如合理释放不再使用的对象资源、优化算法减少计算量。
五、Demo 演示视频 (必填)
项目并没有完成很好,运行时总是bug不断,报错。明明有module,可还是运行不了。
[Screen Recording 2025-03-05 213351.mp4]
六、项目总结与反思
|
1.目前仍存在的问题
- 不清楚报错点为什么会报错,查找原因找不到。
- 主从节点逻辑部分尚未完全实现,从节点连接主节点获取任务以及主节点初始化任务队列的功能缺失,无法完成完整的分布式爬虫流程。
- 代码中部分关键功能的具体实现细节不明确,例如URLManager中管理 URL 的具体算法、DataCrawler中数据爬取和处理的逻辑不够清晰,可能影响功能的稳定性和扩展性。
- 项目中使用的消息队列(RabbitMQ)配置信息简单,仅设置了服务器 IP,可能无法满足高并发、大规模任务的需求,容易出现消息积压或处理延迟的情况。
- 未对数据存储方式进行性能优化,如FileStorage将数据存储在data.json文件中,随着数据量增加,文件读写效率可能降低,影响整体性能。
2.已识别出的优化项
(1)环境配置优化
- 编写环境配置脚本,自动检测并安装项目所需的 Python 模块,降低部署门槛,提高环境配置的准确性和效率。
- 使用虚拟环境工具(如venv或conda),将项目依赖环境进行隔离,避免不同项目间的依赖冲突,确保项目在不同环境下的可移植性。
(2)功能优化
- 完善主从节点逻辑,实现从节点向主节点获取任务的可靠通信机制,以及主节点对任务队列的有效管理和分配,确保分布式爬虫系统正常运行。
- 优化URLManager和DataCrawler的代码逻辑,提高代码的可读性和可维护性,例如采用更合理的数据结构存储 URL,优化数据爬取和处理的算法,提高功能的稳定性和扩展性。
(3)性能优化
- 优化消息队列配置,根据实际业务需求调整队列参数,如设置合适的队列容量、消息持久化策略等,提高消息处理的效率和可靠性。在高并发场景下,考虑使用分布式消息队列解决方案,提升系统的吞吐量和并发处理能力。
- 改进数据存储方式,将数据存储从简单的文件存储转换为数据库存储,如使用MongoDB或MySQL,利用数据库的索引、缓存等机制提高数据存储和查询的性能。同时,实现数据的批量存储和读取,减少 I/O 操作次数,提高整体性能。
3.架构演进的可能性
(1)引入微服务架构
将项目中的各个功能模块(如 URL 管理、数据爬取、数据存储等)拆分为独立的微服务,每个微服务可以独立开发、部署和扩展。通过微服务架构,可以提高系统的可维护性和可扩展性,便于团队成员分工协作,同时降低单个模块故障对整个系统的影响。
(2)采用分布式存储和计算框架
随着数据量和任务量的增加,现有的架构可能无法满足性能需求。可以考虑引入分布式存储框架(如HDFS)和分布式计算框架(如Spark),实现数据的分布式存储和并行计算,提高系统的处理能力和性能。
(3)集成自动化监控和运维系统
为了更好地管理和维护项目,可集成自动化监控和运维系统,如Prometheus和Grafana用于监控系统性能指标(如 CPU 使用率、内存使用率、消息队列积压情况等),Kubernetes用于自动化部署、扩展和管理容器化应用,提高系统的稳定性和可靠性。
4.项目过程中的反思与总结
(1)项目管理方面
- 在项目初期,对项目的整体规划和需求分析不够充分,导致项目开发过程中出现部分功能缺失、架构设计不完善等问题。在后续项目中,应加强项目前期的规划和需求调研,确保项目目标明确、架构合理。
- 团队成员之间的沟通协作不够紧密,在代码编写过程中可能存在对功能理解不一致、代码风格不统一等问题。今后应建立更加有效的沟通机制,定期进行团队交流和代码审查,确保项目开发的一致性和高效性。
(2)技术选型方面
- 在技术选型时,对部分技术的了解不够深入,如消息队列和数据存储技术,导致在项目实施过程中发现性能瓶颈。在未来的项目中,应加强对技术选型的评估和调研,充分考虑技术的适用性、性能、可扩展性等因素。
- 对项目的技术难度预估不足,导致项目开发进度受到影响。在后续项目中,应更加准确地评估技术难度,合理安排开发时间和资源,确保项目按时交付。
(3)代码编写方面
- 代码的注释和文档编写不够完善,部分代码逻辑难以理解,不利于项目的维护和扩展。在今后的开发中,应注重代码注释和文档编写,提高代码的可读性和可维护性。
- 代码的可测试性不足,缺乏单元测试和集成测试代码,难以保证代码质量和功能的正确性。在后续项目中,应建立完善的测试体系,在开发过程中及时进行测试,确保代码质量。
相关文章:
青训营:简易分布式爬虫
一、项目介绍 该项目是一个简易分布式爬虫系统,以分布式思想为基础,通过多节点协作的方式,将大规模的网页抓取任务分解,从而高效、快速地获取网络数据 。 项目地址:https://github.com/yanchengsi/distributed_crawle…...
Scala(Array,List,Set,Map,Tuple,字符串 使用的简单介绍)
目录 Array 不可变数组 ArrayBuffer可变数组 List 不可变列表 ListBuffer 可变列表 Set 集合(可变不可变) Map映射(可变不可变)(键值对) Tuple 元组 字符串 Array 不可变数组 // Array 数组// scala 中的数组下标是()// scala 中的数组是值…...
fmql之Linux WDT
正点原子第52章。 基础知识 正点原子教程 fmql-dts 代码 APP代码(不需要编写驱动代码) static int dw_wdt_drv_probe(struct platform_device *pdev) {struct device *dev &pdev->dev;struct watchdog_device *wdd;struct dw_wdt *dw_wdt; …...
IntelliJ IDEA集成MarsCode AI
IntelliJ IDEA集成MarsCode AI IDEA中安装插件 安装完毕之后登录自己的账号 点击链接,注册账号 https://www.marscode.cn/events/s/i5DRGqqo/ 可以选择不同的模型...
python-leetcode-打家劫舍 III
337. 打家劫舍 III - 力扣(LeetCode) 这个问题可以通过动态规划解决。可以通过递归的方式来解决每个房子的最大偷窃金额,递归过程中,我们会记录每个房子是否偷或不偷时能够获得的最大金额。 思路: 对于每个房子,我们有两种选择: 偷这个房子,那么它的直接相邻(父亲和孩…...
数据结构——队列
1. 概念与结构 队列(Queue)是一种先进先出(FIFO, First In First Out)的数据结构,即最先被插入队列的数据会最先被删除。队列广泛应用于计算机科学中,特别是在任务调度、缓冲区管理、网络数据传输等领域。…...
GaussianCity:实时生成城市级数字孪生基底的技术突破
在空间智能领域,如何高效、大规模地生成高质量的3D城市模型一直是一个重大挑战。传统方法如NeRF和3D高斯溅射技术(3D-GS)在效率和规模上存在显著瓶颈。GaussianCity通过创新性的技术方案,成功突破了这些限制,为城市级数字孪生的构建提供了全新路径。 一、核心创新:突破传…...
【AGI】智谱开源2025:一场AI技术民主化的革命正在到来
智谱开源2025:一场AI技术民主化的革命正在到来 引言:开源,一场技术平权的革命一、CogView4:中文AI生成的里程碑1. 破解汉字生成的“AI魔咒”2. 开源协议与生态赋能 二、AutoGLM:人机交互的范式跃迁1. 自然语言驱动的跨…...
【算法学习之路】5.贪心算法
贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳!3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完,形成一套完整的算法体系,以及大量的各个难度的题目,目前算法也写了几篇,题单正在更新…...
C++11中的右值引用和完美转发
C11中的右值引用和完美转发 右值引用 右值引用是 C11 引入的一种新的引用类型,用 && 表示。它主要用于区分左值和右值,并且可以实现移动语义,避免不必要的深拷贝,提高程序的性能。左值通常是可以取地址的表达式…...
Leetcode 1477. 找两个和为目标值且不重叠的子数组 前缀和+DP
原题链接: Leetcode 1477. 找两个和为目标值且不重叠的子数组 class Solution { public:int minSumOfLengths(vector<int>& arr, int target) {int narr.size();int sum0;int maxnINT_MAX;vector<int> dp(n,maxn);//dp[i]表示以索引i之前的满足要求…...
koa-session设置Cookie后获取不到
在谷歌浏览器中请求获取不到cookie问题之一(谷歌安全策略) 场景 前端使用 axios 请求,项目地址:http://192.168.8.1:5173 import axios from axiosconst request axios.create({baseURL: http://127.0.0.1:3001/,timeout: 60000,…...
Linux三种网络方式
前言 发现运维啥都得会,这周就遇到了网络问题自己无法解决,因此痛定思痛学一下。 参考文献 你管这破玩意叫网络? 桥接模式、NAT模式、仅主机模式,原来是这样工作的 交换机 构成局域网,实现所有设备之间的通信。 …...
android_viewtracker 原理
一、说明 我们业务中大部分场景是用 RecyclerView 实现的列表,而 View 的曝光通常是直接写在 adapter 的 onBindViewHolder 中,这样就会导致 item 还没显示出来的时候就会触发曝光。最近业务提出需要实现根据 View 显示在屏幕上面积大于 80% 才算曝光。…...
Object.defineProperty()
**Object.defineProperty()** 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。 plain const object1 {}; Object.defineProperty(object1, ‘property1’, { value: 42, writable: false }); object1.property1 77…...
大模型+知识图谱:重塑企业制度标准管理
在数字化转型的浪潮中,制度标准管理领域正迎来一场革命性的变革。借助大模型和知识图谱等前沿人工智能技术,制度标准管理不再仅仅是简单的文档存储和检索,而是演变为一个智能化、高效化、精准化的管理体系。 1.关键技术 我们的制度标准管理…...
ubuntu20系统下conda虚拟环境下安装文件存储位置
在 Conda 虚拟环境中执行 pip install 安装软件后,安装的文件会存储在该虚拟环境专属的 site-packages 目录中。具体路径取决于你激活的 Conda 环境路径。以下是定位步骤: 1. 确认 Conda 虚拟环境的安装路径 查看所有环境: conda info --env…...
深度学习编译器(整理某survey)
一、深度学习框架 TensorFlow PyTorch MXNet ONNX:定义了一个统一的表示,DL models的格式方便不同框架之间的转换模型 二、深度学习硬件 通用硬件(CPU、GPU):通过硬件和软件优化支持深度学习工作负载 GPU:通过多核架构实现高…...
Python学习第八天
查看函数参数 操作之前给大家讲一个小技巧:如何查看函数的参数(因为python的底层源码是C语言并且不是开放的,也一直困扰着刚学习的我,这个参数叫什么名之类的看doc又总是需要翻译挺麻烦的)。 比如我们下面要说到的op…...
SpringBoot为什么默认使用CGLIB?
大家好,我是锋哥。今天分享关于【SpringBoot为什么默认使用CGLIB?】面试题。希望对大家有帮助; SpringBoot为什么默认使用CGLIB? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot 默认使用 CGLIB(Code Generation Li…...
【消息队列】数据库的数据管理
1. 数据库的选择 对于当前实现消息队列这样的一个中间件来说,具体要使用哪个数据库,是需要稍作考虑的,如果直接使用 MySQL 数据库也是能实现正常的功能,但是 MySQL 也是一个客户端服务器程序,也就意味着如果想在其他服…...
pytest中pytest.ini文件的使用
pytest.ini 是 pytest 测试框架的配置文件,它允许你自定义 pytest 的行为。通过在 pytest.ini 中设置各种选项,可以改变测试用例的发现规则、输出格式、插件行为等。以下详细介绍 pytest.ini 文件的使用。 1. 文件位置 pytest.ini 文件通常位于项目的根目录下,pytest 在运…...
docker学习笔记(1)从安装docker到使用Portainer部署容器
docker学习笔记第一课 先交代背景 docker宿主机系统:阿里云ubuntu22.04 开发机系统:win11 docker镜像仓库:阿里云,此阿里云与宿主机系统没有关系,是阿里云提供的一个免费的docker仓库 代码托管平台:github&…...
Vue.js侦听器
侦听器 基本示例 计算属性允许我们声明性地计算衍生值。然而在有些情况下,我们需要在状态变化时执行一些“副作用”:例如更改 DOM,或是根据异步操作的结果去修改另一处的状态。 在组合式 API 中,我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数: …...
【C++学习篇】智能指针
目录 1. 智能指针的使用场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使用 4.shared_ptr和weak_ptr 4.1shared_ptr的循环引用问题 4.2 weak_ptr 1. 智能指针的使用场景分析 下⾯程序中我们可以看到,new了以后,我们也delete了,…...
数字电子技术基础(二十四)——TTL门电路的高、低电平的输出特性曲线
目录 1 TTL门电路的特性曲线 1.1 高电平输出特性 1.1.2 高电平输出特性的实验过程 1.1.2 TTL门电路的输出特性的实验结果 1.2 低电平的输出特性 1 TTL门电路的特性曲线 1.1 高电平输出特性 1.1.2 高电平输出特性的实验过程 现在想要测试TTL门电路的输出特性,…...
linux进程通信之共享内存
在 Linux 系统中,共享内存(Shared Memory) 是一种高效的进程间通信(IPC)方式,允许多个进程直接访问同一块物理内存区域。以下是关于 Linux 共享内存的详细讲解: 一、共享内存的核心特点 高速通信…...
学习第十一天-树
一、树的基础概念 1. 定义 树是一种非线性数据结构,由 n 个有限节点组成层次关系集合。特点: 有且仅有一个根节点其余节点分为若干互不相交的子树节点间通过父子关系连接 2. 关键术语 术语定义节点包含数据和子节点引用的单元根节点树的起始节点&#…...
场景题:10亿QQ用户,如何统计在线人数?
现在卷的环境下,面试除了八股文算法项目外,场景题也是问的越来越多了。一方面是就业市场竞争者较多所带来的必然结果;另一方面是公司对于应聘者的技术要求也越来越高了。 今天继续介绍Java面试常见的场景题:在线人数统计 现在用户…...
学习工具的一天之(burp)
第一呢一定是先下载 【Java环境】:Java Downloads | Oracle 下来是burp的下载 Download Burp Suite Community Edition - PortSwigger 【下载方法二】关注的一个博主 【BurpSuite 安装激活使用详细上手教程 web安全测试工具】https://www.bilibili.com/video/BV…...
归并排序:分治哲学的完美演绎与时空平衡的艺术
引言:跨越世纪的算法明珠 在计算机科学的璀璨星河中,归并排序犹如一颗恒久闪耀的明星。1945年,现代计算机之父冯诺伊曼在EDVAC计算机的研发过程中首次系统性地提出了这一算法,其精妙的分治思想不仅奠定了现代排序算法的理论基础&…...
蓝桥杯4T平台(串口打印电压值)
知识点:串口(单片机发送数据)按键ADC 题目 配置 代码 adc.c uint16_t getadc2(void) {uint16_t adc0;HAL_ADC_Start(&hadc2);adcHAL_ADC_GetValue(&hadc2);return adc; } adc.h uint16_t getadc2(void); main.c #include "lcd.h" #include…...
Stable Diffusion Prompt编写规范详解
Stable Diffusion Prompt编写规范详解 一、语法结构规范 (一)基础模板框架 [质量强化] [主体特征] [环境氛围] [风格控制] [镜头参数]质量强化:best quality, ultra detailed, 8k resolution主体特征:(1girl:1.3), long …...
es6常见知识点
官方文档:[https://es6.ruanyifeng.com/](https://es6.ruanyifeng.com/) 一、Class 1、Class Class只是一个语法糖,其功能用es5也能实现,但是比es5更符合类的期待 定义: constructor代表构造方法,而this指向new 生成的实例 定义类方法时,可以不使用function 注…...
leetcode1 两数之和 哈希表
什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。 242. 有效的字母异位词 (opens new window)这道题目是用数组作为哈希表来解决哈希问题,349. 两个数组的交集 (o…...
Java中lombok的@Data注解【布尔类型】字段定义方式
文章目录 背景第一步、场景复现第二步、分析问题第三步、实现方案总结 背景 在Data注解的bean中添加Boolean字段时,set方法正常,get方法无法获取。 第一步、场景复现 在OrderInfo的实体中,新增布尔类型的字段:支付过【hasPaid】…...
理解数学概念——稠密性(density)
目录 1. 定义 2. 等价定义 3. 直观理解 1. 定义 在拓扑学(topology)和数学相关领域中,对于一个拓扑空间 X 的一个子集 A,若 X的每一个点要么属于A ,要么无限“接近”X的某个成员,则称这个子集 A 是稠密的(dense)或称A具有稠密性…...
【Spring AOP】_切点类的切点表达式
目录 1. 根据方法签名匹配编写切点表达式 1.1 具体语法 1.2 通配符表达规范 2. 根据注解匹配编写切点表达式 2.1 实现步骤 2.2 元注解及其常用取值含义 2.3 使用自定义注解 2.3.1 编写自定义注解MyAspect 2.3.2 编写切面类MyAspectDemo 2.3.3 编写测试类及测试方法 在…...
通过多线程获取RV1126的AAC码流
目录 一RV1126多线程获取音频编码AAC码流的流程 1.1AI模块的初始化并使能 1.2AENC模块的初始化 1.3绑定AI模块和AENC模块 1.4多线程获取每一帧AAC码流 1.5每个AAC码流添加ADTSHeader头部 1.6写入具体每一帧AAC的…...
HDFS 为什么不适合处理小文件?
目录 一、HDFS 是什么? 1. 核心目标 2. 基本架构 二、HDFS 为什么不适合处理小文件? 1. 元数据管理问题 2. 存储效率低下 3. 访问性能问题 4. 计算框架效率问题 5. 其他限制 一、HDFS 是什么? HDFS(Hadoop 分布式文件系统…...
网络空间安全(14)编辑器漏洞
一、概述 网页在线编辑器允许用户在网页上进行文本的编辑,并设置字体样式、段落行间距等,类似于使用Word进行编辑。然而,由于编辑器在处理用户输入、文件上传、权限控制等方面可能存在安全缺陷,因此容易成为攻击者利用的目标。 二…...
SpringMvc与Struts2
一、Spring MVC 1.1 概述 Spring MVC 是 Spring 框架的一部分,是一个基于 MVC 设计模式的轻量级 Web 框架。它提供了灵活的配置和强大的扩展能力,适合构建复杂的 Web 应用程序。 1.2 特点 轻量级:与 Spring 框架无缝集成,依赖…...
Avalonia 打包成deb
参考 https://www.cnblogs.com/Fengyinyong/p/13346642.html 安装工具 dotnet tool install --global dotnet-deb 还原包 dotnet restore -r linux-x64 dotnet deb install 打包,其中/p:SelfContainedtrue是独立运行 dotnet msbuild XXXCore.csproj /t:Creat…...
服务器数据恢复—raid5阵列中硬盘掉线导致上层应用不可用的数据恢复案例
服务器数据恢复环境&故障: 某公司一台服务器,服务器上有一组由8块硬盘组建的raid5磁盘阵列。 磁盘阵列中2块硬盘的指示灯显示异常,其他硬盘指示灯显示正常。上层应用不可用。 服务器数据恢复过程: 1、将服务器中所有硬盘编号…...
除了合并接口,还有哪些优化 Flask API 的方法?
除了合并接口,还有许多其他方法可以优化 Flask API,以下从性能优化、代码结构优化、安全性优化、错误处理优化等方面详细介绍: 性能优化 1. 使用缓存 内存缓存:可以使用 Flask-Caching 扩展来实现内存缓存,减少对数…...
制服小程序的“滑手”:禁用页面左右滑动全攻略
哈哈,看来你已经很聪明地发现了小程序中左右滑动的“顽皮”行为!😄 没错,我们可以通过设置 disableScroll 属性来“管教”它,同时结合 CSS 样式让页面既禁得住横向“乱跑”,又能顺畅地上下滚动。你的方案已…...
学习日记-250305
阅读论文:Leveraging Pedagogical Theories to Understand Student Learning Process with Graph-based Reasonable Knowledge Tracing ps:代码逻辑最后一点还没理顺,明天继续 4.2 Knowledge Memory & Knowledge Tracing 代码研究: 一般…...
DeepSeek R1模型医疗机构本地化部署评估分析(Discuss V1版上)
为了确保医疗机构在部署和应用DeepSeek R1模型时的成功,可以根据各个步骤设计一套综合的评估和评测体系。该体系将帮助医疗机构在实施过程中持续跟踪效果、识别潜在问题并进行优化调整。以下是对各步骤的详细评估和评测体系设计。 1. 确定模型需求 在医疗机构上线DeepSeek R…...
java 查找连个 集合的交集部分数据
利用了Java 8的Stream API,代码简洁且效率高 import java.util.stream.Collectors; import java.util.List; import java.util.HashSet; import java.util.Set;public class ListIntersection {public static List<Long> findIntersection(List<Long> …...
Hadoop管理页看不到任务的问题
这个yarn分配任务了但是为空 在$HADOOP_HOME/conf/mapred-site.xml 原来的配置文件基础之上添加: <property><name>mapreduce.framework.name</name><value>yarn</value></property> 重启之后就好了...