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

Python爬虫第3节-会话、Cookies及代理的基本原理

目录

一、会话和Cookies

1.1 静态网页和动态网页

1.2 无状态HTTP

1.3 常见误区

二、代理的基本原理

2.1 基本原理

2.2 代理的作用

2.3 爬虫代理

2.4 代理分类

2.5 常见代理设置


一、会话和Cookies

        大家在浏览网站过程中,肯定经常遇到需要登录的场景。有些页面限制访问,只有登录后才能打开,而且登录一次后,能连续多次访问网站。不过,有时候隔了一段时间,就又得重新登录。还有一些网站更方便,打开浏览器就自动完成登录,很长时间内都不会失效。这究竟是什么原因呢?实际上,这些现象背后,都和会话(Session)以及Cookies的知识有关。接下来这一节,咱们就一起深入了解一下。

1.1 静态网页和动态网页

        在正式了解会话和Cookies之前,我们得先清楚静态网页和动态网页的概念。这里还是用前面的示例代码:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>This is a Demo</title>
</head>
<body><div id="container"><div class="wrapper"><h2 class="title">Hello World</h2><p class="text">Hello,this is a paragraph.</p></div></div>
</body>
</html>

        先把这段基础的HTML代码保存成.html文件,接着将文件放到一台有固定公网IP的主机上。在这台主机上安装Apache或者Nginx这类服务器软件,如此一来,这台主机就能充当服务器了。其他人只要访问这台服务器,就能看到对应的网页,这样一个最简单的网站就搭建好了。

        这种网页的内容都是用HTML代码编写的,网页上的文字、图片等,都由提前写好的HTML代码确定,我们把这类网页称作静态网页。静态网页加载速度快,编写也容易,可它有不少缺点。比如,后期维护起来比较麻烦,而且不能根据URL的变化,灵活展示不同内容。举个例子,要是想在网页URL里传入一个name参数,让网页显示这个参数的内容,静态网页就实现不了。

        为了解决这些问题,动态网页应运而生。动态网页可以解析URL里参数的变化,还能和数据库关联,根据不同情况展示不一样的页面内容,十分灵活。如今,我们日常接触的大多数网站都是动态网站。它们不再局限于简单的HTML页面,而是用JSP、PHP、Python等编程语言开发的,功能比静态网页丰富、强大得多。

        另外,动态网站还支持用户登录和注册功能。回到开头提到的,很多网页得登录后才能访问。正常情况下,输入用户名和密码登录成功后,肯定获取了某种类似凭证的东西,凭借它,我们才能维持登录状态,访问那些限制登录后才能查看的页面。

        那么,这个神秘的凭证到底是什么呢?实际上,它是会话和Cookies协同工作产生的结果。接下来,咱们就深入探究一番。

1.2 无状态HTTP

        在深入了解会话和Cookies之前,我们得先掌握HTTP的一个特性,那就是无状态。

        所谓HTTP的无状态,也就是说HTTP协议在处理事务时,没有记忆的能力。直白点讲,服务器是不知道客户端处于什么状态的。当我们向服务器发送请求后,服务器会对请求进行解析,然后返回对应的响应。而且这个过程是完全独立的,服务器不会去记录前后状态的变化情况,缺少对状态的记录。这就导致了一个问题,如果后续的处理需要用到前面的信息,那就必须重新传输,这样就需要额外地发送一些重复的请求,才能获取到后续的响应。很明显,这种情况并不是我们想要的。为了能保持前后状态的连贯性,我们肯定不能把前面的请求全部再重传一遍,这样做太浪费资源了,特别是对于那些需要用户登录的页面来说,这种重传的方式就更不合适了。

        在这种情况下,有两种能够保持HTTP连接状态的技术就出现了,它们分别是会话和Cookies。会话是保存在服务端的,也就是网站的服务器上,主要用来保存用户的会话信息;而Cookies则保存在客户端,也就是我们使用的浏览器端。当浏览器有了Cookies后,下次再去访问网页时,就会自动把Cookies附带上发送给服务器。服务器通过对Cookies的识别,就能确定是哪个用户,然后进一步判断这个用户是不是处于登录状态,最后再返回相应的响应。

        我们可以把Cookies理解成是保存了登录的凭证。有了这个凭证,下次发送请求的时候,只要带着Cookies就行了,不需要再重新输入用户名、密码这些信息来重新登录。

        所以在开发爬虫的时候,要是遇到那些需要登录才能访问的页面,我们一般会把登录成功后获取到的Cookies放在请求头里面,直接发送请求,这样就不用再重新去模拟登录的过程了。

在知道了会话和Cookies的概念之后,下面我们就来详细地分析一下它们各自的原理。
(1)会话
        会话,从原本的意思来讲,就是指一系列有开始也有结束的动作或者消息。就好比我们打电话,从拿起电话拨号开始,一直到挂断电话这一整个过程,就可以被称作是一个会话。

        在Web应用里,会话对象的作用是用来存储特定用户在会话过程中所需要的属性以及配置信息。这样一来,当用户在应用程序的各个Web页面之间进行跳转的时候,存储在会话对象里面的变量是不会丢失的,会在整个用户会话期间一直存在。当用户请求应用程序的Web页面时,如果这个用户之前还没有会话,那么Web服务器就会自动创建一个会话对象。而当会话过期了或者被用户放弃了之后,服务器就会终止这个会话。
(2)Cookies
        Cookies其实就是某些网站为了能够辨别用户的身份,以及对会话进行跟踪,而存储在用户本地终端上的数据。
        - 会话维持:那么,我们到底是怎么利用Cookies来保持状态的呢?当客户端第一次向服务器发送请求的时候,服务器会返回一个请求头中带有Set-Cookie字段的响应给客户端,这个字段就是用来标记是哪个用户的,客户端的浏览器会把这些Cookies保存下来。等到浏览器下一次再去请求这个网站的时候,就会把这些Cookies放到请求头里面,一起提交给服务器。因为Cookies里面携带了会话ID的信息,所以服务器检查这些Cookies之后,就能找到对应的会话,然后再判断用户的状态。

        当我们成功登录某个网站的时候,服务器会告诉客户端需要设置哪些Cookies信息。在后续访问页面的时候,客户端就会把Cookies发送给服务器,服务器找到对应的会话并进行判断。要是会话中一些用来标记登录状态的变量是有效的,那就说明用户是处于登录状态的,服务器就会返回那些只有登录之后才能查看的网页内容,浏览器对这些内容进行解析之后,我们就能看到相应的页面了。

        反过来,如果传给服务器的Cookies是无效的,又或者会话已经过期了,那我们就没办法继续访问页面了,这个时候可能会收到错误的响应,或者会被跳转到登录页面,要求我们重新登录。

        所以说,Cookies和会话是需要相互配合的,一个在客户端,一个在服务端,它们共同协作,才实现了对登录会话的控制。

        - 属性结构:接下来我们看看Cookies具体都包含哪些内容。就拿百度来举例吧,在浏览器的开发者工具中打开Application选项卡,在左侧的Storage部分,最后一项就是Cookies,把它点开之后,就能看到相关的Cookies信息了,就像下图所展示的那样。

        这里面有很多条目,每一个条目都可以看作是一个Cookie,它有以下几个属性:
        - Name:这是Cookie的名称。一旦创建好了,这个名称就不能再更改了。
        - Value:这是Cookie的值。如果这个值是Unicode字符的话,就需要进行字符编码;要是值是二进制数据,那就需要用BASE64编码。
        - Domain:指的是可以访问这个Cookie的域名。比如说,如果设置成了.zhihu.com,那么所有以zhihu.com结尾的域名都可以访问这个Cookie。
        - MaxAge:这是Cookie失效的时间,单位是秒,它经常会和Expires一起使用,通过它可以计算出Cookie的有效时间。当MaxAge是正数的时候,这个Cookie会在MaxAge秒之后失效;要是MaxAge是负数,那么关闭浏览器的时候,这个Cookie就会失效,而且浏览器也不会保存这个Cookie。
        - Path:这是Cookie的使用路径。要是设置成了/path/,那就只有路径为path/的页面才可以访问这个Cookie;要是设置成了/,那么本域名下的所有页面都能访问这个Cookie。
        - Size字段:表示的是这个Cookie的大小。
        - HTTP字段:指的是Cookie的httponly属性。如果这个属性是true,那么只有在HTTP头中才会带有这个Cookie的信息,没办法通过document.cookie来访问这个Cookie。
        - Secure:这个属性是说该Cookie是不是只能通过安全协议来传输。像HTTPS和SSL等都是安全协议,在网络上传输数据之前会先对数据进行加密,这个属性默认是false。
        - 会话Cookie和持久Cookie:从表面上看,会话Cookie是存储在浏览器的内存里面的,一旦关闭浏览器,这个Cookie就会失效;而持久Cookie则会被保存到客户端的硬盘中,下次还能继续使用,能够长时间地保持用户的登录状态。但实际上,严格来讲,并没有明确区分会话Cookie和持久Cookie,它们的过期时间其实是由Cookie的MaxAge或者Expires字段来决定的。

        所以,有些支持持久化登录的网站,会把Cookie的有效时间和会话的有效期设置得比较长。这样一来,下次我们再去访问页面的时候,只要还带着之前的Cookie,就可以直接保持登录状态了。

1.3 常见误区

        在探讨会话机制时,不少人存在一个误解,觉得“只要关闭浏览器,会话就会消失”。打个比方,以会员卡为例,通常情况下,除非顾客主动要求店家注销会员卡,否则店家不会随意删除顾客的资料。会话机制也是同样的道理,除非程序指令服务器删除会话,不然服务器会一直保存会话数据。比如当我们执行注销操作时,程序就会删除对应的会话。

        当我们关闭浏览器时,浏览器并不会在关闭前告知服务器它即将关闭,因此服务器无从得知浏览器已经关闭。大家之所以会产生“关闭浏览器会话就消失”这种错觉,是因为大多数会话机制采用会话Cookie来存储会话ID信息。关闭浏览器后,这些Cookie就会消失,再次连接服务器时,自然无法找到之前的会话。但是,如果服务器设置将Cookie保存到硬盘上,又或者通过某些技术手段修改浏览器发出的HTTP请求头,让浏览器再次向服务器发送原来的Cookie,那么再次打开浏览器访问服务器时,依然能够找到原来的会话ID,进而保持登录状态。

        也正因为关闭浏览器不会直接致使会话被删除,所以服务器需要为会话设置一个失效时间。当客户端距离上一次使用会话的时间超过这个设定的失效时间,服务器便会判定客户端已停止活动,从而删除会话,以此节省存储空间。

二、代理的基本原理

        在编写爬虫程序时,大家常常会碰到这样的状况。刚开始,爬虫能够正常运转,顺利抓取数据。但没过多久,程序可能就会报错,最常见的就是403 Forbidden错误。这时候打开对应的网页,可能会看到“您的IP访问频率太高”的提示。出现这种情况,是因为网站采用了反爬虫手段。网站服务器会监测某个IP在一定时间内的请求次数,一旦请求次数超过预先设定的阈值,服务器就会直接拒绝服务,返回错误信息,这就是我们常说的封IP。

        既然服务器是依据IP在单位时间内的请求次数来进行检测的,那只要想办法伪装我们的IP地址,让服务器无法察觉请求来自本地,不就能避免IP被封了吗?

        使用代理就是一种行之有效的办法。后续,我们会详细讲解代理的使用方法。在此之前,我们有必要先了解代理的基本原理,弄清楚它究竟是如何实现IP伪装的。

2.1 基本原理

        代理,说的就是代理服务器,英文叫proxy server。它能代替网络用户去获取网络信息,打个比方,它就像网络信息的“中转站”。

        平常我们访问网站时,会直接给Web服务器发送请求,Web服务器处理后,把响应结果回传给我们。要是设置了代理服务器,就如同在我们自己的设备和Web服务器之间架起了一座“桥”。这时候,我们的设备不再直接向Web服务器发起请求,而是将请求发送给代理服务器。代理服务器收到请求后,再把它转交给Web服务器。Web服务器处理完请求,将响应返回给代理服务器,代理服务器又会把响应转发给我们的设备。

        通过这样的流程,我们依旧可以正常浏览网页。而且,Web服务器识别出的IP是代理服务器的,而非我们本机的IP,就这样,成功实现了IP伪装,这便是代理的基本工作原理。

2.2 代理的作用

代理到底有什么用呢?下面简单给大家说一说:
(1)突破IP访问限制:有些网站我们平常无法直接访问,借助代理,就能突破限制,正常访问这些站点。
(2)访问内部资源:以教育网为例,使用教育网内地址段的免费代理服务器,就能访问教育网开放的各类FTP服务,进行资料的下载、上传,还能查询和共享各类学习资料。
(3)加快访问速度:一般来说,代理服务器都会配置一个大容量的硬盘缓冲区。当有信息通过代理服务器时,这些信息会被缓存到缓冲区里。当其他用户再次访问相同信息时,代理服务器就可以直接从缓冲区调取信息,快速传给用户,大大提高了访问速度。
(4)隐藏真实IP:通过代理上网,用户能隐藏自己的真实IP,降低遭受攻击的风险。对爬虫来说,使用代理能隐藏爬虫程序所在的IP,防止因频繁访问被网站封锁IP 。

2.3 爬虫代理

        爬虫爬取数据的速度往往很快,这就导致在爬取时,同一个IP可能会过于频繁地访问网站。一旦出现这种情况,网站为了防范,可能会要求我们输入验证码才能继续访问,甚至直接封锁这个IP。这无疑给爬虫的爬取工作造成很大阻碍。

        而使用代理就能解决这个问题。通过使用代理,我们可以隐藏爬虫程序所在设备的真实IP,让网站服务器以为请求是代理服务器发出的。在爬取过程中,要是我们持续更换不同的代理,网站就难以锁定并封锁我们的IP,爬虫也就可以较为顺利地开展爬取工作了 。

2.4 代理分类

代理按照不同标准,可以从协议类型和匿名程度这两个方面进行分类。
(1)按照协议分类
依据代理所遵循的协议,主要有下面这些类型:
        - FTP代理服务器:专门用来访问FTP服务器,一般能实现文件的上传、下载,还带有缓存功能。它常用的端口是21、2121 。
        - HTTP代理服务器:主要用来访问网页,多数带有内容过滤功能,还能缓存网页数据。常见端口有80、8080、3128。
        - SSL/TLS代理:如果要访问加密网站,就会用到它。这类代理一般具备SSL或TLS加密功能,最高支持128位加密强度,常用端口是443。
        - RTSP代理:主要服务于Real流媒体服务器的访问,通常带有缓存功能,端口多为554。
        - Telnet代理:多用于Telnet远程控制场景,黑客入侵电脑时,常借助它隐藏自己的身份,端口一般是23。
        - POP3/SMTP代理:在使用POP3/SMTP方式收发邮件时会用到,通常有缓存邮件数据的功能,使用的端口一般是110和25。
        - SOCKS代理:它只负责传递数据包,不关注具体协议和使用方法,速度相对较快,也带有缓存功能,端口多为1080。SOCKS代理协议分为SOCKS4和SOCKS5,SOCKS4仅支持TCP协议,而SOCKS5不仅支持TCP,还支持UDP,并且支持多种身份验证机制和服务器端域名解析。简单来讲,SOCKS4能干的事,SOCKS5都能做,但SOCKS5能做的,SOCKS4不一定能做到。

(2)按照匿名程度分类
根据代理的匿名程度差异,又可以分为以下几类:
        - 高度匿名代理:转发数据包时,不会做任何修改。在服务器端看来,就像是普通客户端在发起访问,记录的IP地址也是代理服务器的。
        - 普通匿名代理:在转发数据包时,会对数据包做一些处理。服务器端有可能察觉到这是代理服务器在访问,甚至有一定概率追踪到客户端的真实IP。这类代理服务器一般会添加HTTP_VIA和HTTP_X_FORWARDED_FOR等HTTP头信息。
        - 透明代理:不仅会修改数据包,还会直接把客户端的真实IP告知服务器。这类代理除了能借助缓存技术提升浏览速度,利用内容过滤增强安全性外,没有其他突出作用,常见于内网中的硬件防火墙。
        - 间谍代理:由组织或个人搭建,目的是记录用户传输的数据,进而对用户行为展开研究和监控。

2.5 常见代理设置

下面给大家介绍几种常见的获取代理的途径:
        (1)使用网上免费代理:优先选择高匿名代理。网上免费代理数量有限,且质量参差不齐。在使用之前,得筛选出可用的代理。为了更方便地使用,还可以搭建并维护一个代理池。
        (2)使用付费代理服务:互联网上有不少提供代理服务的商家,只要支付一定费用,就能使用他们的代理服务。相比免费代理,付费代理的稳定性和可用性都要好很多。
        (3)ADSL拨号:每次进行ADSL拨号,都会获取一个新的IP地址。这种方式稳定性高,在解决IP限制问题上,是个比较有效的办法。

        后面的内容里,我们会详细讲解这几种代理的具体使用方法。

参考学习书籍:Python 3网络爬虫开发实战

相关文章:

Python爬虫第3节-会话、Cookies及代理的基本原理

目录 一、会话和Cookies 1.1 静态网页和动态网页 1.2 无状态HTTP 1.3 常见误区 二、代理的基本原理 2.1 基本原理 2.2 代理的作用 2.3 爬虫代理 2.4 代理分类 2.5 常见代理设置 一、会话和Cookies 大家在浏览网站过程中&#xff0c;肯定经常遇到需要登录的场景。有些…...

《自然-方法》2024年度技术:空间蛋白质组学(spatial proteomics)

李升伟 编译 《自然-方法》第21卷 2195-2196页 (2024) 解析组织空间蛋白质组的技术&#xff0c;正成为图谱级研究项目的基石。这些项目正在兑现其承诺&#xff0c;帮助人类理解健康和疾病状态下的生物复杂性。 人类天生充满探索欲。我们热爱勘测未知疆域&#xff0c;并随之绘…...

pip安装timm依赖失败

在pycharm终端给虚拟环境安装timm库失败&#xff08; pip install timm&#xff09;&#xff0c;提示你要访问 https://rustup.rs/ 来下载并安装 Rust 和 Cargo 直接不用管&#xff0c;换一条命令 pip install timm0.6.13 成功安装 简单粗暴...

【工具变量】全国分省低空经济高质量发展数据(2012-2023年)

测算方式&#xff1a;参考CSSCI《北京航空航天大学学报(社会科学版)》沈映春&#xff08;2024&#xff09;老师的做法&#xff0c;如商图指标构建图所示。 包含内容&#xff1a; 样例代码&#xff1a; 样例数据&#xff1a; 参考文献&#xff1a;沈映春,张豪兴.数字基础设施建设…...

【Kubernetes】如何使用 kubeadm 搭建 Kubernetes 集群?还有哪些部署工具?

使用 kubeadm 搭建 Kubernetes 集群是一个比较常见的方式。kubeadm 是 Kubernetes 提供的一个命令行工具&#xff0c;它可以简化 Kubernetes 集群的初始化和管理。下面是使用 kubeadm 搭建 Kubernetes 集群的基本步骤&#xff1a; 1. 准备工作 确保你的环境中有两台或更多的机…...

Java 枚举类 Key-Value 映射的几种实现方式及最佳实践

Java 枚举类 Key-Value 映射的几种实现方式及最佳实践 前言 在 Java 开发中&#xff0c;枚举(Enum)是一种特殊的类&#xff0c;它能够定义一组固定的常量。在实际应用中&#xff0c;我们经常需要为枚举常量添加额外的属性&#xff0c;并实现 key-value 的映射关系。本文将详细…...

JavaScript instanceof 运算符全解析

JavaScript instanceof 运算符全解析 核心语义: 判断一个对象(object)是否属于某个构造函数(constructor)或类的实例,基于原型链(prototype chain)实现类型检测。 一、JavaScript 中的基础用法 1. 语法结构 object instanceof constructor 返回值:布尔值(true/fal…...

问题大集09-如何实现vite创建的react项目的配置别名路径@

&#xff08;1&#xff09;如何实现vite创建的react项目的配置别名路径 1&#xff09;直接修改 Vite 配置文件 ①打开项目根目录下的 vite.config.js 文件&#xff08;如果没有则新建&#xff09;&#xff0c;添加 resolve.alias 配置&#xff08;新增resolve部分&#xff09;…...

鸿蒙开发_TS快速入门_TS中模块化操作_模块的导入导出---纯血鸿蒙HarmonyOS5.0工作笔记008

然后我们再来看鸿蒙中的模块如何导入导出。 其实就跟Java中的import是一个意思的。 只不过我们如果想把一个类中的某个方法导入到另一个类中, 那么首先要在这个类中去导出这个方法。 可以看到导出的关键字是export。 然后导入的关键字是import。 然后我们写个例子去看一下,…...

算法设计与分析之“分治法”

分治法&#xff08;Divide and Conquer&#xff09;是一种高效的算法设计策略&#xff0c;其核心思想是将复杂问题分解为多个子问题&#xff0c;递归求解后再合并结果。以下是分治法的详细介绍&#xff1a; 一、分治法的基本步骤 分治法遵循以下三步流程&#xff1a; 分解&…...

java 静态内部类

java 静态内部类 一、位置二、特点三、静态内部类的实例化四、代码示例一&#xff1a;演示特点一五、代码示例二&#xff1a;演示特点二六、代码实例三&#xff1a;演示特点三七、代码实例四&#xff1a;演示特点四 文章同步更新&#xff08;更好的排版&#xff09;&#xff1a…...

Axure疑难杂症:完美解决文本框读取、赋值、计数(玩转文本框)

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;玩转文本框 主要内容&#xff1a;文本框读取、赋值、验证、计数 应用场景&#xff1a;验证码、文本限制、文本取值、文本赋值等场景 案例展示&…...

Python数据可视化-第2章-使用matplotlib绘制简单图表

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第2章 使用matplotlib绘制简单图表 本文主要介绍了折线图、柱形图或堆积柱形图、条形图或堆积条形图、堆积面积图、直方图、饼图或…...

国产系统服务器识别不到SATA盘

在使用浪潮、海光、华三等系列服务器安装操作系统的时候提示没有足够的存储空间&#xff0c;其实是有两块512的SATA硬盘的&#xff0c;但是他没有识别到。 需要给硬盘做raid存储阵列才能让系统识别到他&#xff0c;下面是在BIOS中配置RAID的方法。 1、重启机器&#xff0c;按下…...

解决小程序video控件在真机和上线后黑屏不播放问题

小程序上线后&#xff0c;mp4格式的视频无法点击是黑屏&#xff0c;但是测试得时候在微信开发者工具中能够打开正常播放 原因&#xff1a;编码格式不能是vp9 微信开发者工具本地设置中把这个打开勾选。 排查&#xff1a;可以换一个视频尝试能不能真机播放&#xff0c;如果能&a…...

Vue3编译器深度解析:从模板编译到极致性能优化

一、编译技术架构演进 1.1 Vue2到Vue3编译架构升级 1.2 编译阶段性能基准对比 优化项Vue2编译耗时Vue3编译耗时性能提升模板解析速度12ms/千节点3ms/千节点75%AST遍历速度8ms/层级2ms/层级68%代码生成速度15ms/组件4ms/组件73%内存占用峰值84MB32MB62% 二、模板编译核心过程 …...

Google Gemini 2.0 网页抓取真丝滑

网页抓取从未如此简单——这一切都要归功于谷歌突破性的多模态实时API Gemini 2.0 借助这个工具&#xff0c;你可以毫不费力地从任何网页提取数据&#xff0c;无论页面结构多么复杂、内容多么杂乱无章&#xff0c;或是需要提取非常特定的信息。 今天&#xff0c;我将通过自己实…...

Leetcode-100 二分查找常见操作总结

二分查找常见操作总结 1. 基本二分查找 目标: 在有序数组 nums 中查找 target 的索引&#xff08;如果存在&#xff09;。 适用场景: 需要在 有序数组 中查找某个特定元素。适用于无重复元素的情况。 示例: 输入 nums [1, 2, 3, 4, 5], target 3&#xff0c;输出 2。 d…...

Android: Handler 的用法详解

Android 中 Handler 的用法详解 Handler 是 Android 中用于线程间通信的重要机制&#xff0c;主要用于在不同线程之间发送和处理消息。以下是 Handler 的全面用法指南&#xff1a; 一、Handler 的基本原理 Handler 基于消息队列(MessageQueue)和循环器(Looper)工作&#xff…...

第149场双周赛:找到字符串中合法的相邻数字、重新安排会议得到最多空余时间 Ⅰ、

Q1、找到字符串中合法的相邻数字 1、题目描述 给你一个只包含数字的字符串 s 。如果 s 中两个 相邻 的数字满足以下条件&#xff0c;我们称它们是 合法的 &#xff1a; 前面的数字 不等于 第二个数字。两个数字在 s 中出现的次数 恰好 分别等于这个数字本身。 请你从左到右…...

深入解析Translog机制:Elasticsearch的数据守护者

一、为什么需要Translog&#xff1f; Elasticsearch的数据写入流程是先写入内存缓冲区&#xff0c;然后定期刷新到磁盘生成Lucene分段。由于内存数据易失性&#xff0c;若在刷新前发生宕机&#xff0c;未持久化的数据将永久丢失。Translog的诞生正是为了解决这一数据可靠性问题…...

音视频入门基础:MPEG2-TS专题(25)——通过FFmpeg命令使用UDP发送TS流

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…...

3、nFR52xx蓝牙学习(点亮第一个LED灯)

一、点灯代码&#xff1a; led.h文件 #ifndef __LED_H #define __LED_H#include "nrf52840.h"#define LED_0 NRF_GPIO_PIN_MAP(0,13) #define LED_1 NRF_GPIO_PIN_MAP(0,14) #define LED_2 NRF_GPIO_PIN_MAP(0,15) #define LED_3 …...

符号秩检验

内容来源 非参数统计&#xff08;第2版&#xff09; 清华大学出版社 王星 褚挺进 编著 符号秩检验 在符号检验的基础上&#xff0c;增加了数据绝对值大小的信息 检验统计量 用一个简单的例子来说明 样本数据 X i , i 1 , ⋯ , 6 X_i,i1,\cdots,6 Xi​,i1,⋯,6 如下 X …...

制造业数字化转型:流程改造先行还是系统固化数据?基于以MTO和MTS的投资回报分析

1. 执行摘要 制造业正经历一场深刻的数字化转型&#xff0c;企业面临着先进行流程改造以优化运营&#xff0c;还是直接上线系统以固化数据的战略选择。本文深入分析了以销定产&#xff08;MTO&#xff09;和以产定销&#xff08;MTS&#xff09;两种主要生产模式下&#xff0c…...

python相关笔记

一。 is和的区别 1.is看的是发票逻辑地址&#xff0c;用来判断两个变量是否引用同一个对象&#xff0c;is关注的是‘身份’ 2.判断两个对象是否具有相同的值&#xff0c;关注的是内容是否相等&#xff0c;也即值是否相等。 3. if x is None: print(x is None")...

C++(匿名函数+继承+多态)

#include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>using namespace std;// 基类 Weapon class Weapon { protected:int atk; public:Weapon…...

界面架构 - MVVM (Qt)

MVVM MVVM 的主要特点示例示例功能示例代码ViewModel 类&#xff08;C&#xff09;主函数入口&#xff08;main.cpp&#xff09; QML 文件&#xff08;main.qml&#xff09;总结 MVVM&#xff08;Model-View-ViewModel&#xff09;架构是一种旨在进一步分离界面和业务逻辑的设计…...

在未归一化的线性回归模型中,特征的尺度差异可能导致模型对特征重要性的误判

通过数学公式来更清晰地说明归一化对模型的影响&#xff0c;以及它如何改变特征的重要性评估。 1. 未归一化的情况 假设我们有一个线性回归模型&#xff1a; y β 0 β 1 x 1 β 2 x 2 ϵ y \beta_0 \beta_1 x_1 \beta_2 x_2 \epsilon yβ0​β1​x1​β2​x2​ϵ 其…...

【大模型系列篇】大模型基建工程:使用 FastAPI 构建 MCP 服务器

今天我们将使用FastAPI来构建 MCP 服务器&#xff0c;Anthropic 推出的这个MCP 协议&#xff0c;目的是让 AI 代理和你的应用程序之间的对话变得更顺畅、更清晰。FastAPI 基于 Starlette 和 Uvicorn&#xff0c;采用异步编程模型&#xff0c;可轻松处理高并发请求&#xff0c;尤…...

基于微信小程序的智慧乡村旅游服务平台【附源码】

基于微信小程序的智慧乡村旅游服务平台&#xff08;源码L文说明文档&#xff09; 目录 4系统设计 4.1系统功能设计 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 管理员模块的实现 5.1.1旅游景点管理…...

llm-universe 踩坑记录

踩坑 云服务器2G不够&#xff0c;因为后面用到内存向量数据库&#xff0c;把数据加载到内存&#xff0c;一个大点的pdf就导致整个服务器崩了。当时可以选择不加载大的文件&#xff0c;自己替换一个小点的pdf 注意点 LLM API.ipynb 这节要注意看下API的含义&#xff0c;了解m…...

【案例】跨境电商企业实践云成本优化,选对平台是关键

某跨境电商企业近年因业务发展迅猛&#xff0c;近年来在全球市场大力拓展业务。然而&#xff0c;伴随其全球化布局的深化&#xff0c;云资源成本逐年攀升&#xff0c;每年在云资源方面的投入超 500万元。庞大的云资源使用量虽支撑了业务的快速发展&#xff0c;但也带来了较高的…...

系统思考与时间管理

时间管理的真正秘诀&#xff1a;主动浪费时间&#xff1f; 巴菲特的私人飞机驾驶员觉得自己不够成功&#xff0c;于是向巴菲特请教应该怎么做。巴菲特让他列出了自己人生中最想实现的25个目标&#xff0c;并按重要程度排序&#xff0c;接着安排时间专注做前五件最重要的事情。…...

洛谷.P1563 [NOIP 2016 提高组] 玩具谜题

P1563 [NOIP 2016 提高组] 玩具谜题 - 洛谷 代码区&#xff1a; #include<algorithm> #include<iostream> #include<cstring> #include<string> #include<vector>using namespace std; const int MAX 1000005; struct PEOPLE {int cx;//0朝内…...

华为面试,机器学习深度学习知识点:

机器学习深度学习知识点&#xff1a; 机器学习一般有哪些分数&#xff0c;对于不同的任务&#xff1a; 分类任务&#xff1a; 准确率&#xff08;Accuracy&#xff09;&#xff1a;预测正确的样本数占总样本数的比例&#xff0c;公式为 Accuracy TPTNFPFN TPTN ​ &#xff0c…...

关于 数据库 UNION 和 UNION ALL 的使用,以及 分库分表环境下多表数据组合后的排序和分页问题的解决方案 的详细说明,并以表格总结关键内容

以下是关于 数据库 UNION 和 UNION ALL 的使用&#xff0c;以及 分库分表环境下多表数据组合后的排序和分页问题的解决方案 的详细说明&#xff0c;并以表格总结关键内容&#xff1a; 1. UNION 和 UNION ALL 的核心区别 1.1 定义与语法 UNION 功能&#xff1a;合并两个或多个 …...

架构设计基础系列:事件溯源模式浅析

图片来源网络&#xff0c;侵权删 ‌1. 引言‌ ‌1.1 研究背景‌ 传统CRUD模型的局限性&#xff1a;状态覆盖导致审计困难、无法追溯历史。分布式系统复杂性的提升&#xff1a;微服务架构下数据一致性、回滚与调试的需求激增。监管合规性要求&#xff1a;金融、医疗等领域对数…...

虚拟试衣间-云尚衣橱小程序-衣橱管理实现

衣橱管理实现 目标 (Goal): 用户 (User): 能通过 UniApp 小程序上传衣服图片。 后端 (Backend): 接收图片,存到云存储,并将图片信息(URL、用户ID等)存入数据库。 用户 (User): 能在小程序里看到自己上传的所有衣服图片列表。 技术栈细化 (Refined Tech Stack for this Pha…...

蓝桥杯省模赛 台阶方案

问题描述 小蓝要上一个楼梯&#xff0c;楼梯共有 n 级台阶&#xff08;即小蓝总共要走 n 级&#xff09;。小蓝每一步可以走 a 级、b 级或 c 级台阶。 请问小蓝总共有多少种方案能正好走到楼梯顶端&#xff1f; 输入格式 输入的第一行包含一个整数 n 。 第二行包含三个整数…...

Socket编程UDP

Socket编程UDP 1、V1版本——EchoServer2、网络命令2.1、ping2.2、netstat2.3、pidof 3、验证UDP——Windows作为client访问Linux4、V2版本——DictServer5、V3版本——简单聊天室 1、V1版本——EchoServer 首先给出EchoServer目录结构&#xff1a;服务器的类我们实现在UdpServ…...

无人机机体结构设计要点与难点!

一、无人机机体结构设计要点 1. 类型与应用场景匹配 固定翼无人机&#xff1a;需优化机翼升阻比&#xff0c;采用流线型机身降低气动阻力&#xff08;如大展弦比机翼设计&#xff09;。 多旋翼无人机&#xff1a;注重轻量化框架和对称布局&#xff08;如四轴/六轴碳纤维机…...

音视频(一)ZLMediaKit搭建部署

前言 一个基于C11的高性能运营级流媒体服务框架 全协议支持H264/H265/AAC/G711/OPUS/MP3&#xff0c;部分支持VP8/VP9/AV1/JPEG/MP3/H266/ADPCM/SVAC/G722/G723/G729 1&#xff1a;环境 ubuntu22.* ZLMediaKit downlaod:https://github.com/ZLMediaKit/ZLMediaKit or https://g…...

实战 | 餐厅点餐小程序技术解析:SpringBoot + UniApp 高效开发指南

&#x1f5a5;️ 一、系统架构概览 1.1 技术选型 为了确保开发效率和系统稳定性&#xff0c;我们采用以下技术栈&#xff1a; 模块技术选型后台服务SpringBoot MyBatis-Plus MySQL用户端&#xff08;点餐小程序&#xff09;UniApp&#xff08;Vue 语法&#xff09;师傅端&…...

合并相同 patient_id 的 JSON 数据为数组

问题 select patient_id,concat({"itemText":",item_text,","itemValue":",item_value,"}) from hs_patient_groups where active 1;eef41128c47c401abb7f8885a5f9fbdf {"itemText":"旧","itemValue"…...

AI安全:构建负责任且可靠的系统

AI已成为日常生活中无处不在的助力&#xff0c;随着AI系统能力和普及性的扩展&#xff0c;安全因素变得愈发重要。从基础模型构建者到采用AI解决方案的企业&#xff0c;整个AI生命周期中的所有相关方都必须共同承担责任。 为什么AI安全至关重要&#xff1f; 对于企业而言&…...

STM32单片机入门学习——第8节: [3-4] 按键控制LED光敏传感器控制蜂鸣器

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.02 STM32开发板学习——第8节: [3-4] 按键控制LED&光敏传感器控制蜂鸣器 前言开…...

Linux驱动入门——设备树详解

文章目录 一、设备树的引入与作用二、设备树的语法1. Devicetree格式1.1 DTS文件的格式1.2 node的格式1.3 properties的格式 2. dts文件包含dtsi文件3. 常用的属性3.1 #address-cells、#size-cells3.2 compatible3.3 model3.4 status3.5 reg 4. 常用的节点(node)4.1 根节点4.2 …...

Scala集合

Scala集合分为序列Seq、集Set、映射Map&#xff0c;都扩展自Iterable特质&#xff0c;且有可变和不可变版本。不可变集合操作后会返回新对象&#xff0c;可变集合则直接修改原对象。比如数组&#xff0c;不可变数组定义后大小不可变&#xff0c;修改会生成新数组&#xff1b;可…...

阿里云AI Studio 2.0:拖拽搭建企业级智能客服系统

一、平台能力全景 1.1 核心功能矩阵 模块子功能技术指标对话设计可视化流程编排支持50节点类型NLP引擎意图识别准确率行业TOP3&#xff08;92.6%&#xff09;知识管理多源数据接入15格式支持渠道对接全渠道覆盖8大平台SDK 1.2 企业级特性 关键优势&#xff1a; 日均对话承…...