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

Scrapy爬虫框架 Pipeline 数据传输管道

在网络数据采集领域,Scrapy 是一个非常强大的框架,而 Pipeline 是其中不可或缺的一部分。它允许我们在数据处理的最后阶段对抓取的数据进行进一步的处理,如清洗、存储等操作。

本教程将详细介绍如何在 Scrapy 中使用 Pipeline,帮助你理解和掌握如何配置、自定义以及管理和调试 Pipeline。通过本教程的学习,你将能够更加高效地处理和存储你抓取到的数据。

文章目录

  • Pipeline
  • 配置 Pipeline
  • 自定义 Pipeline
  • 管理和调试 Pipeline
  • 总结

Pipeline

Pipeline 是 Scrapy 框架中的一项核心功能,用于处理 Spider 抓取到的数据。在 Pipeline 中,你可以对数据进行清洗、验证,甚至将其存储到数据库中。Pipeline 通过一系列的处理方法,使得数据可以逐步传递和处理,最终输出符合要求的数据。

方法作用
init(self)可选的初始化方法,用于进行对象的初始化和参数设置。
process_item(self, item, spider)必须实现的方法,用于处理爬取的数据项。接收 item 和 spider 两个参数,返回一个处理后的 Item 对象。如果不需要处理数据项,可直接返回原始的 item 对象。
open_spider(self, spider)可选的方法,在爬虫被开启时被调用。接收一个参数 spider,可用于执行一些初始化操作或其他在爬虫启动时需要完成的任务。
close_spider(self, spider)可选的方法,在爬虫被关闭时被调用。接收一个参数 spider,可用于执行一些清理操作或其他在爬虫关闭时需要完成的任务。

是一个可选的初始化方法,用于在对象创建时进行初始化操作和参数设置。process_item(self, item, spider) 是这个类中必须实现的方法,它负责处理爬取到的数据项。这个方法接受两个参数:itemspider,并返回一个处理后的 Item 对象;如果无需处理数据,方法可以直接返回原始的 item。此外,还有两个可选的方法:open_spider(self, spider)close_spider(self, spider),分别在爬虫启动和关闭时调用。open_spider 用于在爬虫开始时执行一些初始化任务,而 close_spider 则在爬虫结束时执行清理操作或其他必要的收尾工作。

在 Scrapy 中,Pipeline 是一种数据传输管道,用于对 item 对象进行逐步处理。每一个 Pipeline 类都会有一系列方法,这些方法会被 Scrapy 调用以处理抓取到的 item。通常,一个 Scrapy 项目会有多个 Pipeline,item 会依次通过这些 Pipeline 进行处理。

基本操作

在 Scrapy 中,使用 Pipeline 的基本步骤包括:

定义 Pipeline 类

每个 Pipeline 都是一个 Python 类,并且至少需要实现一个 process_item 方法。这个方法接收两个参数:itemspider,分别表示要处理的数据和当前使用的 Spider。

下面展示了一个简单的 Pipeline 类。process_item 方法接收一个 item,对其进行处理后返回。这里的处理可以是数据清洗、格式转换等操作。

class MyPipeline:def process_item(self, item, spider):# 处理数据return item

激活 Pipeline

在 Scrapy 项目的 settings.py 文件中,需要激活你定义的 Pipeline。通过向 ITEM_PIPELINES 字典添加你的 Pipeline 类的路径和优先级来实现。这里,ITEM_PIPELINES 是一个字典,键为 Pipeline 类的路径,值为一个整数表示优先级。优先级数值越小,Pipeline 的优先级越高,越早执行。

ITEM_PIPELINES = {'myproject.pipelines.MyPipeline': 300,
}

应用示例

Pipeline 还可以实现更多的功能,比如过滤数据、保存数据到数据库、或是对数据进行异步处理。你可以定义多个 Pipeline,并通过设置不同的优先级来控制它们的执行顺序。例如,你可以先使用一个 Pipeline 对数据进行清洗,再使用另一个 Pipeline 将清洗后的数据保存到数据库中。

这里展示了两个 Pipeline 类:CleanDataPipelineSaveToDatabasePipelineCleanDataPipeline 用于清洗数据,将价格字符串转换为浮点数;SaveToDatabasePipeline 则将清洗后的数据保存到数据库中。

class CleanDataPipeline:def process_item(self, item, spider):# 对数据进行清洗item['price'] = float(item['price'].replace('$', ''))return itemclass SaveToDatabasePipeline:def process_item(self, item, spider):# 将数据保存到数据库self.db.save(item)return item

配置 Pipeline

在 Scrapy 中,配置 Pipeline 是数据处理过程中的重要环节,它决定了数据在抓取后如何被处理和存储。通过正确配置 Pipeline,你可以将抓取到的数据传递给多个 Pipeline 类,以实现对数据的清洗、验证、存储等功能。每个 Pipeline 类负责不同的数据处理任务,而通过设置优先级,Scrapy 可以按顺序依次执行这些任务,确保数据按照预期的方式处理。

Pipeline 的配置类似于管理多个任务,每个任务都有不同的优先级。通过指定优先级,Scrapy 可以先执行重要的任务,再执行次要的任务,确保数据处理的正确性和效率。

步骤说明
创建 Pipeline 类编写自定义 Pipeline 类,用于处理、清洗或存储抓取到的数据。
注册 Pipeline在 Scrapy 项目的 settings.py 文件中,将自定义的 Pipeline 类注册到 ITEM_PIPELINES 配置项中。
设置 Pipeline 优先级通过为 ITEM_PIPELINES 配置项中的每个 Pipeline 设置一个整数优先级,数字越小,优先级越高。
控制多个 Pipeline 的执行顺序根据业务逻辑和需求,调整各个 Pipeline 的优先级,以控制数据处理的顺序。例如,清洗数据的 Pipeline 通常需要在存储数据的 Pipeline 之前执行。

配置 Pipeline 是确保数据处理顺畅且符合预期的关键步骤,通过合理的优先级设置,你可以灵活调整数据处理的流程和顺序。

基本操作

要配置 Pipeline,你需要在 Scrapy 项目的 settings.py 文件中进行相关设置。

激活 Pipeline

settings.py 文件中,将 Pipeline 类添加到 ITEM_PIPELINES 字典中,并为其分配一个优先级。CleanDataPipeline 的优先级为 300,而 SaveToDatabasePipeline 的优先级为 800。这意味着 CleanDataPipeline 会在 SaveToDatabasePipeline 之前执行。优先级值越小,Pipeline 执行得越早。

ITEM_PIPELINES = {'myproject.pipelines.CleanDataPipeline': 300,'myproject.pipelines.SaveToDatabasePipeline': 800,
}

配置参数

有些 Pipeline 可能需要在 settings.py 文件中配置一些参数。例如,如果你有一个 Pipeline 需要连接数据库,你可能需要在 settings.py 中提供数据库连接的配置信息。定义了一个数据库连接的 URI 和一个表名,这些参数将被用于 SaveToDatabasePipeline 中,以确保数据能够正确存储到数据库中。

DATABASE_URI = 'sqlite:///mydatabase.db'
DATABASE_TABLE = 'items'

应用示例

在实际应用中,你可能会遇到需要配置多个 Pipeline 的情况。除了设置优先级之外,你还可以根据条件选择性地启用或禁用某些 Pipeline。例如,你可能只希望在生产环境中启用某些 Pipeline,而在开发环境中禁用它们。你可以通过使用条件语句或环境变量来实现这一点。

环境变量 SCRAPY_ENV 的值来决定启用哪些 Pipeline。如果环境是生产环境 (production),则会启用所有的 Pipeline;否则,只启用 CleanDataPipeline

import osif os.environ.get('SCRAPY_ENV') == 'production':ITEM_PIPELINES = {'myproject.pipelines.CleanDataPipeline': 300,'myproject.pipelines.SaveToDatabasePipeline': 800,}
else:ITEM_PIPELINES = {'myproject.pipelines.CleanDataPipeline': 300,}

自定义 Pipeline

自定义 Pipeline 是 Scrapy 中用于处理抓取数据的关键模块。虽然 Scrapy 提供了一些内置的 Pipeline 功能,但为了满足特定业务需求,开发者通常会根据项目需求创建自定义 Pipeline。通过自定义 Pipeline,你可以处理抓取到的数据,例如进行数据清洗、过滤、存储或者执行其他复杂操作。

就像在厨房中根据自己的口味调整食谱一样,自定义 Pipeline 使你能够灵活地控制数据处理流程。它是一个处理 item 对象的 Python 类,通过实现特定的方法,开发者可以定义数据处理的逻辑,从而保证抓取到的数据满足预期的标准。

步骤说明
创建 Pipeline 类编写一个继承自 objectBaseItem 的类,作为自定义 Pipeline。
实现 process_item 方法process_item(self, item, spider) 方法中,编写自定义的处理逻辑。
调整处理流程根据需求,在方法中执行数据清洗、过滤、存储等操作,返回处理后的 item
设置 Pipeline 顺序在 Scrapy 的 settings.py 文件中,定义 Pipelines 的优先级。
激活 Pipelinesettings.py 中启用自定义 Pipeline,以使其参与到数据处理流程中。

自定义 Pipeline 赋予了开发者极大的灵活性,使其可以针对不同项目需求来调整数据的处理步骤,确保每个数据都能按照特定规则进行处理与存储。

基本操作

创建自定义 Pipeline 类

在 Scrapy 项目的 pipelines.py 文件中定义一个新的 Pipeline 类,并实现 process_item 方法。

这里定义了一个名为 CustomPipeline 的类。process_item 方法根据 itemprice 字段判断物品是否昂贵,并在 item 中添加一个新的字段 expensive。这个字段可以用于后续的处理或存储。

class CustomPipeline:def process_item(self, item, spider):# 自定义的数据处理逻辑if item['price'] > 100:item['expensive'] = Trueelse:item['expensive'] = Falsereturn item

实现其他辅助方法(可选)

你可以选择实现 open_spiderclose_spider 方法,用于在 Spider 启动和结束时执行一些初始化或清理工作。open_spider 方法在 Spider 启动时打开一个文件,close_spider 方法在 Spider 结束时关闭文件。而 process_item 方法则将每个 item 转换为 JSON 格式并写入文件。

class CustomPipeline:def open_spider(self, spider):self.file = open('items.jl', 'w')def close_spider(self, spider):self.file.close()def process_item(self, item, spider):line = json.dumps(dict(item)) + "\n"self.file.write(line)return item

settings.py 中激活自定义 Pipeline 和之前提到的激活 Pipeline 一样,你需要在 settings.py 文件中将自定义 Pipeline 注册到 ITEM_PIPELINES 中。将 CustomPipeline 添加到 ITEM_PIPELINES 中,并设置其优先级为 500,表示它将在其他 Pipeline 之后或之前运行,具体取决于其他 Pipeline 的优先级设置。

ITEM_PIPELINES = {'myproject.pipelines.CustomPipeline': 500,
}

应用示例

自定义 Pipeline 的功能可以进一步扩展。比如,你可以通过配置 Scrapy 设置来控制自定义 Pipeline 的行为,或者将不同的自定义 Pipeline 组合在一起,以实现复杂的数据处理流程。

这个 ConditionalPipeline 根据当前 Spider 的名称对 item 进行不同的处理。如果 Spider 的名称是 special_spider,那么 item 中的 special 字段将被设置为 True

class ConditionalPipeline:def process_item(self, item, spider):# 根据条件进行不同的处理if spider.name == 'special_spider':item['special'] = Trueelse:item['special'] = Falsereturn item

管理和调试 Pipeline

管理和调试 Pipeline 是 Scrapy 项目中的关键步骤,确保数据处理流程能够高效且准确地运行。通过设置不同的 Pipeline 优先级,开发者可以灵活控制数据处理的顺序,保证各个环节的协调。此外,调试 Pipeline 则帮助发现并解决数据处理过程中出现的各种问题,确保抓取的数据能够按照预期的方式被处理和存储。就像生产线中的每一个环节都需要合理配置与监控,Pipeline 的管理和调试直接影响到最终数据处理的效果。

操作说明
设置 Pipeline 优先级在项目的 settings.py 中,通过配置 ITEM_PIPELINES 字典来设置不同 Pipeline 的执行顺序。
启用或禁用特定 Pipeline通过调整 ITEM_PIPELINES 中 Pipeline 类的启用状态,控制其在不同环境中的使用。
调试 Pipeline使用 Scrapy 提供的日志工具 logger 来捕捉 Pipeline 中的异常或错误信息,以便及时修复。
修改 Pipeline 行为在运行时动态调整 Pipeline 的处理逻辑,适应不同的数据处理需求。
监控数据处理效率通过分析 Pipeline 处理数据的时间和性能指标,优化数据处理流程。

基本操作

调整 Pipeline 的优先级

在 Scrapy 中,通过 settings.py 文件中的 ITEM_PIPELINES 配置,调整 Pipeline 的优先级。优先级越高的 Pipeline 越早执行。通过调整优先级,可以灵活地控制数据处理的顺序,确保重要的处理步骤优先完成。在这个示例中,CleanDataPipelineValidateDataPipeline 将分别在 SaveToDatabasePipeline 之前运行,确保数据在存储到数据库之前已经被清洗和验证。

ITEM_PIPELINES = {'myproject.pipelines.CleanDataPipeline': 300,'myproject.pipelines.ValidateDataPipeline': 400,'myproject.pipelines.SaveToDatabasePipeline': 800,
}

在不同环境中管理 Pipeline

你可以根据项目的不同阶段(如开发、测试、生产),动态地管理和调整 Pipeline 的配置。例如,你可以在开发环境中禁用某些性能开销较大的 Pipeline,只在生产环境中启用它们。这个配置根据环境变量 SCRAPY_ENV 的值决定启用哪些 Pipeline。在生产环境中,SaveToDatabasePipeline 会被激活,而在开发环境中,它将被禁用,从而节省资源并加快开发速度。

import osif os.environ.get('SCRAPY_ENV') == 'production':ITEM_PIPELINES = {'myproject.pipelines.CleanDataPipeline': 300,'myproject.pipelines.SaveToDatabasePipeline': 800,}
else:ITEM_PIPELINES = {'myproject.pipelines.CleanDataPipeline': 300,}

记录日志与调试

在 Pipeline 中,使用 Python 的 logging 模块记录调试信息是非常有效的调试手段。通过在 process_item 方法中添加日志记录,你可以实时监控数据处理的过程,并在出现异常时快速定位问题。这个 CustomPipeline 中的 process_item 方法包含了对 item 的验证逻辑和日志记录。如果 item 缺少 price 字段,它将被丢弃,并且会在日志中记录一条警告信息。如果处理成功,日志中会记录 item 已被处理的信息。

import loggingclass CustomPipeline:def process_item(self, item, spider):try:# 假设某个字段是必须的if 'price' not in item:raise DropItem(f"Missing price in {item}")item['processed'] = Truelogging.info(f"Processed item: {item}")return itemexcept DropItem as e:logging.warning(f"Item dropped: {e}")return None

应用示例

在实际项目中,你可能需要对 Pipeline 进行更复杂的管理和调试。例如,使用 Scrapy 的 signals 机制,你可以在特定的事件(如 Spider 开始或结束时)触发自定义的处理逻辑。另外,对于涉及多步骤处理的复杂 Pipeline,你可以通过设置断点或使用调试器(如 pdb)来逐步检查数据的处理流程。

这个 SignalPipeline 通过 Scrapy 的 signals 机制,在 Spider 开始时记录日志信息。这种方式可以帮助你在项目启动阶段捕获和处理特殊事件。

from scrapy import signalsclass SignalPipeline:@classmethoddef from_crawler(cls, crawler):pipeline = cls()crawler.signals.connect(pipeline.spider_opened, signal=signals.spider_opened)return pipelinedef spider_opened(self, spider):logging.info(f"Spider {spider.name} opened: ready to process items")def process_item(self, item, spider):# 正常的处理流程return item

总结

通过本教程的学习,你已经掌握了如何在 Scrapy 中使用 Pipeline 处理和管理抓取到的数据。我们从 Pipeline 的基本概念开始,逐步深入探讨了如何配置、自定义 Pipeline 以及如何有效地管理和调试它们。

这些知识和技能将使你能够更加高效和准确地处理从网络中抓取到的数据,并使你的 Scrapy 项目更加健壮和灵活。通过合理地使用和配置 Pipeline,你不仅能够确保数据质量,还能提高数据处理的自动化程度,从而节省宝贵的时间和资源。

相关文章:

Scrapy爬虫框架 Pipeline 数据传输管道

在网络数据采集领域,Scrapy 是一个非常强大的框架,而 Pipeline 是其中不可或缺的一部分。它允许我们在数据处理的最后阶段对抓取的数据进行进一步的处理,如清洗、存储等操作。 本教程将详细介绍如何在 Scrapy 中使用 Pipeline,帮…...

vim的 配置文件

vim 的配置文件名是vimrc,共有两个,一个是公共的、所有用户的vimrc,一个是私有的、个人的.vimrc。个人的配置文件是隐藏的,不进行配置的话一般是没有这个文件的,需要自己创建.vimrc 公共配置文件位于 :/etc/vim/vimrc…...

Golang | Leetcode Golang题解之第403题青蛙过河

题目&#xff1a; 题解&#xff1a; func canCross(stones []int) bool {n : len(stones)dp : make([][]bool, n)for i : range dp {dp[i] make([]bool, n)}dp[0][0] truefor i : 1; i < n; i {if stones[i]-stones[i-1] > i {return false}}for i : 1; i < n; i {…...

前端项目使用js将dom生成图片、PDF

在进行下方操作前&#xff0c;请你先安装 html2canvas 和 jspdf 包。 1、使用html2canvas将dom元素生成图片 // 获取要转换的dom const ele document.getElementById("dom"); // 生成canvas对象 let canvas await html2canvas(ele); 2、生成PDF对象&#xff0c;将…...

在 Red Hat 上安装 SQL Server 2022 并创建数据库

适用于&#xff1a; SQL Server - Linux 本快速入门介绍如何在 Red Hat Enterprise Linux (RHEL) 8.x 或 9.x 上安装 SQL Server 2022 (16.x)。然后可以使用 sqlcmd 进行连接&#xff0c;创建第一个数据库并运行查询。 注意&#xff1a;本教程需要用户输入和 Internet 连接。 …...

游戏如何应对云手机刷量问题

云手机的实现原理是依托公有云和 ARM 虚拟化技术&#xff0c;为用户在云端提供一个安卓实例&#xff0c;用户可以将手机上的应用上传至云端&#xff0c;再通过视频流的方式&#xff0c;远程实时控制云手机。 市面上常见的几款云手机 原本需要手机提供的计算、存储等能力都改由…...

QTableView使用QSortFilterProxyModel后行号错乱

在Qt中&#xff0c;当你使用QSortFilterProxyModel对QTableView进行排序或过滤后&#xff0c;点击事件可能会返回一个不正确的行号&#xff0c;因为代理模型可能会改变数据的显示顺序。为了获取点击数据的真实行号和内容&#xff0c;你可以使用mapToSource()函数&#xff0c;它…...

【Python】 报错Can‘t find model ‘en_core_web_md‘

出现这种错误表明Python环境中找不到名为en_core_web_md的模型。这通常发生在使用spaCy库进行自然语言处理时&#xff0c;因为spaCy依赖于预先训练好的模型来进行词性标注、依赖分析、命名实体识别等任务。如果没有安装该模型&#xff0c;尝试加载它时会导致错误。 解决办法&a…...

每天五分钟深度学习框架pytorch:pytorch中已经定义好的损失函数

本文重点 前面我们学习了pytorch中两种模式的损失函数,一种是nn,另外一种是functional,本文将讲解pytorch中已经封装好的损失函数。其实nn的方式就是类,而functional的方式就是方法。nn中使用的也是functional。 损失函数中的参数 无论是nn还是functional,大多数的损失函…...

dedecms(四种webshell姿势)、aspcms webshell漏洞复现

一、aspcms webshell 1、登陆后台&#xff0c;在扩展功能的幻灯片设置模块&#xff0c;点击保存进行抓包查看 2、在slideTextStatus写入asp一句话木马 1%25><%25Eval(Request(chr(65)))%25><%25 密码是a&#xff0c;放行&#xff0c;修改成功 3、使用菜刀工具连…...

【STM32系统】基于STM32设计的智能垃圾桶(语音、颜色识别、称重、光强、烟雾、人体识别、步进电机、水泵)——文末资料下载

基于STM32设计的智能垃圾桶 演示视频: 基于STM32设计的智能垃圾桶 功能简介: 四个按键可分别打开四个垃圾桶(可回收垃圾、厨余垃圾、有害垃圾、其他垃圾) oled显示屏显示四个垃圾桶的打开/关闭状态、烟雾浓度、光照强度、称重的重量和识别到的颜色(白色、红色、绿色、蓝…...

GPT代码记录

#include <iostream>// 基类模板 template<typename T> class Base { public:void func() {std::cout << "Base function" << std::endl;} };// 特化的子类 template<typename T> class Derived : public Base<T> { public:void…...

powerbi

一. CALCULATE 和 FILTER FILTER 返回的数据必须是表&#xff0c; 所以 可以 用在 新建表中&#xff0c; 不能直接用在度量值中其实 filter 相当于 用 外表字段 去进行筛选 不使用 filter&#xff0c; 只能使用本表字段 进行筛选&#xff0c;如下1&#xff0c; 只能使用 门店信…...

【Unity】检测鼠标点击位置是否有2D对象

在这里提供两种方案&#xff0c;一种是射线检测&#xff0c;另一种是非射线检测。 初始准备步骤&#xff1a; 创建2D对象&#xff08;比如2D精灵&#xff09;给要被检测的2D对象添加2D碰撞体&#xff08;必须是2D碰撞体&#xff09;创建一个空对象&#xff0c;再创建一个检测…...

Python学习——【2.1】if语句相关语法

文章目录 【2.1】if语句相关一、布尔类型和比较运算符&#xff08;一&#xff09;布尔类型&#xff08;二&#xff09;比较运算符 二、if语句的基本格式※、练习 三、if-else组合判断语句※、练习 四、if-elif-else多条件判断语句※、练习 五、判断语句的嵌套※、实战案例 【2.…...

机器学习--K-Means

K均值聚类 算法过程 K − m e a n s K-means K−means 是 聚类 c l u s t e r i n g clustering clustering 算法的一种&#xff0c;就是给你一坨东西&#xff0c;让你给他们分类&#xff1a; 我们的 K − m e a n s K-means K−means 大概是这样一个流程&#xff1a; 第一…...

模型训练时CPU和GPU大幅度波动——可能是数据的读入拖后腿

模型训练时CPU和GPU大幅度波动——可能是数据的加载拖后腿 问题 在进行猫狗大战分类任务时&#xff0c;发现模型训练时CPU和GPU大幅度波动&#xff0c;且模型训练速度很慢。 原因 ​ 初步分析可能是数据加载&#xff08;包括数据的transform&#xff0c;我用了Resize&#…...

keep-alive的应用场景

...

【C++ Primer Plus习题】16.9

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <ctime> #include <v…...

Java入门:09.Java中三大特性(封装、继承、多态)02

2 继承 需要两个类才能实现继承的效果。 比如&#xff1a;类A 继承 类B A类 称为 子类 &#xff0c; 衍生类&#xff0c;派生类 B类 称为 父类&#xff0c;基类&#xff0c;超类 继承的作用 子类自动的拥有父类的所有属性和方法 &#xff08;父类编写&#xff0c;子类不需要…...

C语言内存管理常见错误与防御性编程技巧

1. 指针未初始化引发的段错误1.1 结构体成员指针未初始化在C语言中&#xff0c;结构体内部的指针成员并不会自动分配内存。很多初学者会犯这样的错误&#xff1a;struct student {char *name;int score; }stu;int main() {strcpy(stu.name, "Jimy");stu.score 99;re…...

GZCTF动态Flag题目从开发到上架全流程:以Python Flask镜像为例

GZCTF动态Flag题目开发与部署实战指南&#xff1a;Python Flask全流程解析 在CTF竞赛生态中&#xff0c;动态Flag机制已成为现代赛题设计的黄金标准。不同于传统静态Flag容易被暴力破解或直接泄露&#xff0c;动态Flag为每个参赛队伍生成唯一标识&#xff0c;大幅提升题目安全性…...

从GD32F103到F407升级指南:除了以太网和摄像头,这些‘隐性’升级点更值得关注

GD32F103到F407升级实战&#xff1a;揭秘那些数据手册没告诉你的关键差异 当项目需求从简单的控制逻辑升级到需要处理以太网通信、图像采集或复杂算法时&#xff0c;许多工程师会自然地将目光投向GD32F407系列。表面上看&#xff0c;F407相比F103最直观的变化是主频从108MHz提升…...

嵌入式OTA升级技术详解与实现方案

1. 嵌入式OTA升级技术概述OTA&#xff08;Over-the-Air Technology&#xff09;技术在现代嵌入式系统中扮演着至关重要的角色。作为一名嵌入式开发工程师&#xff0c;我在多个物联网项目中都深度参与了OTA功能的实现与优化。简单来说&#xff0c;OTA升级就是通过无线通信方式&a…...

小型团队应用:3人使用OpenClaw+SecGPT-14B协作安全审计

小型团队应用&#xff1a;3人使用OpenClawSecGPT-14B协作安全审计 1. 为什么我们需要协作式安全审计工具 去年我们团队接手了一个金融系统的安全审计项目&#xff0c;三个人需要在一周内完成代码审计、漏洞扫描和报告撰写。最初我们尝试用传统方式&#xff1a;各自用本地工具…...

Java 25 虚拟线程新特性与实践:构建更高效的并发系统

Java 25 虚拟线程新特性与实践&#xff1a;构建更高效的并发系统 别叫我大神&#xff0c;叫我 Alex 就好。 一、引言 大家好&#xff0c;我是 Alex。Java 虚拟线程&#xff08;Virtual Threads&#xff09;自 Java 21 引入以来&#xff0c;已经成为 Java 并发编程的重要变革。…...

SSD‑LM【202210】:用于文本生成与模块化控制的半自回归单纯形扩散语言模型

SSD‑LM:用于文本生成与模块化控制的半自回归单纯形扩散语言模型 Xiaochuang Han♠ Sachin Kumar♣ Yulia Tsvetkov♠ ♠Paul G. Allen 计算机科学与工程学院,华盛顿大学 ♣语言技术研究所,卡内基梅隆大学 {xhan77, yuliats}@cs.washington.edu♠ sachink@cs.cmu.edu♣…...

【数字信号检测】基于迫零算法大规模MIMO低复杂度信号检测附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f447; 关注我领取海量matlab电子书和数学建模资料&#x1f34a;个人信条&#xff1a;格物致知,完整Matl…...

如何快速提升Windows性能:Win11Debloat一键优化指南

如何快速提升Windows性能&#xff1a;Win11Debloat一键优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and cust…...

【VBA】【EXCEL】分类汇总

option explicit option base 1Sub 分类汇总()Dim ws0 As Worksheet, ws1 As WorksheetDim arr0 As Variant, arr1 As VariantDim lastRow As Long, i As Long, m As Long, cnt As LongDim acct As String, opp As String, key As String, pts() As StringDim amt As Double, t…...