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

Selenium自动化防爬技巧:从入门到精通,保障爬虫稳定运行,通过多种方式和add_argument参数设置来达到破解防爬的目的

在Web自动化测试和爬虫开发中,Selenium作为一种强大的自动化工具,被广泛用于模拟用户行为、数据抓取等场景。然而,随着网站反爬虫技术的日益增强,直接使用Selenium很容易被目标网站识别并阻止。因此,掌握Selenium的防爬策略与参数设置变得尤为重要。本文将详细介绍几种常见的Selenium防爬方法,并列出关键的防爬参数,同时提供详细的代码案例。

关于Selenium防止被检测到实战可以参考这几篇文章:

selenium实战指南:如何防止被浏览器检测?_selenium防止被检测-CSDN博客

Selenium自动化爬取BOSS招聘数据:一个完整的指南(实测有效)_selenium爬取并存储boss网站招聘数据过程-CSDN博客

Selenium实战:深度解析Python中嵌套Frame与iFrame的定位与切换技巧,解决Selenium定位不到的问题-CSDN博客 

一、Selenium防爬方法概述

1. 修改User-Agent

User-Agent是浏览器向服务器发送请求时携带的一种标识,通过修改它可以使Selenium的请求看起来更像是来自真实用户的浏览器。

2. 设置浏览器窗口大小

一些网站会通过检测浏览器窗口大小来判断是否为自动化脚本。设置合理的窗口大小可以使请求更加自然。

3. 禁用图片加载

加载图片会增加请求次数和响应时间,同时也可能暴露自动化脚本的特征。禁用图片加载可以加快请求速度并减少被识别的风险。

4. 使用代理IP

频繁使用同一IP地址进行请求容易被目标网站封禁。使用代理IP可以隐藏真实IP地址,增加请求的匿名性。

5. 模拟用户行为

通过模拟真实的用户行为(如点击、滚动、等待等)来减少被识别的风险。

6. 增加请求间隔

合理的请求间隔可以减少对目标网站服务器的压力,并降低被识别为爬虫的风险。

二、Selenium防爬设置

1. 修改User-Agent

在Selenium中,可以通过设置ChromeOptions或FirefoxOptions来修改User-Agent。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options# Chrome浏览器
chrome_options = Options()
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36')
driver = webdriver.Chrome(options=chrome_options)# Firefox浏览器(类似设置)
# from selenium.webdriver.firefox.options import Options
# firefox_options = Options()
# firefox_options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36')
# driver = webdriver.Firefox(options=firefox_options)

2. 设置浏览器窗口大小

driver.set_window_size(1280, 1024)  # 设置浏览器窗口大小为1280x1024

3. 禁用图片加载(Chrome为例)

chrome_prefs = {}
chrome_options.add_experimental_option("prefs", chrome_prefs)
chrome_prefs["profile.default_content_settings.images"] = 2  # 2代表禁用图片

注意:Chrome的最新版本可能不支持通过这种方法直接禁用图片加载,需要寻找其他方法或使用浏览器插件。

4. 使用代理IP(需额外库支持,如selenium-wire)

由于Selenium本身不直接支持代理设置,可以使用第三方库如selenium-wire来实现。

from seleniumwire import webdriverdriver = webdriver.Chrome()
driver.options.add_argument('--proxy-server=http://your-proxy-server:port')
# 注意:selenium-wire的使用方式可能与原生Selenium有所不同,具体请参考其文档

5. 模拟用户行为(示例:模拟点击)

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 假设已经定位到一个可点击的元素
element = driver.find_element(By.ID, "clickable-element")
element.click()# 等待页面加载完成(示例)
wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located((By.ID, "some-other-element")))

6. 增加请求间隔

增加请求间隔是防止因过于频繁地发送请求而被目标网站识别为爬虫的有效手段。在Selenium脚本中,你可以使用Python的time模块中的sleep()函数来实现这一点。然而,过度依赖sleep()可能会导致脚本运行效率低下,因为无论目标网站是否已准备好响应,脚本都会等待指定的时间。

一个更优化的做法是使用Selenium的显式等待(Explicit Wait)功能,它允许你等待某个条件成立后再继续执行脚本,而不是简单地等待一段时间。显式等待通过WebDriverWait类和一系列预定义的等待条件(如元素可见性、可点击性等)来实现。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import timedriver = webdriver.Chrome()
driver.get("你的网页URL")# 使用显式等待等待某个元素可见
try:element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "someElementId")))# 对元素进行操作...element.click()
except Exception as e:print(e)# 在需要的时候使用time.sleep()增加额外的延迟
# 例如,在两次请求之间等待
time.sleep(2)  # 等待2秒# 继续执行其他操作...# 脚本结束前关闭浏览器
driver.quit()

7. 伪装浏览器指纹

浏览器指纹是指浏览器在访问网站时展现的一系列特征,如操作系统、浏览器类型、分辨率、字体列表、插件列表等。这些特征可以被网站用来识别用户或区分爬虫与真实用户。为了伪装浏览器指纹,可以使用一些高级技术,如使用Selenium WebDriver的模拟浏览器指纹插件或自行修改WebDriver的源代码。

然而,这些方法通常比较复杂且需要较高的技术门槛,且随着网站反爬虫技术的升级,伪装浏览器指纹的有效性也会逐渐降低。

8. 遵守robots.txt协议

虽然Selenium主要用于自动化测试和爬虫开发,但如果你正在使用Selenium来抓取网站数据,那么遵守该网站的robots.txt协议是非常重要的。robots.txt文件是一个文本文件,它告诉搜索引擎哪些页面可以抓取,哪些不可以。虽然robots.txt协议主要针对搜索引擎,但遵守它也是对网站所有者权益的尊重,并有助于避免法律纠纷。

9. 监控与调试

在开发Selenium脚本时,监控和调试是必不可少的环节。你可以使用Selenium的日志功能来记录脚本运行过程中的详细信息,或者使用浏览器的开发者工具来调试页面和脚本。此外,还可以使用一些第三方工具来监控网络请求和响应,以便及时发现和解决问题。

三、Selenium自动化防爬参数配置

为了避免Chrome浏览器在自动化测试时显示被控制的提示,可以通过配置add_argument来实现。

1、禁用自动化检测功能

import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionschrome_options = Options()
# 禁用浏览器自动化检测功能,使浏览器无法检测到它是被自动化工具控制的。
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
# 启动Chrome浏览器
driver = webdriver.Chrome(options=chrome_options)
#打开网站
driver.get('https://www.baidu.com/')
#等待10秒(非必须,只是为了演示)
time.sleep(10)
# 关闭浏览器
driver.quit()

"--disable-blink-features=AutomationControlled" 是一个传递给Chrome浏览器的命令行参数,其目的是为了绕过或禁用Chrome浏览器内置的一种自动化检测机制。

Chrome浏览器(及其底层的Blink渲染引擎)包含一些用于检测浏览器是否被自动化工具(如Selenium WebDriver)控制的特性。这些特性可以帮助网站区分真正的用户访问和自动化脚本的访问。当检测到自动化工具时,网站可能会采取一些措施,如限制访问、增加验证码等,来防止自动化脚本的滥用。

"--disable-blink-features=AutomationControlled" 参数的作用就是尝试禁用这种自动化检测特性。通过禁用这个特性,你的Selenium自动化脚本可能能够更顺利地模拟用户行为,而不被网站的反爬机制轻易识别出来。

然而,需要注意的是,这种方法的有效性可能会随着Chrome浏览器版本的更新而变化。Chrome浏览器的开发者可能会修复或改进这些特性,以更好地检测和阻止自动化脚本。因此,如果你发现这个参数不再有效,可能需要寻找其他方法或等待Selenium的更新来支持新的反检测策略。

2、禁用Chrome的自动化扩展

import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 禁用Chrome的自动化扩展,这有助于减少被检测到的风险。
chrome_options.add_experimental_option('useAutomationExtension', False)
# 启动Chrome浏览器
driver = webdriver.Chrome(options=chrome_options)
#打开网站
driver.get('https://www.baidu.com/')
#等待10秒(非必须,只是为了演示)
time.sleep(10)
# 关闭浏览器
driver.quit()

useAutomationExtension的作用是尝试禁用或绕过浏览器内部与自动化工具检测相关的某种机制或扩展。通过将 useAutomationExtension 设置为 False,代码试图告诉浏览器不要使用或加载与自动化控制相关的特定扩展或功能。

3、关闭浏览器显示正受到自动化的控制

使用参数之前

使用参数之后

浏览器不再显示正受到自动测试软件的控制

import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 从Chrome的启动参数中排除enable-automation开关,进一步防止浏览器显示被控制的提示。
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 启动Chrome浏览器
driver = webdriver.Chrome(options=chrome_options)
#打开网站
driver.get('https://www.baidu.com/')
#等待10秒(非必须,只是为了演示)
time.sleep(10)
# 关闭浏览器
driver.quit()

enable-automation是Chrome的一个内部标志,当ChromeDriver启动Chrome浏览器时,它通常会被自动启用。这个标志的存在可能会告诉网站或网页上的脚本,浏览器正在被自动化工具控制。一些网站会使用这种检测机制来阻止自动化脚本的执行,或者提供与正常用户不同的体验。

通过excludeSwitches选项排除enable-automation,你试图让浏览器在启动时表现得更加“正常”,即不向网站透露它正在被自动化工具控制。这有助于绕过一些基于enable-automation标志存在的自动化检测机制。

然而,需要注意的是,这种方法的有效性可能会随着Chrome和ChromeDriver的更新而发生变化。浏览器开发者可能会不断改进其自动化检测机制,使得基于排除特定开关的方法来绕过检测变得不再有效。

4、启用无头模式

import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 启用无头模式,使Chrome在后台运行,没有可视化窗口。这不仅可以避免被检测,还可以提高测试效率,因为不需要加载和渲染UI界面。
chrome_options.add_argument("--headless") 
# 启动Chrome浏览器
driver = webdriver.Chrome(options=chrome_options)
#打开网站
driver.get('https://www.baidu.com/')
#等待10秒(非必须,只是为了演示)
time.sleep(10)
# 关闭浏览器
driver.quit()

"--headless" 是一个命令行参数,用于指示浏览器在无头(headless)模式下运行。在无头模式下,浏览器不会显示图形用户界面(GUI),即它不会在屏幕上显示窗口。这意味着浏览器可以在没有物理显示的情况下运行,这对于自动化测试、服务器端渲染、爬虫等场景非常有用,因为它们不需要图形界面来执行任务。

使用 options.add_argument("--headless") 配置浏览器后,当你启动浏览器时,它将在无头模式下运行,执行你指定的任务,但不会显示任何窗口或界面。这对于自动化脚本来说非常有用,因为它可以减少对系统资源的需求(如屏幕和图形处理),并且可以在没有图形界面的服务器或容器中运行。

5、禁用GPU加速

import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 在某些情况下,特别是Linux系统上,可能需要禁用GPU加速,以确保无头模式能正常工作。
chrome_options.add_argument("--disable-gpu")  
# 启动Chrome浏览器
driver = webdriver.Chrome(options=chrome_options)
#打开网站
driver.get('https://www.baidu.com/')
#等待10秒(非必须,只是为了演示)
time.sleep(10)
# 关闭浏览器
driver.quit()

"--disable-gpu" 是一个命令行参数,用于指示Chrome浏览器在启动时禁用GPU加速。GPU加速是浏览器利用计算机的图形处理单元(GPU)来加速页面渲染和图形密集型任务的过程。然而,在某些情况下,GPU加速可能会导致问题,如性能下降、崩溃或渲染错误。

通过在ChromeOptions中添加"--disable-gpu"参数,你告诉浏览器在启动时不要使用GPU加速。这通常用于解决与GPU相关的兼容性问题或性能问题,特别是在自动化测试、远程桌面会话、虚拟机或某些特定的硬件配置上。

四、结尾

通过这篇文章给大家分享我在学习过程中的一些经验和心得,希望能够对大家有所帮助,同时也接受大家的建议和意见,共同进步、共同学习。

如果你觉得我的文章对你有所帮助,我诚挚地邀请你关注、点赞和分享。

相关文章:

Selenium自动化防爬技巧:从入门到精通,保障爬虫稳定运行,通过多种方式和add_argument参数设置来达到破解防爬的目的

在Web自动化测试和爬虫开发中,Selenium作为一种强大的自动化工具,被广泛用于模拟用户行为、数据抓取等场景。然而,随着网站反爬虫技术的日益增强,直接使用Selenium很容易被目标网站识别并阻止。因此,掌握Selenium的防爬…...

从数据类型到变量、作用域、执行上下文

从数据类型到变量、作用域、执行上下文 JS数据类型 分类 1》基本类型:字符串String、数字Number、布尔值Boolean、undefined、null、symbol、bigint 2》引用类型:Object (Object、Array、Function、Date、RegExp、Error、Arguments) Symbol是ES6新出…...

一文读懂:AI时代到底需要什么样的网络?

各位小伙伴们大家好哈,我是老猫。 今天跟大家来聊聊数据中心网络。 提到网络,通常把网络比作高速公路,网卡相当于上下高速公路的闸口,数据包就相当于运送数据的汽车,交通法规就是“传输协议”。 如高速公路也会堵车一…...

基于HarmonyOS的宠物收养系统的设计与实现(一)

基于HarmonyOS的宠物收养系统的设计与实现(一) 本系统是简易的宠物收养系统,为了更加熟练地掌握HarmonyOS相关技术的使用。 项目创建 创建一个空项目取名为PetApp 首页实现(组件导航使用) 官方文档:组…...

严格模式报错

部分参考: Android内存泄露分析之StrictMode - 星辰之力 - 博客园 (cnblogs.com)...

nginx: [emerg] the “ssl“ parameter requires ngx_http_ssl_module in nginx.conf

nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:42 查看/usr/local/nginx/conf/nginx.conf文件第42行数据: listen 443 ssl; # server中的配置 原因是:nginx缺少 http_ssl_modul…...

Docker 部署loki日志 用于微服务

因为每次去查看日志都去登录服务器去查询相关日志文件,还有不同的微服务,不同日期的文件夹,超级麻烦,因为之前用过ELK,原本打算用ELK,在做技术调研的时候发现了一个轻量级的日志系统Loki,果断采…...

[Day 57] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的零知識證明技術 一、引言 隨著區塊鏈技術的不斷發展,如何在保護用戶隱私的同時確保數據的完整性和可信度成為了研究的焦點。零知識證明(Zero-Knowledge Proof,ZKP)技術就是其中的一項關鍵技術,它允許一方在不…...

06结构型设计模式——代理模式

一、代理模式简介 代理模式(Proxy Pattern)是一种结构型设计模式(GoF书中解释结构型设计模式:一种用来处理类或对象、模块的组合关系的模式),代理模式是其中的一种,它可以为其他对象提供一种代…...

《深入浅出多模态》(九)多模态经典模型:MiniGPT-v2、MiniGPT5

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…...

调试和优化大型深度学习模型 - 0 技术介绍

调试和优化大型深度学习模型 - 0 技术介绍 flyfish LLaMA Factory LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上…...

华为S3700交换机配置VLAN的方法​

1.VLAN的详细介绍 VLAN(Virtual Local Area Network)即虚拟局域网,是一种将一个物理的局域网在逻辑上划分成多个广播域的技术。 1.1基本概念 1)作用: 隔离广播域:通过将网络划分为不同的 VLAN,广播帧只会在同一 VLAN 内传播,而不会扩散到其他 VLAN 中,从而有效…...

学懂C++(三十八):深入详解C++网络编程:套接字(Socket)开发技术

目录 一、概述与基础概念 1.1 套接字(Socket)概念 1.2 底层原理与网络协议 1.2.1 网络协议 1.2.2 套接字工作原理 二、C套接字编程核心技术 2.1 套接字编程的基本步骤 2.2 套接字编程详细实现 2.2.1 创建套接字 2.2.2 绑定地址 2.2.3 监听和接…...

SpringBoot-配置加载顺序

目录 前言 样例 内部配置加载顺序 ​ 样例 小结 前言 我之前写的配置文件,都是放在resources文件夹,根据当前目录下,优先级的高低,判断谁先被加载。但实际开发中,我们写的配置文件并不是,都放…...

第八周:机器学习笔记

第八周机器学习笔记 摘要Abstract机器学习1. 鱼和熊掌和可兼得的机器学习1.1 Deep network v.s. Fat network 2. 为什么用来验证集结果还是不好? Pytorch学习1. 卷积层代码实战2. 最大池化层代码实战3. 非线性激活层代码实战 总结 摘要 本周学习对李宏毅机器学习视…...

音乐怎么剪切掉一部分?5个方法,轻松学会音频分割!(2024全新)

音乐怎么剪切掉一部分?音频文件是娱乐和创作的重要基础。音频在我们日常生活中发挥着重要作用,从音乐播放列表到有趣的视频,它无处不在。无论是音乐爱好者还是内容创作者,我们常常需要对音频文件进行剪切和编辑。想象一下&#xf…...

洛谷 CF295D Greg and Caves

题目来源于:洛谷 题目本质:动态规划dp,枚举 解题思路:将整个洞分成两半,一半递增,一半递减。我们分别 DP 求值,最后合并。状态转移方程为:dpi,j​k2∑j​(j−k1)dpi−1,k​1。枚举极…...

【图像处理】在图像处理算法开发中,有哪些常见的主观评价指标和客观评价指标?

主观评价指标 在图像处理算法开发中,主观评价指标依赖于观察者的个人感受和判断,通常用于评估图像的视觉质量。以下是一些常见的主观评价指标: 平均意见分数 (Mean Opinion Score, MOS):通过收集多个评价者的评分并计算平均值来评…...

从零开始学cv-6:图像的灰度变换

文章目录 一,简介:二、图像的线性变换三、分段线性变换四,非线性变换4.1 对数变换4.2 Gamma变换 五,效果: 一,简介: 图像灰度变换涉及对图像中每个像素的灰度值执行数学运算,进而调整图像的视觉…...

使用Apache POI和POI-OOXML实现word模板文档自动填充功能

最近接到一个新的需求&#xff0c;用户创建好模板文件保存到模板库&#xff0c;然后使用在线文档编辑器打开模板时&#xff0c;将系统数据填充到模板文件并生成新的word文件&#xff0c;然后在线编辑&#xff0c;研究使用Apache POI和POI-OOXML实现了这个功能。 Maven依赖 <…...

【HarmonyOS NEXT星河版开发学习】综合测试案例-各平台评论部分

目录 前言 功能展示 整体页面布局 最新和最热 写评论 点赞功能 界面构建 初始数据的准备 列表项部分的渲染 底部区域 index部分 知识点概述 List组件 List组件简介 ListItem组件详解 ListItemGroup组件介绍 ForEach循环渲染 列表分割线设置 列表排列方向设…...

垂直行业数字化表现抢眼 亚信科技全年利润展望乐观

大数据产业创新服务媒体 ——聚焦数据 改变商业 2024年8月14日&#xff0c;亚信科技控股有限公司&#xff08;股票代码&#xff1a;01675.HK&#xff09;公布了公司截至2024年6月30日的中期业绩。 财报数据显示&#xff0c;2024年上半年&#xff0c;亚信科技的营业收入为人民币…...

EmguCV学习笔记 VB.Net 4.1 颜色变换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问&#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问&#xff1a;EmguCV学习笔记 C# 目录-CSD…...

【MySQL进阶之路】表结构的操作

目录 创建表 查看表 查看数据库有哪些表 查看表结构 查看表的详细信息 修改表 表的重命名 添加一列 修改某一列的属性 删除某一列 对列进行重命名 删除表 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 【MySQL进阶之路】MySQL基础——从零认识MySQL-CSDN博客 创…...

3分钟搞定PDF转PPT!你一定要知道的3款转换神器!

在数字办公成为主流的当下&#xff0c;我们每天会收到各类基于数字化方式存储的办公文档&#xff0c;如PDF、PPT、Word、Excel文档等。 日常处理这些文档时&#xff0c;经常需要在不同格式的文档之间进行切换和转换&#xff0c;其中将PDF转换为PPT就是一个非常高频的需求&…...

【EasyExcel】导出excel-设置动态表头并导出数据

需求背景&#xff1a; 导出excel的设置某些表头动态导出(可以根据筛选条件或一些属性的数据量)&#xff0c;方便导出后用户查看想看的信息。 一、技术选型&#xff1a; easyExcel的原生数据处理 二、方案设计&#xff1a; 根据EasyExcel支持的表头List<List<String>…...

深入探索 Elasticsearch 8:新特性与核心原理剖析(上)

深入探索 Elasticsearch 8&#xff1a;新特性与核心原理剖析 目录 一、引言 &#xff08;二&#xff09;版本 8 的重要意义 二、Elasticsearch 8 的新特性 三、Elasticsearch 的核心原理 一、引言 &#xff08;一&#xff09;Elasticsearch 简介 在大数据处理和搜索领域…...

瑜伽馆预约小程序,在线预约,提高商业价值

随着大众生活质量的提高&#xff0c;对休闲运动的关注逐渐加大&#xff0c;瑜伽作为一种身心放松、改善体态的运动&#xff0c;深受女性用户的喜爱。目前&#xff0c;各大瑜伽馆开始结合数字化&#xff0c;建立了新型的线上小程序&#xff0c;帮助大众快速预约体验瑜伽&#xf…...

Python--数据类型转换

在Python中&#xff0c;数据类型的转换是一个常见的操作&#xff0c;涉及将一种数据类型转换为另一种数据类型。Python提供了多种内置函数用于执行这种转换&#xff0c;如 int()、str()、float()、list()、tuple()、set()、dict() 等。下面详细讨论Python的基本数据类型及它们之…...

域控ntdsutil修改架构、域命名、PDC、RID、结构主机

#笔记记录# FSMO盒修改 1、提示访问特权不够&#xff0c;不能执行该操作&#xff0c;0x2098 清除缓存账号密码并修改新架构管理员账号密码即可。 背景&#xff1a;更替架构主机、域命名主机 C:\Windows\system32>ntdsutil ntdsutil: roles fsmo maintenance: ?? …...

解决 Swift 6 全局变量不能满足并发安全(concurrency-safe)读写的问题

概述 WWDC 24 终于在 Swift 十岁生日发布了全新的 Swift 6。这不仅意味着 Swift 进入了全新的“大”版本时代&#xff0c;而且 Swift 编译器终于做到了并发代码执行的“绝对安全”。 不过&#xff0c;从 Swift 5 一步迈入“新时代”的小伙伴们可能对新的并发检查有些许“水土不…...

迈入退休生活,全职开发ue独立游戏上架steam

决定退休了。算了算睡后收入&#xff0c;也可以达到每月一万一&#xff0c;正好可以养家糊口。 既然退休了&#xff0c;那就做些想做的事情&#xff0c;别人养花养草&#xff0c;而我打算开发独立游戏上架steam。 一&#xff0c;盘点下目前的技术体系。 1&#xff0c;图形学底…...

什么是光伏气象站——仁科测控

【仁科测控&#xff0c;品质保障】光伏气象站&#xff0c;‌这一专门为光伏发电系统设计的监测设备&#xff0c;‌其核心能力在于精确且实时地捕捉那些对光伏发电效率产生关键影响的气象因素。‌这些数据不仅为评估光伏电站的发电性能提供了重要依据&#xff0c;‌更是优化运维…...

webshell免杀--免杀入门

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理webshell免杀的一些基础思路 入门级&#xff0c;不是很深入&#xff0c;主要是整理相关概念 免杀对象 1.各类杀毒软件 类似360&#xff0c;火绒等&#xff0c;查杀己方webshell的软件。 2.各类流量…...

Linux---02---系统目录及文件基本操作命令

课程回顾 操作系统 虚拟机安装 本章重点 Linux系统目录结构 常用命令 熟练区分Linux下各层目录的作用 熟练掌握Linux的常用命令&#xff08;文件命令、时间命令等&#xff09; 一、Linux系统目录结构 1.1 目录结构 /&#xff1a; 根目录&#xff0c;一般根目录下只存放…...

CSP-J/S第一轮初赛模拟赛试题

本模拟试题为本人自创&#xff0c;由于发布在 LG 所以就直接放入链接。 非经允许&#xff0c;不得转载。 本套模拟题只供大家练习使用&#xff0c;不保证难度与真实 CSP-J/S 完全符合。 本模拟赛为专业CSP类型的模拟赛&#xff0c;不存在错题、超出知识的题目。 CSP-J/S 20…...

LangGPT结构化提示词

LangGPT是Language For GPT-like LLMs的简称&#xff0c;中文名为结构化提示词&#xff0c;LangGPT是一个帮助你编写高质量提示词的工具&#xff0c;理论基础是我们提出的一套模块化、标准化的提斯提编写方法论——结构化提示词。我们希望揭开提示工程的神秘面纱&#xff0c;为…...

如何为个人网站更换ssl证书

关键步骤 1&#xff0c;确认服务器类型并下载对应证书&#xff08;这个超级简单&#xff0c;阿里云现在可以下3月免费的&#xff09;&#xff1b; 2&#xff0c;本文以nginx服务为例&#xff0c;主打的就是一个简单且快速让你搞清楚实操流程&#xff1b; linux命令 ps-ef|gr…...

RabbitMQ-消息队列延迟队列一

1、安装rabbitmq 怎么安装rabbitmq请查看之前课程&#xff0c;如果已经安装&#xff0c;请略过此步。 2、创建vendor文件夹或是直接采用PHP框架 mkdir vendor 3、进入文件 cd vendor 4、安装php扩展 composer require php-amqplib/php-amqplib 5、进入上级创建dead文件…...

JavaScript中普通对象和Map对象的区别

在JavaScript中&#xff0c;普通对象&#xff08;{}&#xff09;和 Map 对象都是用于存储键值对的数据结构&#xff0c;但是他们有一些区别。 1. 键的类型 普通对象&#xff1a; 对象的键必须是字符串或 Symbol 类型。其他类型的值&#xff08;如数字、布尔值、对象等&#x…...

Liunx搭建Rustdesk远程桌面服务

1、环境准备 Linux&#xff1a;centos7.9 rustdesk server安装包 很多新服务器并没有 wget 和unzip 可以通过yum自行安装下&#xff0c;如果系统中有wget但不能使用&#xff0c;直接卸载重装即可。 yum install wget wget --no-check-certificate https://github.com/rust…...

antv X6--实现节点旁添加多个text标签

前言&#xff1a;接本专栏上篇文章&#xff0c;实现一个新需求&#xff0c;如有不懂的可先去看新手教程 需求描述&#xff1a;如何在节点旁添加多个标签&#xff0c;如下图所示&#xff1a; 实现该需求目前我只想到两种方法&#xff1a; 方法一&#xff1a;使用换行符将不同的…...

JAVA--多线程

Java中的多线程是指在同一个Java虚拟机&#xff08;JVM&#xff09;中并发执行多个线程的能力。线程是程序执行的最小单元&#xff0c;Java提供了丰富的API来创建和管理线程。以下是Java中实现多线程的一些关键概念和方法&#xff1a; Thread 类&#xff1a;Java提供了Thread类…...

ADB-DROM

# 读硬件信息 adb shell "cat /sys/block/mmcblk0/device/name" # MT6767/MT6768/MT6769/MT6762/MT6765/MT6761... # 频率档位 # 固定频率 adb shell "echo 0 > /sys/devices/platform/10012000.dvfsrc/helio-dvfsrc/dvfsrc_force_vcore_dvfs_opp" # …...

mysql 之 explain

1. 查看表的创建字段以及索引情况 show create table user_recommend; 2. 创建索引的原则&#xff1a;列的值比较离散 像性别字段&#xff0c;只有男&#xff0c;女 或者其他&#xff1b;expose字段&#xff0c;只有1分发&#xff0c;0不可分发。就不适宜在这种字段上添加索引…...

CentOS迁移案例 | 保障轨道交通安全、发挥基础设施效能,麒麟信安操作系统支撑某市轨道交通畅行无忧

为缓解城市交通拥堵难题&#xff0c;某市轨道交通公司计划新建一条贯穿城市关键区域、沿路设立20座站点的轨道交通线路&#xff0c;并基于麒麟信安操作系统构建轨道交通信号系统。 轨道交通信号系统是列车核心控制系统&#xff0c;负责列车运行的自动化控制&#xff0c;及对整…...

获取操作系统的信息(Go语言)

在 Go 语言中&#xff0c;你可以使用 runtime 和 os 包来查看操作系统的信息。以下是一些常见的操作系统信息获取方法&#xff1a; 1. 获取操作系统类型和架构信息 Go 的 runtime 包提供了基本的操作系统和架构信息&#xff1a; package mainimport ("fmt""r…...

【论文阅读】HuatuoGPT-II, One-stage Training for Medical Adaption of LLMs

总体概要 本文深入探讨了一款专为医疗领域设计的大规模语言模型——HuatuoGPT-II的创新、性能与应用。HuatuoGPT-II采用统一的单阶段训练流程&#xff0c;将传统的继续预训练和监督微调整合&#xff0c;有效解决了医疗数据的异质性问题&#xff0c;包括语言、体裁和格式差异&a…...

Excel表列序号

题目 给定一个Excel表格中的列名称&#xff0c;返回其相应的列序号。 例如&#xff0c; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...示例 1: 输入: "A" 输出: 1示例 2: 输入: "AB" 输出: 28示例 3: 输入: "ZY&…...

IOS 03 纯代码封装自定义View控件

本节将通过纯代码进行封装自定义View控件&#xff0c;以常用的设置页的item为例&#xff0c;实现UI效果如下&#xff1a; 1、创建SettingView继承自UIView import UIKitclass SettingView: UIView {} 2、重写 init() 和 required init?(coder: NSCoder) 方法 纯代码创建Set…...