Python爬虫系列教程之第十三篇:构建高可用爬虫系统 —— 混合架构与自动化监控
大家好,欢迎继续关注本系列爬虫教程!随着爬虫项目规模的不断扩大和业务需求的提升,单一技术方案往往难以满足实际应用中对高可用性、稳定性和自动化监控的要求。如何构建一个既能应对多种反爬策略,又能在异常情况下自动恢复、实时监控运行状态的高可用爬虫系统,成为每个爬虫工程师必须面对的问题。
在本篇博客中,我们将从以下几个方面详细讲解如何构建高可用爬虫系统:
- 系统架构设计:规划整体模块划分和技术组合
- 混合爬虫技术整合:如何将 Scrapy、Selenium、异步请求等技术有机结合
- 性能优化与资源管理:如何提升爬虫抓取效率并降低资源消耗
- 自动化监控与报警:利用日志、定时任务和报警机制实时掌握爬虫状态
- 容错与自动重启机制:保证在异常情况下系统能够自动恢复
接下来,我们将逐步展开讲解。
1. 系统架构设计
构建一个高可用爬虫系统,需要合理设计各个模块,使各部分功能清晰、职责明确。通常,一个高可用爬虫系统可以划分为以下模块:
- 任务调度模块:管理 URL 队列、任务分发和节点协调(如使用 Redis、RabbitMQ 等实现分布式队列)。
- 数据采集模块:根据目标页面特点,采用不同的抓取方式。对于静态页面可用 Scrapy/requests,对于动态页面可使用 Selenium 或 Puppeteer。
- 数据解析与存储模块:对抓取到的原始数据进行解析、清洗,并存储到数据库或文件中(如 MySQL、MongoDB、Elasticsearch)。
- 日志与异常监控模块:实时记录爬虫运行日志,捕获异常信息,便于问题排查和系统维护。
- 自动化监控与报警模块:利用监控脚本或第三方工具,定时检测爬虫健康状态,当出现异常时通过邮件、短信或微信等方式报警。
- 容错与重启模块:通过 Supervisor、systemd、Docker 等工具实现进程监控,确保爬虫在异常退出后能够自动重启,保证任务不中断。
这样的模块划分不仅使系统结构清晰,还便于后续的扩展和维护。
2. 混合爬虫技术整合
实际应用中,目标网站可能会有不同的页面类型和反爬策略。一个高可用的爬虫系统往往需要根据不同情况选择合适的抓取方式。下面提供一个混合爬虫的示例,展示如何根据 URL 特征选择使用传统 requests 异步请求或 Selenium 模拟浏览器抓取动态内容。
2.1 混合爬虫示例代码
下面代码展示了一个简单的混合爬虫框架:
- 对于静态页面,采用
aiohttp
异步请求加速抓取; - 对于需要动态渲染的页面,调用 Selenium 方法进行抓取;
整个爬虫在每个请求中都集成了异常处理与日志记录。
import asyncio
import aiohttp
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import logging
import time# ---------------------------
# 日志配置:所有运行信息写入hybrid_crawler.log文件
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s',filename='hybrid_crawler.log',filemode='a'
)# ---------------------------
# Selenium配置:用于处理动态页面
def init_selenium():chrome_options = Options()chrome_options.add_argument("--headless") # 无头模式,不弹出浏览器窗口chrome_options.add_argument("--disable-gpu") # 禁用GPU加速chrome_options.add_argument("--no-sandbox") # 解决权限问题driver = webdriver.Chrome(executable_path="path/to/chromedriver", options=chrome_options)return driverdef fetch_dynamic_page(url, driver):"""使用Selenium抓取动态页面:param url: 目标网页URL:param driver: Selenium WebDriver对象:return: 页面HTML内容"""try:driver.get(url)# 根据页面复杂程度,等待足够时间time.sleep(3)html = driver.page_sourcelogging.info(f"Selenium 成功抓取动态页面: {url}")return htmlexcept Exception as e:logging.error(f"Selenium 抓取失败: {url} - {e}")return None# ---------------------------
# 异步请求:用于处理静态页面
async def fetch_static_page(url, session):"""使用aiohttp异步请求获取页面内容:param url: 目标网页URL:param session: aiohttp ClientSession对象:return: 页面HTML内容或None"""headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"}try:async with session.get(url, headers=headers, timeout=10) as response:response.raise_for_status()html = await response.text()logging.info(f"aiohttp 成功抓取静态页面: {url}")return htmlexcept Exception as e:logging.error(f"aiohttp 抓取失败: {url} - {e}")return None# ---------------------------
# 根据URL判断采用哪种抓取方式
async def fetch_page(url, driver, session):"""根据URL特征判断采用动态或静态抓取方式:param url: 目标网页URL:param driver: Selenium WebDriver对象,用于动态抓取:param session: aiohttp ClientSession对象,用于静态抓取:return: 页面HTML内容或None"""# 假设包含"dynamic"的URL需要动态渲染,否则使用静态请求if "dynamic" in url:logging.info(f"使用Selenium抓取: {url}")return fetch_dynamic_page(url, driver)else:logging.info(f"使用aiohttp抓取: {url}")return await fetch_static_page(url, session)# ---------------------------
# 主函数:整合混合爬虫逻辑
async def main():# 示例URL列表:部分为静态页面,部分为动态页面(模拟)urls = ["https://www.example.com/static/page1","https://www.example.com/static/page2","https://www.example.com/dynamic/page1", # 模拟需要动态渲染的页面"https://www.example.com/static/page3","https://www.example.com/dynamic/page2"]# 初始化Selenium WebDriver,用于动态页面抓取driver = init_selenium()# 创建aiohttp ClientSession,用于异步静态页面抓取async with aiohttp.ClientSession() as session:tasks = [fetch_page(url, driver, session) for url in urls]pages = await asyncio.gather(*tasks)# 关闭Selenium浏览器driver.quit()# 对抓取结果进行简单处理(例如打印页面标题)for idx, html in enumerate(pages):if html:# 这里只是示例,实际项目中可使用BeautifulSoup等进一步解析logging.info(f"第 {idx+1} 个页面抓取成功,长度:{len(html)}")print(f"页面 {idx+1} 抓取成功,内容长度:{len(html)}")else:logging.warning(f"第 {idx+1} 个页面抓取失败")print(f"页面 {idx+1} 抓取失败")# ---------------------------
# 启动混合爬虫
if __name__ == '__main__':try:asyncio.run(main())logging.info("混合爬虫任务全部完成")except Exception as e:logging.critical(f"混合爬虫系统崩溃: {e}")
2.2 代码说明
- 混合抓取策略:函数
fetch_page
根据 URL 中是否包含关键字"dynamic"
决定采用 Selenium 或 aiohttp 的抓取方式。实际项目中,可以根据 URL 正则匹配或页面特征进行判断。 - 异步抓取:利用
asyncio.gather
同时启动多个异步任务,提高静态页面的抓取速度。 - 异常处理与日志记录:在每个请求和抓取过程中,都集成了
try...except
结构,并使用logging
模块记录详细信息,确保出错时可以快速定位问题。
3. 性能优化与资源管理
构建高可用爬虫系统时,性能优化与资源管理同样至关重要。下面介绍几种常见的优化策略:
3.1 限制并发数和请求频率
-
异步请求的并发控制:使用
asyncio.Semaphore
限制同时运行的请求数,避免因过多并发导致系统内存和带宽压力过大。semaphore = asyncio.Semaphore(10) # 限制同时最多10个并发请求async def limited_fetch(url, driver, session):async with semaphore:return await fetch_page(url, driver, session)
-
请求间隔:在抓取过程中加入延时,防止目标网站因请求频率过高而封禁 IP。
3.2 内存与资源泄露检测
- 定期监控 Python 进程的内存占用情况,使用工具如
psutil
或通过日志记录进行分析。 - 在使用 Selenium 或数据库连接后,务必确保资源释放(调用
driver.quit()
、关闭数据库连接等)。
3.3 缓存与去重
- 缓存策略:对已抓取页面进行缓存,避免重复请求,提高爬虫整体效率。
- URL 去重:使用 Redis 或 Bloom Filter 等技术,对任务队列中的 URL 进行去重,防止重复抓取。
4. 自动化监控与报警
高可用爬虫系统必须具备自动监控和报警功能,以便在系统异常或任务失败时能够及时通知运维人员。以下是两种常见的实现方法:
4.1 基于日志的监控
利用前面集成的 logging
模块,将所有关键信息写入日志文件。再通过定时任务(如 crontab)定期扫描日志文件,分析错误和警告信息。当错误次数超过一定阈值时,自动发送报警邮件或短信。
例如,利用 Python 的 smtplib
发送报警邮件:
import smtplib
from email.mime.text import MIMETextdef send_alert_email(subject, content):sender = "your_email@example.com"receivers = ["admin@example.com"]msg = MIMEText(content, "plain", "utf-8")msg["Subject"] = subjectmsg["From"] = sendermsg["To"] = ", ".join(receivers)try:smtp = smtplib.SMTP("smtp.example.com", 25)smtp.login("your_email@example.com", "your_email_password")smtp.sendmail(sender, receivers, msg.as_string())smtp.quit()logging.info("报警邮件发送成功")except Exception as e:logging.error(f"报警邮件发送失败: {e}")
可以将此函数集成到日志分析脚本中,当检测到错误日志异常增多时自动调用发送报警邮件。
4.2 第三方监控平台
使用成熟的监控平台(如 Prometheus、Grafana、ELK Stack)对爬虫服务器进行监控:
- Prometheus + Grafana:收集 CPU、内存、网络等系统指标,并通过 Grafana 展示实时仪表盘。
- ELK Stack:利用 Logstash 和 Kibana 对日志数据进行集中管理和分析,及时发现异常。
5. 容错与自动重启机制
为了保证系统在出现异常时能够持续运行,高可用爬虫系统通常需要具备容错和自动重启能力。常见的实现方法包括:
- 使用 Supervisor 或 systemd:在 Linux 环境下,利用 Supervisor 或 systemd 配置爬虫进程监控,当进程意外退出时自动重启。
- Docker 容器化部署:将爬虫打包成 Docker 镜像,利用 Docker 的重启策略(如
--restart=always
)保证容器异常退出后自动恢复。 - 分布式任务调度系统:采用分布式任务调度系统(如 Celery、RQ),当某个任务失败时自动重新分配,确保全局任务完成率。
6. 小结
在本篇博客中,我们详细介绍了如何构建一个高可用爬虫系统,内容涵盖了系统架构设计、混合爬虫技术整合、性能优化、自动化监控与报警以及容错自动重启机制。主要要点包括:
- 模块化设计:将任务调度、数据采集、数据解析、日志监控等模块进行划分,各司其职,确保系统的灵活性和扩展性。
- 混合技术整合:根据目标页面特点选择合适的抓取方式,利用异步请求和 Selenium 模拟浏览器相结合,提高数据采集效率。
- 性能优化:采用并发控制、请求间隔、缓存与去重等策略,降低资源消耗并提高系统响应速度。
- 自动化监控与报警:利用日志记录、定时任务和第三方监控平台,对系统运行状态进行实时监控,并在异常时及时报警。
- 容错与自动重启:使用进程监控工具和容器化部署,实现爬虫在异常情况下的自动恢复,确保任务不中断。
相关文章:
Python爬虫系列教程之第十三篇:构建高可用爬虫系统 —— 混合架构与自动化监控
大家好,欢迎继续关注本系列爬虫教程!随着爬虫项目规模的不断扩大和业务需求的提升,单一技术方案往往难以满足实际应用中对高可用性、稳定性和自动化监控的要求。如何构建一个既能应对多种反爬策略,又能在异常情况下自动恢复、实时…...
Python学习心得浅拷贝与深拷贝
一、变量的赋值、浅拷贝以及深拷贝的定义: 1.变量的赋值:只是形成两个变量,实际上还是指向同一个对象 2.浅拷贝:拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象…...
cs106x-lecture13(Autumn 2017)-SPL实现
打卡cs106x(Autumn 2017)-lecture13 (以下皆使用SPL实现,非STL库,后续课程结束会使用STL实现) 1、v1v2p1p2 The following code C uses pointers and produces two lines of output. What is the output? int v1 10; int v2 25; int* p1 &v1…...
3D模型在线转换工具:轻松实现3DM转OBJ
3D模型在线转换是一款功能强大的在线工具,支持多种3D模型格式的在线预览和互转。无论是工业设计、建筑设计,还是数字艺术领域,这款工具都能满足您的需求。 3DM与OBJ格式简介 3DM格式:3DM是一种广泛应用于三维建模的文件格式&…...
AI IDE 新势力 Trae 功能深度解析:Builder与Chat模式的应用场景与市场竞争力分析
文章目录 一、前言二、简介2.1 Trae 的背景与定位 三、Trae 核心功能3.1 Builder模式介绍3.2 Chat模式介绍 四、Trae 实际应用案例4.1 Trae 安装与配置4.1.1 Trae 安装与配置4.1.2 Trae 设置 4.2 实战案例分享4.2.1 Trae Builder模式:从0到1生成对接 DeepSeek 的聊天…...
天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制
天 锐 蓝盾终端安全管理系统以终端安全为基石,深度融合安全、管理与维护三大要素,通过对桌面终端系统的精准把控,助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化,有效破解终端安全管理难题…...
ADCP处理软件CODAS安装 (conda方法安装)
夏威夷大学出品的ADCP处理软件,我主要用来查看船载ADCP流速数据。 1. 先安装conda(miniconda就可以),这里不再赘述,安装完可以添加conda库和取消登录自动激活conda conda config --add channels conda-forge # 添加库 conda config --set a…...
JUC并发—9.并发安全集合三
大纲 1.并发安全的数组列表CopyOnWriteArrayList 2.并发安全的链表队列ConcurrentLinkedQueue 3.并发编程中的阻塞队列概述 4.JUC的各种阻塞队列介绍 5.LinkedBlockingQueue的具体实现原理 6.基于两个队列实现的集群同步机制 1.并发安全的数组列表CopyOnWriteArrayList …...
后端Java Stream数据流的使用=>代替for循环
API讲解 对比 示例代码对比 for循环遍历 package cn.ryanfan.platformback.service.impl;import cn.ryanfan.platformback.entity.Algorithm; import cn.ryanfan.platformback.entity.AlgorithmCategory; import cn.ryanfan.platformback.entity.DTO.AlgorithmInfoDTO; im…...
强化学习-GAE方法
2016-ICLR-HIGH-DIMENSIONAL CONTINUOUS CONTROL USING GENERALIZED ADVANTAGE ESTIMATION 解决问题 强化学习的目标为最大化策略的预期总回报,其中一个主要困难为 行为对reward的影响存在一个长时间的延迟(credit assignment problem)。价…...
51c大模型~合集71
我自己的原文哦~ https://blog.51cto.com/whaosoft/12260659 #大模型推理加速技术的学习路线 EfficientQAT 可以在 41 小时内在单个 A100-80GB GPU 上完成对 2-bit Llama-2-70B 模型的量化感知训练。与全精度模型相比,精度仅下降了不到 3%(69.48 v…...
PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)
PyTorch-基础 环境准备 CUDA Toolkit安装(核显跳过此步骤) CUDA Toolkit是NVIDIA的开发工具,里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本,如何去下载对应版本的Toolkit工…...
Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)
安装前检查服务器glibc版本,下载对应版本包 rpm -qa | grep glibc mysql安装包及依赖包已整理好,下载地址:https://pan.quark.cn/s/3137acc814c0,下载即可安装 一、下载MySQL mysql安装包及依赖包已整理好,下载地址…...
Transformer解析——(四)Decoder
本系列已完结,全部文章地址为: Transformer解析——(一)概述-CSDN博客 Transformer解析——(二)Attention注意力机制-CSDN博客 Transformer解析——(三)Encoder-CSDN博客 Transforme…...
TypeScript 中 type 和 interface 深度对比分析
一、核心概念对比 特性interfacetype本质声明式类型契约(面向对象范式)类型别名(函数式编程思维)可扩展性支持声明合并(多次声明自动合并)不可合并基础类型支持只能描述对象/函数类型可描述任意类型&#…...
unplugin-vue-components,unplugin-auto-import,借用ai去学习
好的,我现在需要帮助用户理解他们提供的这段Vite配置代码。用户之前已经询问过关于ElementPlusResolver的导入问题,现在他们展示了在vite.config.ts中使用该解析器的具体配置。我需要逐步分析这段代码,并解释每个部分的作用。 首先ÿ…...
Nginx学习笔记:常用命令端口占用报错解决Nginx核心配置文件解读
Nginx 1. 基础命令1.1 重新加载systemd配置1.2 停止Nginx服务1.3 启动Nginx服务1.4 重启Nginx服务1.5 查看Nginx服务状态1.6 测试配置和重载Nginx 2. 额外命令2.1 启用开机自启2.2 禁用开机自启2.3 强制关闭所有Nginx进程 3. Nginx端口占用解决方案3.1 查找占用端口8090的进程3…...
C++ ——继承
体现的是代码复用的思想 1、子类继承父类,子类就拥有了父类的特性(成员方法和成员属性) 2、已存在的类被称为“基类”或者“父类”或者“超类”;新创建的类被称为“派生类”或者“子类” 注意: (1&#…...
正则表达式常用记录
1. 定义 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),它是一种文本模式,同时也是计算机科学的一个概念,其中包括普通字符(例如,…...
redis的应用,缓存,分布式锁
1.应用 1.1可以用作缓存 作用:提交数据的查询效率,减少对数据库的访问频率 什么数据适合放入缓存 1.查询频率高,修改频率低 2.对安全系数比较低 如何实现 Service public class DeptServer {Autowiredprivate DeptMapper deptMapper;Auto…...
qt5实现表盘的旋转效果,通过提升QLabel类
因为工作需要,需要实现温度的表盘展示效果 实现思路: 通过提示声QLabel控价类,实现报盘的旋转和展示效果 1. 编写一个QLabel的类MyQLabel,实现两个方法 1. void paintEvent(QPaintEvent *event); //重绘函数 2. void valueChanged(int va…...
Flutter项目中设置安卓启动页
AndroidManifest.xml 设置 android:theme“style/LaunchTheme” <applicationandroid:label"string/app_name"android:name"${applicationName}"android:icon"mipmap/ic_launcher"android:roundIcon"mipmap/ic_launcher"android:t…...
人工智能之目标追踪DeepSort源码解读(yolov5目标检测,代价矩阵,余弦相似度,马氏距离,匹配与预测更新)
要想做好目标追踪,须做好目标检测,所以这里就是基于yolov5检测基础上进行DeepSort,叫它为Yolov5_DeepSort。整体思路是先检测再追踪,基于检测结果进行预测与匹配。 一.参数与演示 这里用到的是coco预训练人的数据集: 二.针对检测结果初始化track 对每一帧数据都输出…...
C语言之枚举类型
目录 前言 一、enum(枚举 总结 前言 在C语言中,枚举类型是一种用户自定义的数据类型,用于定义一组具名的常量集合。枚举类型可以提高代码的可读性和可维护性,同时也能够帮助程序员避免使用魔法数字。通过枚举类型,我们…...
【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
推荐一款AI大模型托管平台-OpenWebUI
推荐一款AI大模型托管平台-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官网地址:https://openwebui.com/ GitHub地址: https://github.com/open-webui/open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离…...
复习dddddddd
1. 思路:用队列先进先出的特性 #include <iostream> #include <vector> #include <stack> #include <cstdio> #include <algorithm> #include <cstring> #include <climits> #include <cstdlib> #include <cma…...
【3.5JavaScript】JavaScript字符串对象
文章目录 1.获取字符串长度2.大小写转换3.获取某一个字符4.截取字符串5.替换字符串6.分割字符串7.检索字符串位置8.例题:统计某一个字符的个数 在 JavaScript 中,对象是非常重要的知识点。对象分为两种:一种是 ”自定义对象“,另…...
消息队列-持续更新中
消息队列 0、消息队列官方参考文档 MQ官方参考文档 RocketMQ 官方文档: https://rocketmq.apache.org/docs/quick-start/ RocketMQ 中国开发者中心:http://rocketmq.cloud/zh-cn/ Kafka 官方文档: http://kafka.apache.org/documentation/ …...
创建一个简单的spring boot+vue前后端分离项目
一、环境准备 此次实验需要的环境: jdk、maven、nvm和node.js 开发工具:idea或者Spring Tool Suite 4,前端可使用HBuilder X,数据库Mysql 下面提供maven安装与配置步骤和nvm安装与配置步骤: 1、maven安装与配置 1…...
已知点矩阵的三个顶点坐标、行列数和行列的间距,计算得出剩余所有点的坐标
已知点矩阵的三个顶点坐标、行列数和行列的间距,计算得出剩余所有点的坐标 计算矩阵中每个点的坐标代码实现案例图调用验证 计算矩阵中每个点的坐标 给定左上角、左下角和右上角三个点的坐标,以及矩阵的行数、列数、行间距和列间距,我们可以…...
视频mp4垂直拼接 水平拼接
视频mp4垂直拼接 水平拼接 pinjie_v.py import imageio import numpy as np import os import cv2def pinjie_v(dir1,dir2,out_dir):os.makedirs(out_dir, exist_okTrue)# 获取目录下的所有视频文件video_files_1 [f for f in os.listdir(dir1) if f.endswith(.mp4)]video_fi…...
【记录54】渐变色 linear-gradient / radial-gradient
linear-gradient 线性渐变:是以直线条渐变 radial-gradient 径向渐变:是以图型形状渐变 <!-- 线性渐变(从一个方向到另一个方向 --><div style" background: linear-gradient(to right, red, blue);"></div><…...
一周学会Flask3 Python Web开发-response响应格式
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在HTTP响应中,数据可以通过多种格式传输。大多数情况下,我们会使用HTML格式,这也是Flask中…...
二级公共基础之数据结构与算法篇(八)排序技术
目录 前言 一、交换类排序 1.冒泡排序法 1. 冒泡排序的思想 2. 冒泡排序的实现步骤 3. 示例 4. 冒泡排序的特点 2.快速排序 1. 快速排序的核心思想 2. 快速排序的实现步骤 3. 示例代码(C语言) 4. 快速排序的特点 二、插入类排序 1. 简单插入排序 1.简单插入排…...
以ChatGPT为例解析大模型背后的技术
目录 1、大模型分类 2、为什么自然语言处理可计算? 2.1、One-hot分类编码(传统词表示方法) 2.2、词向量 3、Transformer架构 3.1、何为注意力机制? 3.2、注意力机制在 Transformer 模型中有何意义? 3.3、位置编…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cpuinfo 函数
ngx_cpuinfo 声明在 src/core/ngx_core.h void ngx_cpuinfo(void); 定义在 src/core/ngx_cpuinfo.c 这里 ngx_cpuinfo 的定义可以找到 2 个 使用 gcc -E 处理一下来确认当下环境中使用的是哪一个 gcc -E src/core/ngx_cpuinfo.c \-I src/core \-I src/event \-I src/event/modu…...
python小项目编程-中级(1、图像处理)
目录 图像处理 实现 测试 unittest pytest 图像处理 实现界面化操作,使用PIL库实现简单的图像处理功能,如缩放(设置缩放比例)、旋转和滤镜、对比度调整、亮度调整、灰度图、二值化图(二值图如果使用的是彩色图片需…...
EasyExcel实现excel导入(模版上传)
目录 效果pom.xmlapplication.ymlcontrollerservice依赖类前台vue代码某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前…...
AI工作流+专业知识库+系统API的全流程任务自动化
我有点悲观,甚至很沮丧,因为AI留给普通人的机会不多了,这既是人类之间权力的斗争,也是硅基生命和碳基生命的斗争。AI自动化是无法避免的趋势,如果人类不能平权,那就只能跪下接受审判。 通过整合AI工作流、专…...
【C/C++】合并两个有序链表 (leetcode T21)
核心考点预览:链表 (双指针) 技巧:虚拟头结点 题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入输出示例1l1 [1,2,4], l2 [1…...
C语言进阶习题【2】(4结构体进阶)——通讯录的实现3
1. 本节在动态版本通讯录的基础上实现存储功能 在动态版本的基础上,对于通讯录的新增了存储到文件中,可以从文件中打开我们存储的通信录功能。新增函数:saveContatc()和loadContact() 2. 具体实现 2.1 contact.h /…...
Linux系统编程之无名管道
概述 在Linux系统中,无名管道是一种简单的进程间通信机制。它允许一个进程创建一对文件描述符,其中一个用于读取,另一个用于写入。当一个进程通过系统调用创建了一个无名管道后,便可以将这两个文件描述符传递给它的子进程…...
deepseek与其他大模型配合组合
DeepSeek与其他大模型的配合组合,展现了其在多个领域中的强大应用潜力和灵活性。以下是对DeepSeek与其他大模型配合组合的详细分析: 一、DeepSeek与华知大模型的组合 背景介绍: 华知大模型是同方知网与华为联手打造的,具备全学科…...
ASP.NET Core Clean Architecture
文章目录 项目地址一、1. 重点1.1 Repository数据库接口1.2 GetEventDetail 完整的Query流程1.3 创建Command并使用validation 项目地址 教程作者:ASP.NET Core Clean Architecture 2022-12 教程地址: https://www.bilibili.com/video/BV1YZ421M7UA?…...
DeepSeek安装部署笔记(一)
Ollamaopen-WebUI部署 DeepSeek安装部署笔记第一步 Ollama安装1.安装ollama:官网https://ollama.com/下载2.上面安装完成,在cmd命令行: 第二步 给DeepSeek添加OpenWebUI界面(重点)1.安装conda:用它来管理py…...
ProfiNet转EtherNet/IP罗克韦尔PLC与监控系统通讯案例
一、案例背景 在新能源产业蓬勃发展的当下,大型光伏电站作为绿色能源的重要输出地,其稳定高效的运行至关重要。某大型光伏电站占地面积广阔,内部设备众多,要保障电站的稳定运行,对站内各类设备进行集中监控与管理必不可…...
23.2 HtmlDocument类
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 HtmlDocument类提供了HTML文档的顶级编程访问,配合WebBrowser的 Document属性使用,可以获得WebBrowser当前页…...
wordpress adrotate插件 文件上传漏洞
当你爆破进wordpress后台但权限不是管理员的时,如果你有adrotate插件操作权限可以用adrotate的文件上传功能get webshell 该漏洞需要AdRotate版本 < 5.13.3 第一步按顺序点击上传文件 在这里文件一定要压缩成zip格式,上传的时候也是上传这个zip 上…...
数据分析和数据挖掘的工作内容
基本的数据分析工作通常包含以下几个方面的内容: 确定目标(输入):理解业务,确定指标口径。获取数据:数据仓库(SQL提数)、电子表格、三方接口、网络爬虫、开放数据集等。清洗数据&am…...