Python爬虫第18节-动态渲染页面抓取之Splash使用上篇
目录
引言
一、Splash 的简介与安装
1.1 简介
1.2 安装
二、Splash 的使用
三、Splash Lua 脚本开发
3.1 脚本入口与返回值
3.2 异步处理
四、Splash 对象属性
4.1 `args`
4.2 `js_enabled`
4.3 `resource_timeout`
4.4 `images_enabled`
4.5 `scroll_position`
4.6 `plugins_enabled`
五、Splash 对象方法
5.1 `go`:加载页面
5.2 `wait`:等待延时
5.3 `evaljs`:执行 JavaScript 并返回结果
5.4 `runjs`:执行 JavaScript 语句
5.5 `autoload`:预加载 JavaScript 库
5.6 `http_get`/`http_post`:模拟 HTTP 请求
六、总结与后续
引言
在动态网页抓取场景中,Splash 作为一款轻量级 JavaScript 渲染服务,为解决页面动态加载内容的获取难题提供了高效方案。它通过集成浏览器内核与 HTTP API,结合 Lua 脚本灵活控制渲染流程,可实现页面源码提取、截图生成、性能分析等功能。本文将围绕 Splash 的核心功能、使用流程及脚本开发要点展开介绍,帮助读者快速掌握这一动态渲染抓取工具的实践方法。
一、Splash 的简介与安装
1.1 简介
Splash 是个 JavaScript 渲染服务,它相当于一个带有 HTTP API 的轻量级浏览器,并且和 Python 里的 Twisted、QT 库进行了对接。借助它,我们也能够实现对动态渲染页面的抓取。
使用 Splash 能够实现下面这些功能:
- 用异步的方式处理多个网页的渲染过程
- 获取渲染后页面的源代码或者截图
- 通过关闭图片渲染或者使用 Adblock 规则来加快页面的渲染速度
- 可以执行特定的 JavaScript 脚本
- 能够通过 Lua 脚本来控制页面的渲染过程
- 获取渲染的详细过程,并且以 HAR(HTTP Archive)格式呈现出来
下面我们来看看它的具体使用方法。在开始使用之前,要保证已经正确安装了 Splash 并且服务能正常运行。要是没安装的话,可以自己在网上搜索安装方法。
Splash 与 Selenium 对比
1.2 安装
Splash 安装步骤(Windows 系统)
(1)安装 Docker Desktop
1. 系统要求
- 操作系统:
- Windows 11 64 位(版本 22H2 或更高,支持 Home/Pro/Enterprise/Education)。
- Windows 10 64 位(版本 22H2 (build 19045) 或更高,仅 Pro/Enterprise/Education 支持 Windows 容器)。
- 硬件:64 位处理器(支持 SLAT)、4GB 内存、启用 BIOS/UEFI 硬件虚拟化。
2. 安装方式
- 交互式安装:
1. 从 [Docker Desktop 官网](https://hub.docker.com/editions/community/docker-ce-desktop-windows) 下载安装程序。
2. 双击运行 `Docker Desktop Installer.exe`,按向导完成安装,默认安装路径为 `C:\Program Files\Docker\Docker`。
3. 安装完成后,手动启动 Docker Desktop 并接受服务协议。
- 命令行安装:
# PowerShell 示例
Start-Process 'Docker Desktop Installer.exe' -Wait -ArgumentList 'install', '--accept-license'
3. 启用 WSL 2 或 Hyper-V
- 在安装向导中选择后端(WSL 2 或 Hyper-V),系统自动适配仅支持的选项。
(2)安装 Splash 服务
1. 拉取 Splash 镜像
需要翻墙网络
docker pull scrapinghub/splash
2. 运行 Splash 容器
docker run -d -p 8050:8050 scrapinghub/splash
- `-d`:后台运行容器。
- `-p 8050:8050`:将容器端口 8050 映射到本地 8050 端口。
3. 验证安装
访问 `http://localhost:8050`,若看到 Splash 管理界面,则安装成功。
(3)安装 Scrapy-Splash 插件
pip install scrapy-splash
Splash 核心优势
- 异步处理:支持同时渲染多个页面,提升抓取效率。
- 轻量级架构:基于 Docker 容器化部署,资源占用少,适合分布式部署。
- 脚本灵活性:通过 Lua 直接控制浏览器行为,支持执行 JS、设置请求头、模拟滚动等操作。
- 性能优化:可禁用图片、插件或设置超时,减少资源消耗,加速渲染。
api 文档:
Splash HTTP API — Splash 3.5 documentation
二、Splash 的使用
Splash 是一个基于 JavaScript 渲染的服务,本质是带有 HTTP API 的轻量级浏览器,集成了 Python 的 Twisted 和 QT 库,可实现动态网页渲染与抓取。
(1)功能特性
Splash 支持以下核心功能:
- 异步处理多个网页渲染任务
- 获取渲染后的页面源码、截图或 HAR 格式的请求日志
- 通过禁用图片加载或应用 Adblock 规则加速渲染
- 执行自定义 JavaScript 脚本
- 通过 Lua 脚本控制页面渲染流程
- 输出详细的渲染过程信息
(2)环境准备
使用前需确保已正确安装 Splash 并启动服务。若未安装,可参考第 1 章指引完成部署。
(3)快速入门:Web 页面测试
启动 Splash 后,访问 `http://localhost:8050/` 进入测试界面:
1. 输入 URL:右侧输入框默认填写 `http://google.com`,修改为 `https://www.baidu.com`。
2. 触发渲染:点击按钮,Splash 会加载页面并返回:
- 页面截图
- HAR 格式的加载统计数据(包含 CSS、JavaScript 等资源的加载过程)
- 网页源代码
核心脚本示例(默认渲染逻辑):
function main(splash, args) assert(splash:go(args.url)) -- 加载页面 assert(splash:wait(0.5)) -- 等待 0.5 秒 return { html = splash:html(), -- 页面源码 png = splash:png(), -- 页面截图 har = splash:har() -- 加载过程日志 }
end
该脚本通过 Lua 语言控制渲染流程,模拟浏览器行为并输出多格式结果。
三、Splash Lua 脚本开发
3.1 脚本入口与返回值
- 入口函数:必须命名为 `main`,接收 `splash`(核心对象)和 `args`(参数)作为输入。
function main(splash, args) splash:go("http://www.baidu.com") splash:wait(0.5) local title = splash:evaljs("document.title") -- 执行 JavaScript 获取标题 return {title=title} -- 返回字典或字符串 end
- 返回值类型:
- 字典:`return {hello="world!"}`
- 字符串:`return "hello"`
3.2 异步处理
Splash 支持异步任务处理,通过循环加载多个 URL 并并行渲染:
function main(splash, args) local urls = args.urls or {"www.baidu.com", "www.taobao.com", "www.zhihu.com"} local results = {} for index, url in ipairs(urls) do local ok, reason = splash:go("http://" .. url) if ok then splash:wait(2) results[url] = splash:png() -- 保存截图 end end return results
end
注意:Lua 使用 `..` 进行字符串拼接,`ipairs` 用于遍历数组。
四、Splash 对象属性
4.1 `args`
获取脚本参数,支持两种写法:
-- 方式一:通过第二个参数直接获取
function main(splash, args) local url = args.url
end -- 方式二:通过 splash.args 获取
function main(splash) local url = splash.args.url
end
4.2 `js_enabled`
控制 JavaScript 执行(默认 `true`):
function main(splash, args)splash:go("https://www.baidu.com")splash.js_enabled = falselocal title = splash:evaljs("document.title")return {title=title}
end
注意:禁用后调用 `evaljs` 会抛出异常,通常保持默认开启。
4.3 `resource_timeout`
设置资源加载超时时间(秒),`0` 或 `nil` 表示不超时:
function main(splash)splash.resource_timeout = 0.1 -- 超时时间 0.1 秒assert(splash:go('https://www.taobao.com'))return splash:png()
end
4.4 `images_enabled`
控制图片加载(默认 `true`):
function main(splash, args)splash.images_enabled = false -- 禁用图片加载,提升速度 assert(splash:go('https://www.jd.com'))return {png=splash:png()}
end
4.5 `scroll_position`
控制页面滚动位置:
splash.scroll_position = {y=400} -- 向下滚动 400 像素
splash.scroll_position = {x=100, y=200} -- 向右滚动 100 像素,向下滚动 200 像素
示例:
function main(splash, args)assert(splash:go('https://www.taobao.com'))splash.scroll_position = {y=400}return {png=splash:png()}
end
4.6 `plugins_enabled`
此属性可以控制浏览器插件(如 Flash 插件)是否开启。默认情况下,此属性是 false,表示不开启。可以使用如下代码控制其开启和关闭:
splash.plugins_enabled = true/false
五、Splash 对象方法
5.1 `go`:加载页面
模拟 HTTP 请求(支持 GET/POST):
local ok, reason = splash:go{ url = "http://httpbin.org/post", http_method = "POST", body = "name=Germey" -- POST 表单数据(Content-Type: application/x-www-form-urlencoded)
}
5.2 `wait`:等待延时
splash:wait(2) -- 等待 2 秒
splash:wait{time=2, cancel_on_redirect=true} -- 重定向时终止等待
5.3 `evaljs`:执行 JavaScript 并返回结果
local title = splash:evaljs("document.title") -- 获取页面标题
5.4 `runjs`:执行 JavaScript 语句
splash:runjs("var foo = function() { return 'bar'; }") -- 声明 JavaScript 函数
local result = splash:evaljs("foo()") -- 调用函数
5.5 `autoload`:预加载 JavaScript 库
splash:autoload("https://code.jquery.com/jquery-2.1.3.min.js") -- 加载 jQuery
local version = splash:evaljs("$.fn.jquery") -- 获取库版本
5.6 `http_get`/`http_post`:模拟 HTTP 请求
-- GET 请求
local response = splash:http_get("http://httpbin.org/get") -- POST 请求(JSON 数据)
local response = splash:http_post{ url = "http://httpbin.org/post", body = json.encode({name="Germey"}), headers = {["content-type"]="application/json"}
}
六、总结与后续
Splash 通过 Lua 脚本提供了灵活的页面渲染控制能力,支持模拟浏览器行为、执行自定义脚本及异步任务处理。结合其 HTTP API,可高效实现动态网页的数据抓取与分析。实际使用中需注意资源加载策略、JavaScript 执行逻辑及异步任务的异常处理,以优化渲染性能与稳定性。本节Splash 对象方法还没讲完,请继续看下一节内容讲解。
相关文章:
Python爬虫第18节-动态渲染页面抓取之Splash使用上篇
目录 引言 一、Splash 的简介与安装 1.1 简介 1.2 安装 二、Splash 的使用 三、Splash Lua 脚本开发 3.1 脚本入口与返回值 3.2 异步处理 四、Splash 对象属性 4.1 args 4.2 js_enabled 4.3 resource_timeout 4.4 images_enabled 4.5 scroll…...
Linux进程状态及转换关系
目录 1、就绪态(Ready) 2、运行态(Running) 3、僵尸态(Zombie) 4、可中断睡眠态(Interruptible Sleep) 5、不可中断睡眠态(Uninterruptible Sleep) 6、…...
Java基础:认识注解,模拟junit框架
认识注解 自定义注解 注解的原理 元注解 解析注解 应该场景-配合反射做juint框架 public static void main(String[] args) {AnnotationDemo4 a new AnnotationDemo4();Class clazz AnnotationDemo4.class;Method[] methods clazz.getDeclaredMethods();for (Method method …...
chrony服务器
时间有什么作用?约定干什么事情,会出问题,双方约定会达成 一旦有一方的时间不准确,约定都会达不成 不联网,计算机运行一个月,你的计算机就会和标准的时间差一两分钟 通常情况下,硬件时间的运…...
Springboot——Redis的使用
在当今的软件开发领域,缓存技术是提升应用性能的关键手段之一。Redis 作为一款高性能的键值对存储数据库,凭借其出色的读写速度和丰富的数据结构,在缓存场景中得到了广泛应用。Spring Boot 作为一款简化 Spring 应用开发的框架,与…...
【EasyPan】removeFile2RecycleBatch方法及递归操作解析
【EasyPan】项目常见问题解答(自用&持续更新中…)汇总版 文件批量转移到回收站方法解析 一、方法总述 removeFile2RecycleBatch方法实现将用户选中的文件/目录及其子内容批量移入回收站的业务逻辑,主要特点: 递归处理&…...
AIGC的伦理困境:机器生成内容是否该被监管?
AIGC的伦理困境:机器生成内容是否该被监管? 在当今数字时代,人工智能(AI)技术的发展日新月异,其中生成式人工智能(AIGC, AI-Generated Content)作为一项前沿技术,正以前…...
缓存一致性
什么是缓存一致性? 当数据库和缓存之间的额数据内容保持同步或最终一致,称为缓存一致性 为什么缓存不一致会发生? 因为缓存和数据库是两个独立系统,它们的更新过程不是原子操作,就可能发生以下情况: //…...
【Java学习方法】终止循环的关键字
终止循环的关键字 一、break 作用:跳出最近的循环(直接结束离break最近的那层循环) 使用场景:一般搭配if条件判断,如果满足某个条件,就结束循环,(场景:常见于暴力枚举中…...
bert学习
BERT Google在2018年提出的预训练语言模型,通过双向Transformer结构和大规模预训练。 核心特点 双向上下文 与传统模型(如LSTM或单向Transformer)不同,BERT通过同时考虑单词的左右上下文来捕捉更丰富的语义信息。…...
读书笔记:淘宝十年产品与技术演进史
作者:大淘宝技术 原文地址:读书笔记:淘宝十年产品与技术演进史 本文是对《淘宝十年产品事》与《淘宝技术这十年》两本书的阅读笔记总结。通过回顾淘宝过去十年在产品、技术、架构、中间件及开放平台等方面的发展历程,展现了其从初…...
ROS 快速入门教程02
5. Node 节点 以智能手机为例,当我们使用智能手机的某个功能时,大多时候在使用手机的某个APP。同样当我们使用ROS的某个功能时,使用的是ROS的某一个或者某一些节点。 虽然每次我们只使用ROS的某一个或者某一些节点,但我们无法下…...
卷积神经网络常用结构
空间注意力机制(Spatial Attention)详解 空间注意力机制(Spatial Attention)详解 空间注意力机制是计算机视觉中的重要组件,它使网络能够选择性地关注特征图中的重要空间区域,同时抑制不相关区域的影响。 空间注意力机制结构图 空间注意力机制详细解析…...
neo4j中节点内的名称显示不全解决办法(如何让label在节点上自动换行)
因为节点过多而且想让节点中所有文字都显示出来而放大节点尺寸 从neo4j中导出png,再转成PDF来查看时,要看清节点里面的文字就得放大5倍才行 在网上看了很多让里面文字换行的办法都不行 然后找到一个比较靠谱的办法是在要显示的标签内加换行符 但是我的节点上显示的是…...
容器化-Docker-进阶
一、自定义镜像:从基础部署到镜像定制 (一)Linux 与 Docker 原生部署 Nginx 对比 Linux 原生部署 Nginx # 安装依赖 sudo apt-get update && sudo apt-get install -y build-essential openssl libpcre3-dev zlib1g-dev # 下载Nginx源码 wget http://nginx.org…...
Sqlserver 自增长id 置零或者设置固定值
在 SQL Server 中,如果需要重置一个表的自增长(Identity)列的当前值,通常有几种方法可以实现。但是,值得注意的是,直接将自增长列的值设置为0并不是一个推荐的做法,因为这会破坏自增长列的连续性…...
状态模式(State Pattern)详解
文章目录 一、状态模式简介1.1 什么是状态模式?1.2 为什么需要状态模式?1.3 状态模式的核心思想二、状态模式的结构2.1 UML类图2.2 各个组件的详细说明2.3 交互过程三、状态模式的实现步骤(以Java为例)步骤1:创建状态接口步骤2:实现具体状态类步骤3:创建上下文类步骤4:…...
Shopee五道质检系统重构东南亚跨境格局,2025年电商游戏规则悄然改写
在2024年的东南亚跨境电商市场,一场以“质量”为核心的深度变革正在上演。作为头部平台的Shopee率先出招,以一套“五道质检流程”打破行业旧格局,不仅有效遏制高企的退货率,更引发从卖家结构到政策制度的连锁反应。 这场质量革命…...
Unity-无限滚动列表实现Timer时间管理实现
今天我们来做一个UI里经常做的东西:无限滚动列表。 首先我们得写清楚实现的基本思路: 所谓的无限滚动当然不是真的无限滚动,我们只要把离开列表的框再丢到列表的后面就行,核心理念和对象池是类似的。 我们来一点一点实现&#x…...
Python高级爬虫之JS逆向+安卓逆向1.6节: 函数基础
目录 引言: 1.6.1 理解函数 1.6.2 定义函数 1.6.3 调用函数 1.6.4 位置实参 1.6.5 关键字实参 1.6.6 爬虫不要进接单群 引言: 大神薯条老师的高级爬虫+安卓逆向教程: 这套爬虫教程会系统讲解爬虫的初级,中级,高级知识,涵盖的内容包括基础爬虫,高并发爬虫的设计与…...
集结号海螺捕鱼组件搭建教程与源码结构详解(第四篇)
本篇将聚焦“冰封领域”场景构建与性能优化策略。本节适合有Unity经验的技术团队,对大型特效场景优化、C与Unity协同通信及资源动态加载有深入需求的开发者。 一、冰封领域场景设计理念 冰封领域是高难度玩法场景,常用于高段位玩家房间,场景…...
02.Python代码Pandas - Series全系列分享(使用.特点.说明.取值.函数)
02.Python代码Pandas - Series全系列分享(使用.特点.说明.取值.函数) 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是pandas的使用语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望…...
星火燎原:Spark技术如何重塑大数据处理格局
在数字化浪潮席卷全球的今天,数据已成为企业发展与社会进步的核心驱动力。面对海量且复杂的数据,传统的数据处理技术逐渐显得力不从心。而Apache Spark作为大数据领域的明星框架,凭借其卓越的性能与强大的功能,如同一束璀璨的星火…...
AI大模型和人脑的区别
为什么人脑没有幻觉,但是 AI 大语言模型有幻觉? 人脑和大型语言模型(LLM)在处理信息的方式上存在根本差异,这导致了幻觉现象主要出现在LLM中。LLM的幻觉是指模型生成了貌似合理但实际上错误或虚构的内容。 LLM的工作…...
第一章:基于Docker环境快速搭建LangChain框架的智能对话系统:从langchain环境搭建到多轮对话代码实现(大语言模型加载)
文章目录 前言一、langchain环境搭建1、docker容器搭建2、docker容器连接修改密码容器内容修改物理机修改 3、langchain安装 二、langchain构建简单智能对话示例1、基于deepseek的简单问答Demo2、langchain的invoke、stream与astream生成方法1、langchain的invoke、stream与ast…...
数据结构的学习(1)二分查找,利用二分查找找局部最小值,选择排序,冒泡排序,插入排序,位运算的基础知识
一、二分查找某个元素 (1)查找是否存在某个元素在数组中 思想: 1)先看中间位置的值 2)如果中间位置的值大于目标值说明目标值在整个数组中偏左的位置,改变右边界,即Right Mid - 1; 3…...
vue2+Vant 定制主题
参考文档:Vant主题定制-CSDV博客 vant提供了一套默认主题,若想完全替换主题是或者其他样式,则需要定制主题。 定制方法 1、main.js文件引入主题样式源文件 // 导入并安装 Vant 组件库 import Vant from vant // 切记:为了能够覆…...
【自然语言处理与大模型】大模型参数规模与部署配置调查2025第一季度
调查大模型参数规模与部署配置之间的关系。探讨如何在不同硬件和场景下优化大模型的部署。 一、 当前主流模型的参数规模对比 (1)当前主流模型有哪些 参考全球最大AI开源社区Hugging Face发布的榜单、上海AI实验室推出的开放评测体系OpenCompass和国内开…...
香港科技大学广州|先进材料学域博士招生宣讲会—南开大学专场
香港科技大学广州|先进材料学域博士招生宣讲会—南开大学专场 时间:2025年4月25日(星期五)10:00 地点:南开大学八里台校区中心实验室报告厅 宣讲嘉宾: 李昊翔 助理教授 TAN Chee Keong 助理教授 教授亲…...
异构迁移学习(无创脑机接口中的跨脑电帽迁移学习)
本文介绍BCI中的跨脑电帽的迁移学习最新算法。 (发表于2025 arxiv,应该属于投稿阶段,这个场景具有非常不错的研究意义和前景) 最新跨脑电帽异构算法github开源代码 SDDA算法原文 一、脑机接口绪论 脑机接口(BCI)指在人或动物大脑与外部设备之间创建的直接连接,通过脑…...
若依项目部署小结
参考视频:前后端分离式项目实战部署 | CodeSheep 环境搭建 虚拟机环境:jdk1.8 tomcat9 nginx A :虚拟机A运行前端项目 A B:虚拟机B运行war包 B C:虚拟机C运行jar包 C mysql和redis连的是C主机 前端项目部署 必备&…...
多智能体系统的中间件架构
多智能体系统(Multi-Agent Systems, MAS)是一种由多个智能体(Agents)组成的分布式系统,这些智能体能够自主地感知环境、做出决策并与其他智能体进行交互。 中间件(Middleware)在多智能体系统中…...
Eliciting Causal Abilities in Large Language Models for Reasoning Tasks
Eliciting Causal Abilities in Large Language Models for Reasoning Tasks | Proceedings of the AAAI Conference on Artificial Intelligencehttps://ojs.aaai.org/index.php/AAAI/article/view/33669 1. 概述 大型语言模型(Large Language Models, LLMs)面临的一...
DeepSeek+Mermaid:轻松实现可视化图表自动化生成(附实战演练)
目录 一、引言:AI 与图表的梦幻联动二、DeepSeek:大语言模型新星崛起2.1 DeepSeek 全面剖析2.2 多场景应用示例2.2.1 文本生成2.2.2 代码编写 三、Mermaid:代码式图表绘制专家3.1 Mermaid 基础探秘3.2 语法与图表类型详解3.2.1 流程图&#x…...
LeetCode第164题_最大间距
LeetCode 第164题:最大间距 题目描述 给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。 您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。 难度…...
什么是DDD?为什么它正在取代传统架构?
什么是DDD?为什么它正在取代传统架构? 1. 传统开发模式的痛点 在经典的MVC架构中,开发流程往往从数据库表结构设计开始,业务逻辑散落在Service层,随着需求迭代容易形成「大泥球」代码: 实体类变成纯粹的…...
Vue3父子组件数据双向同步实现方法
在 Vue 3 中,实现父子组件间双向同步响应式对象的步骤如下: 实现思路 父组件通过 v-model 传递响应式对象。 子组件接收并深拷贝为本地副本。 子组件监听父组件的数据变化,更新本地副本(不触发同步)。 子组件监听本…...
一些基本的 Vue 规范
一、项目结构规范 推荐的目录结构 src/ ├── assets/ # 静态资源(如图片、字体) ├── components/ # 全局组件 ├── views/ # 页面组件(用于路由) ├── router/ # 路由配置 ├── store/…...
面试篇:Java并发与多线程
基础概念 什么是线程?线程和进程的区别是什么? 线程 是程序执行的最小单位,它是 CPU 调度和执行的基本单元。一个进程可以包含多个线程,这些线程共享进程的资源(如内存),但每个线程有自己的栈…...
Unity中通过TMP使用图片字体
折腾了半天,最后发现一个相对简单,不需要使用任何插件,只凭默认的TMP外加PS的办法。 1,在Font Asset Creator设置参数 (1)source font file:尽量选一个支持中文的字体。 (2&#x…...
WSL2-Ubuntu22.04下拉取Docker MongoDB镜像并启动
若未安装docker可参考此教程:可以直接在wsl上安装docker吗,而不是安装docker desktop?-CSDN博客 1. 拉取镜像 docker pull mongo:latest 2.打开网络加速,再次拉取镜像 3.创建docker-compose.yml 进入vim编辑器后输入i进行编辑&a…...
Java基础系列-HashMap源码解析2-AVL树
文章目录 AVL树左旋右旋左旋右旋的4种情况LL 型RR 型LR 型RL 型 实际插入时怎么判断是那种类型?插入时注意事项删除节点 AVL树 为避免BST树退化成链表的极端情况, AVL 树应运而生。 平衡因子取值(-1,0,1)…...
介绍 IntelliJ IDEA 快捷键操作
IntelliJ IDEA 快捷键操作 1. 编辑与导航2. 查找与替换3. 调试与运行4. 导航与视图5. 重构与生成6. 高级快捷键(提高效率)注意事项 IntelliJ IDEA 是一款功能强大的集成开发环境,掌握其常用快捷键可以显著提升开发效率。但是有些小伙伴并不清…...
Python 流程控制
目录 1. if 语句 1.1 条件表达式与关系运算符 1.2 if-else 条件语句 1.3 多重 if 语句 1.4 if 语句的常见问题 2. Python 的循环 2.1 while 循环 2.1.1 while 循环语句 2.1.2 Python 的注释 2.1.3 字符串的格式化输出 2.1.4 while 循环嵌套 2.2 for 循环 2.2.1 for…...
若依框架深度解析:企业级快速开发平台的设计哲学与实践
一、框架定位与技术基因 若依(RuoYi)作为国产开源企业级快速开发平台,完美融合了**"高效"与"灵活"两大核心设计理念。其技术基因植根于Spring Boot生态,通过模块化架构设计,将传统Java EE开发效率…...
【每日八股】复习 MySQL Day2:索引
文章目录 昨日内容复习MySQL 事务的四大特性?并发事务会产生哪些问题?MySQL 事务的隔离级别?MVCC 实现原理?幻读如何解决?读已提交隔离级别如何实现? 复习 MySQL Day2:索引MySQL 使用 B 树作为索…...
2025深圳中兴通讯安卓开发社招面经
2月27号 中兴通讯一面 30多分钟 自我介绍 聊项目 我的优缺点,跟同事相比,有什么突出的地方 Handler机制,如何判断是哪个消息比较耗时 设计模式:模板模式 线程的状态 线程的开启方式 线程池原理 活动的启动模式 Service和Activity…...
MyBatis中的@Param注解-如何传入多个不同类型的参数
mybatis中参数识别规则 默认情况下,MyBatis 会按照参数位置自动分配名称:param1, param2, param3, ...或者 arg0, arg1。 // Mapper 接口方法 User getUserByIdAndName(Integer id, String name); 以上接口在XML中只能通过param1或者arg0这样的方式来引用,可读性差。 &l…...
【高频考点精讲】JavaScript中的访问者模式:从AST解析到数据转换的艺术
大家好呀!今天想和大家聊聊一个既实用又有点"高冷"的设计模式——访问者模式。这个模式在AST解析、Babel插件开发中无处不在,但很多同学可能一直没搞明白它到底妙在哪里。 一、生活中的访问者模式 想象一下你开了一家奶茶店,店里…...
crictl 拉取镜像报错 Unimplemented desc = unknown service runtime.v1.ImageService
具体报错内容如下 crictl pull registry.cn-beijing.aliyuncs.com/kubesphereio/pause:3.9 FATA[0000] validate service connection: validate CRI v1 image API for endpoint "unix:///run/containerd/containerd.sock": rpc error: code Unimplemented desc un…...