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

Python爬虫(二)- Requests 高级使用教程

文章目录

  • 前言
  • 一、Session 对象
    • 1. 简介
    • 2. 跨请求保持 Cookie
    • 3. 设置缺省数据
    • 4. 方法级别参数不被跨请求保持
    • 5. 会话作为上下文管理器
    • 6. 移除字典参数中的值
  • 二、请求与响应
    • 1. 请求与响应对象
      • 1.1 获取响应头信息
      • 1.2 获取发送到服务器的请求头信息
  • 三、SSL 证书验证
    • 1. 忽略 SSL 证书验证
  • 四、流式上传和请求
    • 1. 流式上传
    • 2. 流式请求
      • 2.1 流式请求和普通请求的区别
      • 2.2 示例
        • 2.2.1 iter_lines() 使用
        • 2.2.2 iter_content() 使用
  • 五、代理
    • 1. 获取免费代理地址
    • 2. 使用代理配置单个请求
    • 3. 使用代理池
    • 4. 使用 HTTP Basic Auth 的代理
    • 5. 针对特定主机或连接方式设置代理
  • 六、编码方式
    • 1. 编码方式处理
      • 1.1 自动检测编码
      • 1.2 手动设置编码
      • 1.3 使用原始字节数据
  • 七、身份认证
    • 1. 基本身份认证 (HTTP Basic Auth)


前言

在现代网络应用中,HTTP 请求和响应的处理是至关重要的。Python 的 requests 库以其简洁易用的接口,成为了开发者进行网络请求的首选工具。无论是简单的 GET 请求,还是复杂的身份认证、会话管理、代理设置,requests 都能轻松应对。本文将深入探讨 requests 库的各个方面,包括 Session 对象的使用、请求与响应的处理、SSL 证书验证、流式上传和请求、代理配置、编码方式处理以及身份认证等。


一、Session 对象

1. 简介

Session 对象允许跨多个请求保持某些参数不变。它在同一个 Session 实例发出的所有请求之间保持 cookie,并利用 urllib3 的连接池功能来重用底层的 TCP 连接,从而为向同一主机发送的多个请求提供显著的性能提升。

主要特性:

  • 所有 Requests API 方法:Session 对象拥有主要的 Requests API 的所有方法。
  • 持久性 Cookie 和 Headers:可以跨请求保持某些数据,如认证信息和自定义头部。
  • 连接池复用:对于同一主机的多次请求,能够复用TCP连接,提高效率。

2. 跨请求保持 Cookie

import requests# 创建一个会话对象
session = requests.session()# 设置 Cookie:通过会话发送 GET 请求,设置一个名为 sessioncookie 的 cookie,值为 123456789。
session.get('http://httpbin.org/cookies/set/sessioncookie/123456789')# 获取 Cookie:再次使用同一个会话发送 GET 请求,获取当前会话中的所有 cookies。
response = session.get("http://httpbin.org/cookies")# 打印服务器返回的 cookie 信息
print(response.text)

打印的结果为:

{"cookies": {"sessioncookie": "123456789"}
}

3. 设置缺省数据

通过为 Session 对象的属性提供数据,可以为请求方法提供缺省数据,例如认证信息或头部信息。

import requests# 创建一个会话对象
session = requests.session()# 设置会话的认证信息,用户名为 'user',密码为 'pass'
session.auth = ('user', 'pass')# 更新会话头部信息,添加自定义头 'x-test',其值为 'true'
session.headers.update({'x-test': 'true'})# 发送 GET 请求到 http://httpbin.org/headers,同时在此请求中添加另一个自定义头 'x-test2'
response = session.get('http://httpbin.org/headers', headers={'x-test2': 'true'})# 打印服务器返回的响应内容,以查看请求头和其他信息
print(response.text)

打印的结果为:

在这里插入图片描述

任何传递给请求方法的字典都会与已设置会话层数据合并,方法层的参数覆盖会话的参数。

4. 方法级别参数不被跨请求保持

就算使用了 Session,方法级别的参数也不会被跨请求保持。

import requests# 创建一个会话对象
session = requests.session()# 只有第一个请求发送 cookie
response = session.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(response.text)# 第二个请求没有 cookie
response = session.get('http://httpbin.org/cookies')
print(response.text)

打印的结果为:

{"cookies": {"from-my": "browser"}
}{"cookies": {}
}

从打印的结果可以看出,重复对同一个地址发起访问,第一个请求设置的 cookie 并没有被保存,所以第二个请求中没有 cookie,也就是说就算使用了 Session,方法级别的参数也不会被跨请求保持。

5. 会话作为上下文管理器

为了确保会话在完成后能被正确关闭,可以使用它作为上下文管理器。这样就能确保 with 区块退出后会话能被关闭,即使发生了异常也一样。

import requestswith requests.session() as session:response = session.get('http://httpbin.org/cookies/set/sessioncookie/123456789')print(response.text)

打印的结果为:

{"cookies": {"sessioncookie": "123456789"}
}

6. 移除字典参数中的值

可以通过在方法级别的参数中将键的值设置为 None 来移除会话层字典参数中的某个键,从而让该键不会被发送。


二、请求与响应

1. 请求与响应对象

任何时候当你调用 requests.get() 或其他类似方法时,实际上你在执行两个主要操作:构建一个 Request 对象以向服务器请求或查询资源;以及接收一个从服务器返回的 Response 对象。这个 Response 对象包含了来自服务器的所有信息,并且也包含了你最初创建的 Request 对象。

1.1 获取响应头信息

import requestsurl = 'http://www.baidu.com'response = requests.get(url)print(response.headers)

打印的结果为:

在这里插入图片描述

1.2 获取发送到服务器的请求头信息

import requestsurl = 'http://www.baidu.com'response = requests.get(url)print(response.request.headers)

打印的结果为:

{'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}

三、SSL 证书验证

Requests 可以为 HTTPS 请求验证 SSL 证书,就像 web 浏览器一样。SSL 验证默认是开启的,如果证书验证失败,Requests 会抛出 SSLError

1. 忽略 SSL 证书验证

在某些特殊情况下,比如在测试环境中或者你信任但证书不受信任的情况下,你可能想要忽略 SSL 证书验证。

import requests
from urllib3.exceptions import InsecureRequestWarningurl = 'https://example.com'# 禁用不安全请求警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)# 忽略 SSL 证书验证
response = requests.get(url, verify=False)
print(response.status_code)

四、流式上传和请求

1. 流式上传

Requests支持流式上传,这允许你发送大的数据流或文件而无需先把它们读入内存。要使用流式上传,仅需为你的请求体提供一个类文件对象即可。

with open('massive-body', 'rb') as f:requests.post('http://some.url/streamed', data=f)

data=f:这里将文件对象 f 直接赋值给了 data 参数。这意味着 requests 将会逐块读取文件内容,并通过 HTTP 请求进行流式传输。这样做的好处是,即使文件非常大,也不会占用过多的内存,因为数据是一部分一部分地发送出去的。

2. 流式请求

2.1 流式请求和普通请求的区别

流式请求(Streaming Requests)和普通请求(Non-streaming Requests)是使用 requests 库进行 HTTP 请求的两种不同方式,它们在处理响应内容时有着显著的区别。下面我们将详细介绍这两种请求类型,并说明其适用场景。

普通请求

  • 一次性读取:当发起一个普通的 GET 或 POST 请求时,requests 会立即将整个响应体下载到内存中。这意味着如果响应体很大,可能会占用大量的内存。

  • 简单易用:对于小文件或轻量级的数据交换,这种方式非常方便,因为它不需要额外的配置就可以直接获取完整的响应内容。

流式请求

  • 逐块读取:通过设置参数 stream=True,你可以告诉 requests 不要立即下载整个响应体。相反,它会在需要时逐步从网络流中读取数据。这允许你处理超大文件或长时间运行的数据流,而不会一次性占用大量内存。

  • 节省资源:流式请求非常适合于处理大型文件、长连接 API 响应或者实时数据流,因为你可以一边接收数据一边处理,从而有效管理资源。

  • 更复杂的逻辑:由于数据是分块到达的,你需要编写额外的代码来处理这些数据块,例如将它们写入文件或进行增量处理。

流式请求迭代器方法

  • iter_content():以字节为单位返回响应内容的迭代器。可以指定 chunk_size 参数来控制每次读取的大小。

  • iter_lines():以行为单位返回响应内容的迭代器,适用于按行处理的文本响应。

2.2 示例

2.2.1 iter_lines() 使用
import json
import requests# 发送 GET 请求到指定的 URL,使用 stream=True 以便逐行读取响应内容
response = requests.get('http://httpbin.org/stream/20', stream=True)# 检查响应的编码,如果未设置,则将其设置为 'utf-8'
if response.encoding is None:response.encoding = 'utf-8'# 逐行迭代响应内容,使用 decode_unicode=True 将内容解码为字符串
for line in response.iter_lines(decode_unicode=True):# 检查当前行是否非空if line:# 将 JSON 格式的字符串解析为 Python 对象并打印print(json.loads(line))

iter_lines 不保证重进入时的安全性。多次调用该方法 会导致部分收到的数据丢失。如果要在多处调用它,应该使用生成的迭代器对象。

import json
import requests# 发送 GET 请求到指定的 URL,使用 stream=True 以便逐行读取响应内容
response = requests.get('http://httpbin.org/stream/20', stream=True)# 检查响应的编码,如果未设置,则将其设置为 'utf-8'
if response.encoding is None:response.encoding = 'utf-8'# 使用 iter_lines() 方法创建一个可迭代的行生成器
lines = response.iter_lines()# 使用 next() 函数获取并跳过第一行,first_line 存储的是第一行的内容
first_line = next(lines)# 逐行处理剩余的响应内容
for line in lines:# 打印当前行的内容print(json.loads(line))
2.2.2 iter_content() 使用
import requests# 定义要请求的 URL
url = 'https://api.github.com/events'# 发送 GET 请求到指定的 URL,使用 stream=True 以便逐块下载内容
response = requests.get(url=url, stream=True)# 打开一个文件以写入二进制数据,路径为 'D:\\demo.txt'
with open('D:\\demo.txt', 'wb') as fd:# 遍历响应内容,按块读取数据,块大小为 8192 字节for chunk in response.iter_content(chunk_size=8192):# 将读取的块写入文件fd.write(chunk)

五、代理

1. 获取免费代理地址

点击连接访问快代理网站:https://www.kuaidaili.com/free/inha/

如下图所示,可以获取免费的代理。

在这里插入图片描述

2. 使用代理配置单个请求

如果需要使用代理,可以通过为任意请求方法提供 proxies 参数来配置单个请求。

import requestsurl = 'http://www.baidu.com'proxies = {"http": "47.119.22.92:8008"
}# 发送 GET 请求,并使用指定的代理
response = requests.get(url=url, proxies=proxies)print(response.status_code)

打印的结果为:

200

3. 使用代理池

在进行网络请求时,特别是当你需要频繁地访问某个网站或希望隐藏自己的真实 IP 地址时,使用代理池可以提高请求的成功率和匿名性。通过每次发送请求时从多个代理服务器中随机选择一个来发送,可以分散请求源,减少被目标网站封禁的风险。

import randomimport requestsurl = 'http://www.baidu.com'# 使用代理池
proxies_pool = [{'http': '47.122.65.254:8080'},{'http': '8.130.34.44:8800'},{'http': '47.121.183.107:8443'},{'http': '111.1.61.50:3128'},{'http': '47.119.164.33:3128'}
]proxies = random.choice(proxies_pool)# 发送 GET 请求,并使用指定的代理
response = requests.get(url=url, proxies=proxies)print(response.status_code)

打印的结果为:

200

4. 使用 HTTP Basic Auth 的代理

如果代理需要使用 HTTP Basic Auth,可以使用 username:password@host 的语法来配置代理。

# 定义代理字典,包含用户名和密码
proxies = {"http": "username:password@10.10.1.10:3128",
}

5. 针对特定主机或连接方式设置代理

要为某个特定的连接方式或主机设置代理,可以使用 scheme://hostname 作为键。这种方式将针对指定的主机和连接方式进行匹配。

import requestsurl = 'http://www.baidu.com'# 针对特定主机设置代理
proxies = {"http://127.0.0.1": "http://47.121.183.107:8443"
}# 发送 GET 请求,并使用指定的代理
response = requests.get(url=url, proxies=proxies)print(response.status_code)

打印的结果为:

200

六、编码方式

1. 编码方式处理

当你收到一个 HTTP 响应时,requests 库会猜测响应内容的编码方式,以便在你调用 Response.text 方法时能够正确解码响应内容。以下是 requests 处理编码方式的具体机制。

1.1 自动检测编码

  1. 优先检查 HTTP 头部requests 首先会在 HTTP 响应头部查找 Content-Type 字段中的字符集声明。如果存在明确指定的字符集(例如 charset=UTF-8),则使用该字符集进行解码。

  2. 使用 charade 猜测编码:如果 HTTP 头部没有明确指定字符集,并且 Content-Type 包含 text 类型,则 requests 会使用内置的 chardet 库(原名为 charade)来推测最可能的编码方式。

  3. 默认编码:根据 RFC 2616 的规定,当 Content-Typetext 类型但没有指定字符集时,默认字符集应该是 ISO-8859-1requests 遵循这一规范并默认采用 ISO-8859-1 进行解码。

1.2 手动设置编码

如果你知道正确的编码方式并且希望覆盖 requests 的自动检测结果,可以通过直接设置 Response.encoding 属性来实现。

import requestsurl = 'https://api.github.com/events'response = requests.get(url=url)# 查看推测的文本编码
print("自动推测的编码方式:" + response.encoding)# 手动指定编码为 ISO-8859-1
response.encoding = 'ISO-8859-1'
# 打印编码方式
print("手动指定的编码方式:" + response.encoding)

打印的结果为:

自动推测的编码方式:utf-8
手动指定的编码方式:ISO-8859-1

1.3 使用原始字节数据

如果你不确定编码或者不想依赖于 requests 的自动解码功能,可以直接访问 Response.content 属性以获取未经解码的原始字节数据。然后根据需要自行解码。

import requestsurl = 'https://api.github.com/events'response = requests.get(url=url)# 获取未经解码的原始字节数据,返回的是服务器返回的二进制内容
raw_data = response.content# 使用 UTF-8 编码方式对原始字节数据进行解码,转换为字符串
decoded_text = raw_data.decode('utf-8')
print(decoded_text)

七、身份认证

1. 基本身份认证 (HTTP Basic Auth)

HTTP Basic Authentication 是一种简单的认证机制,广泛用于需要认证的 Web 服务中。requests 库对这种认证方式提供了直接的支持。

可以通过导入 HTTPBasicAuth 类来使用 HTTP Basic Auth。

import requests
from requests.auth import HTTPBasicAuthurl = 'https://api.github.com/user'
auth = HTTPBasicAuth('user', 'pass')
# 发送带有基本身份认证的 GET 请求
response = requests.get(url=url, auth=auth)print(response.status_code)

简写形式:由于 HTTP Basic Auth 非常常见,requests 提供了一种更为简洁的方式来传递认证信息——直接在 auth 参数中提供一个元组。

import requestsurl = 'https://api.github.com/user'
# 发送带有基本身份认证的 GET 请求
response = requests.get(url=url, auth=('user', 'pass'))print(response.status_code)

参考链接:

  • requests 官方文档:http://cn.python-requests.org/zh_CN/latest/

相关文章:

Python爬虫(二)- Requests 高级使用教程

文章目录 前言一、Session 对象1. 简介2. 跨请求保持 Cookie3. 设置缺省数据4. 方法级别参数不被跨请求保持5. 会话作为上下文管理器6. 移除字典参数中的值 二、请求与响应1. 请求与响应对象1.1 获取响应头信息1.2 获取发送到服务器的请求头信息 三、SSL 证书验证1. 忽略 SSL 证…...

协议幻变者:DeviceNet转ModbusTCP网关开启机器手臂智能新纪元

技术背景DeviceNet是一种广泛应用于工业自动化领域的现场总线标准,它能够实现控制器与现场设备之间的高效通信,常用于连接各种传感器、执行器以及其他工业设备,如机器人、电机驱动器等,具有实时性强、可靠性高的特点。而ModbusTCP…...

自定义有序Map

package cn.ziqirj.common.utils;import lombok.Getter; import lombok.Setter;import java.util.ArrayList; import java.util.List;/*** 模拟Map集合&#xff0c;key不可重复&#xff0c;按插入顺序排序* author zhangji** param <T>*/ public class CustomOrderlyMap&…...

CA系统的设计(CA证书生成,吊销,数字签名生成)

CA系统概述 CA认证系统是一种基于公钥密码基础设施&#xff08;PKI&#xff09;的信息安全技术&#xff0c;它可以为网络通信双方提供身份认证、数据加密、数字签名等功能。CA认证系统的核心是证书授权机构&#xff08;CA&#xff09;&#xff0c;它负责为用户&#xff08;节点…...

流计算需要框架吗?SPL 可能是更好的选择

流数据源通常是动态、无界的&#xff0c;看起来与静态、有限的批数据源区别较大&#xff0c;传统的数据库技术在架构上难以直接处理流数据源&#xff0c;只能让位于后来者。heron\samza\storm\spark\flink等计算框架最先完成突破&#xff0c;在流计算技术中占得先发优势。这些框…...

Vue-Router之嵌套路由

在路由配置中&#xff0c;配置children import Vue from vue import VueRouter from vue-routerVue.use(VueRouter)const router new VueRouter({mode: history,base: import.meta.env.BASE_URL,routes: [{path: /,redirect: /home},{path: /home,name: home,component: () &…...

MySQL 读写分离

MySQL 读写分离 一、配置主库(Master) 1.修改主库的配置文件 修改主库的 my.cnf 配置文件&#xff0c;生成二进制日志 (binary log) 和服务器唯一ID&#xff0c;这是实现主从复制的必要配置 [mysqld] # skip-grant-tables userroot port3306 basedir/usr/local/mysql datad…...

记一次音频无输出的解决方案

啊啊啊&#xff0c;刷个抖音就发现个死电脑死都不出声&#xff0c;捣鼓了一天才解决 打开wav文件时&#xff0c;提示错误找不到音频播放设备 0xc00d36fa 起初以为是声卡坏了&#xff0c;就到官网下载、更新了声卡驱动。无用什么驱动精灵也检测了&#xff0c;但也测不出啥来。…...

3D数学基础2

矩阵的行列式 在任意方阵中都存在至少一个标量&#xff0c;称作该方阵的行列式。在线性代数中&#xff0c;行列式有很多有用的性质 线性运算法则 方阵 M M M的行列式记作 ∣ M ∣ |M| ∣M∣或“det M”。非方阵矩阵的行列式是未定义的。 注意&#xff0c;在书写行列式时&…...

Java开发生态2024年度总结报告

1 关键要点 尽管数据显示 Java 17 是最常用 JDK&#xff0c;但其用户占比并未超过半数。根据 New Relic 2024 Java 生态系统状态报告&#xff0c;Java 17、11 和 8 的用户比例分别为 35%、33% 和 29%。New Relic 数据中所谓“快速采用”指 Java 21 的采用率仅为 1.4%。虽相较 J…...

1月第三讲:Java子线程无法获取Attributes的解决方法

在Java多线程编程中&#xff0c;开发者经常会遇到子线程无法获取主线程设置的Attributes的问题。Attributes通常用于存储与当前线程相关的数据&#xff0c;尤其在Web应用中&#xff0c;它们常用于请求上下文的管理。然而&#xff0c;由于Java线程是独立运行的&#xff0c;每个线…...

更新金碟云星空单据供应商和币别

--应付单 select FSUPPLIERID from [dbo].[T_AP_PAYABLE] where FBILLNO=AP2024121670 select FSUPPLIERID,FCURRENCYID,* from [dbo].[T_AP_PAYABLE] where FBILLNO=AP2024121670 -- update T_AP_PAYABLE set FSUPPLIERID=100567 where FBILLNO=AP2024121670 -- update T_…...

from memory cache 修复记录

背景 浏览器的页签图标&#xff0c;不想要了 改代码&#xff1a;设置浏览器页签的代码 本地环境测试&#xff0c;没有问题&#xff0c;一次性修改成功 于是打包&#xff0c;部署到测试环境&#xff0c;然而&#xff0c;还是有 接下的解决方法&#xff1a; 1、清除浏览器缓…...

spring入门程序

安装eclipse https://blog.csdn.net/qq_36437991/article/details/131644570 新建maven项目 安装依赖包 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…...

用于实现无缝滚动效果的vue-seamless-scroll插件

它通常用于在网页或应用中实现内容的自动滚动效果&#xff0c;如新闻公告、图片轮播等&#xff0c;支持横向和纵向滚动&#xff0c;并且可以自定义滚动速度、方向等参数&#xff0c;适合展示一些需要持续循环展示的信息。 在Vue2项目中使用vue-seamless-scroll插件的步骤如下&…...

借助 FinClip 跨端技术探索鸿蒙原生应用开发之旅

在当今数字化浪潮汹涌澎湃的时代&#xff0c;移动应用开发领域正经历着深刻的变革与创新。鸿蒙操作系统的崛起&#xff0c;以其独特的分布式架构和强大的性能表现&#xff0c;吸引了众多开发者的目光。而FinClip 跨端技术的出现&#xff0c;为开发者涉足鸿蒙原生应用开发提供了…...

【机器学习】机器学习的基本分类-自监督学习-对比学习(Contrastive Learning)

对比学习是一种自监督学习方法&#xff0c;其目标是学习数据的表征&#xff08;representation&#xff09;&#xff0c;使得在表征空间中&#xff0c;相似的样本距离更近&#xff0c;不相似的样本距离更远。通过设计对比损失函数&#xff08;Contrastive Loss&#xff09;&…...

python之eval函数

功能&#xff1a;将字符串str当成有效的表达式来求值并返回计算结果 语法&#xff1a;eval(source,[,globals[,locals]])->value 参数&#xff1a; source&#xff1a;一个python表达式或函数compile()返回的代码对象globals&#xff1a;可选。必须是dictionarylocals&am…...

NXP i.MX8系列平台开发讲解 - 5.3 调试篇(二) - 掌握Dynamic debug调试

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 文章目录 目录 掌握Dynamic debug调试 1. 认识Dynamic debug 2. 内核配置 3. 使用Dynamic debug 3.1 查看当前的…...

QT----------常用界面组件的使用

一、QComboBox 类 主要功能&#xff1a;提供一个下拉列表&#xff0c;用户可以从中选择一个或多个选项。 #include <QApplication> #include <QComboBox> #include <QVBoxLayout> #include <QWidget> #include <QMessageBox>int main(int argc…...

重新整理机器学习和神经网络框架

本篇重新梳理了人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、神经网络&#xff08;NN&#xff09;和深度学习&#xff08;DL&#xff09;之间存在一定的包含关系&#xff0c;以下是它们的关系及各自内容,以及人工智能领域中深度学习分支对比整理。…...

AJAX详解

AJAX是前后端交互的重要工具 结合前后端交互基础理解&#xff1a;前后端交互详解(建议收藏)-CSDN博客 1. AJAX - 到底什么是Ajax? ajax 全名 async javascript and XML(异步JavaScript和XML)&#xff0c;是一种用于向服务器异步发送 HTTP 请求并接收响应的技术。 XML 指可扩…...

golang中的异常处理机制

今天是2024最后一天&#xff0c;祝大家新年梦想成真&#xff0c;继续我的魅力golang&#xff0c;昨天发的错误处理&#xff0c;是明显的可预见、可恢复的问题&#xff0c;然而&#xff0c;不可预见的问题&#xff0c;往往更多&#xff0c;golang也有自己的一套&#xff0c;完全…...

HTML5 开关(Toggle Switch)详细讲解

HTML5 开关&#xff08;Toggle Switch&#xff09;详细讲解 1. 任务概述 开关&#xff08;Toggle Switch&#xff09;是一种用于表示二元状态&#xff08;如开/关&#xff09;的用户界面控件。用户可以通过点击开关来切换状态&#xff0c;常见于设置选项、开关功能等场景。 2…...

【前端】Node.js使用教程

目录 一、?Node.js开发环境和编译 1.1 安装Node.js 1.2 创建一个Node.js项目 1.3 编写Node.js程序 1.4 运行Node.js程序 1.5 使用Node.js模块 二、高级的Node.js编程概念和示例 2.1 异步编程 2.2 错误处理 2.3 网络请求 2.4 构建Web服务器 2.5 数据库交互 三、No…...

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示 参考文章源码下载地址一、SDL2的创建、初始化、退出二、系统基本Tick、彩屏刷新、按键事件三、彩屏获取与设置颜色四、彩屏填充颜色及清屏五、彩屏显示中文和英文字符串六、彩屏显示数字七、彩屏初始化八、主函数测…...

BurstAttention:高效的分布式注意力计算框架

BurstAttention&#xff1a;高效的分布式注意力计算框架 在现代大型语言模型&#xff08;LLMs&#xff09;的应用中&#xff0c;提升注意力机制的计算效率已成为研究的热点。当前&#xff0c;提升计算效率主要有两种方法&#xff1a;一种是优化单设备的计算和存储能力&#xf…...

sentinel集成nacos启动报[check-update] get changed dataId error, code: 403错误排查及解决

整合nacos报403错误 因为平台写的一个限流代码逻辑有问题&#xff0c;所以准备使用sentinel来限流。平台依赖里面已经引入了&#xff0c;之前也测试过&#xff0c;把sentinel关于nacos的配置加上后&#xff0c;启动一直输出403错误 [fixed-10.0.20.188_8848-test] [check-upda…...

[TOTP]android kotlin实现 totp身份验证器 类似Google身份验证器

背景&#xff1a;自己或者公司用一些谷歌身份验证器或者microsoft身份验证器&#xff0c;下载来源不明&#xff0c;或者有广告&#xff0c;使用不安全。于是自己写一个&#xff0c;安全放心使用。 代码已开源&#xff1a;shixiaotian/sxt-android-totp: android totp authenti…...

IDEA+Docker一键部署项目SpringBoot项目

文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署 7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问…...

【发票提取明细+发票号改名】批量提取PDF电子发票明细导出Excel表格并改名技术难点,批量PDF多区域内容识别提取明细并用内容改名的小结

1、图片版的发票提取表格改名 【批量图片发票识别表格】批量图片发票的提取Excel表格和提取字段改名&#xff0c;扫描发票识别表格&#xff0c;拍照发票识别表格&#xff0c;图片发票识别改名我们在工作中很多扫描发票&#xff0c;拍照发票&#xff0c;需要整理成excel表格&am…...

pyQT + OpenCV相关练习

一、设计思路 1、思路分析与设计 本段代码是一个使用 PyQt6 和 OpenCV 创建的图像处理应用程序。其主要功能是通过一个图形界面让用户对图片进行基本的图像处理操作&#xff0c;如灰度化、翻转、旋转、亮度与对比度调整&#xff0c;以及一些滤镜效果&#xff08;模糊、锐化、边…...

石岩路边理发好去处

周末带娃去罗租公园玩&#xff0c;罗租公园旁边就是百佳华和如意豪庭小区&#xff0c;发现如意豪庭小区对面挺多路边理发摊点 理发摊点聚焦在这里的原因是刚好前面城管来了暂时避避&#xff0c;例如还有一个阿姨剪到一半就跟着过来。这里的城管只是拍了一处没有摊位的地方&…...

音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件

一、错误的命令 通过FFmpeg命令可以将mp4文件转换为ps文件&#xff0c;PS文件中包含PS流数据。 由于PS流/PS文件对应的FFInputFormat结构为&#xff1a; const FFInputFormat ff_mpegps_demuxer {.p.name "mpeg",.p.long_name NULL_IF_CONFIG_SMALL…...

整合版canal ha搭建--基于1.1.4版本

开启MySql Binlog&#xff08;1&#xff09;修改MySql配置文件&#xff08;2&#xff09;重启MySql服务,查看配置是否生效&#xff08;3&#xff09;配置起效果后&#xff0c;创建canal用户&#xff0c;并赋予权限安装canal-admin&#xff08;1&#xff09;解压 canal.admin-1…...

[python SQLAlchemy数据库操作入门]-15.联合查询,跨表获取股票数据

哈喽,大家好,我是木头左! 在开始探讨如何利用SQLAlchemy实现复杂的联合查询之前,首先需要深入理解其核心组件——对象关系映射(ORM)。ORM允许开发者使用Python类来表示数据库中的表,从而以一种更直观、面向对象的方式来操作数据库。 SQLAlchemy中的JOIN操作详解 在SQLA…...

PTA数据结构作业一

6-1 链表的插入算法 本题要求实现一个插入函数&#xff0c;实现在链表llist中的元素x之后插入一个元素y的操作。 函数接口定义&#xff1a; int InsertPost_link(LinkList llist, DataType x, DataType y); 其中 llist是操作的链表&#xff0c;x是待插入元素y的前驱节点元素…...

前端(九)js介绍(2)

js介绍(2) 文章目录 js介绍(2)一、函数1.1函数的两种形式1.2函数的作用域1.3声明与提升 二、bom操作三、dom操作 一、函数 1.1函数的两种形式 //有参函数 //js中的函数只能返回一个值&#xff0c;如果要返回多个需要放在数组或对象中 function func(a,b){return ab } func(1,…...

CUTLASS:高性能 CUDA 线性代数模板库详解

CUTLASS&#xff1a;高性能 CUDA 线性代数模板库详解 引言什么是 CUTLASS&#xff1f;CUTLASS 的主要特点&#xff1a; CUTLASS 的用途如何安装 CUTLASS1. 环境准备2. 下载 CUTLASS3. 构建 CUTLASS4. 设置环境变量5. 验证安装 使用 CUTLASSCUTLASS 的优势总结 引言 在深度学习…...

关于CISP报名费用详情

CISP即“注册信息安全专业人员”&#xff0c;是中国信息安全测评中心实施的国家认证项目&#xff0c;旨在培养信息安全领域的专业人才。对于有意报考CISP的考生而言&#xff0c;了解报名考试费用是备考过程中不可或缺的一环。 CISP的报名考试费用主要包括培训费用、考试费用、…...

css 关于flex布局中子元素的属性flex

css flex布局中子元素的属性flex 1. flex 是 flex-grow、flex-shrink 和 flex-basis 的简写 语法格式&#xff1a; flex: [flex-grow] [flex-shrink] [flex-basis];各属性解析&#xff1a; flex-grow: 子元素如何按比例分配父元素的 剩余空间。 默认值&#xff1a;0&#…...

功率器件热设计基础(四)——功率半导体芯片温度和测试方法

/ 前言 / 功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础&#xff0c;只有掌握功率半导体的热设计基础知识&#xff0c;才能完成精确热设计&#xff0c;提高功率器件的利用率&#xff0c;降低系统成本&#xff0c;并保证系统的可靠性。 功率器件热设计基础系列文章会…...

OpenStack系列第四篇:云平台基础功能与操作(Dashboard)

文章目录 1. 镜像&#xff08;Image&#xff09;添加镜像查看镜像删除镜像 2. 卷&#xff08;Volume&#xff09;创建卷查看卷删除卷 3. 网络&#xff08;虚拟网络&#xff09;创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对&#xff08…...

WebSocket封装

提示:记录工作中遇到的需求及解决办法 文章目录 前言二、背景三、WebSocket3.1 什么是 WebSocket ?为什么使用他?四、封装 WebSocket4.1 Javascript 版本4.2 Typescript 版本4.3 如何使用?五、我的痛点如何处理前言 本文将介绍 WebSocket 的封装,比如:心跳机制,重连和一…...

面试题解,JVM的运行时数据区

一、请简述JVM运行时数据区的组成结构及各部分作用 总览 从线程持有的权限来看 线程私有区 虚拟机栈 虚拟机栈是一个栈结构&#xff0c;由许多个栈帧组成&#xff0c;一个方法分配一个栈帧&#xff0c;线程每执行一个方法时都会有一个栈帧入栈&#xff0c;方法执行结束后栈帧…...

【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解

一个愿意伫立在巨人肩膀上的农民...... Crontab是Linux和类Unix操作系统下的一个任务调度工具&#xff0c;用于周期性地执行指定的任务或命令。Crontab允许用户创建和管理计划任务&#xff0c;以便在特定的时间间隔或时间点自动运行命令或脚本。这些任务可以按照分钟、小时、日…...

Caffeine Cache Java缓存组件

缓存组件Caffeine Cache 定义介绍整合springboot用法整合spring-boot-starter-cache用法 定义介绍 特性 高性能&#xff1a;基于高效并发设计和 TinyLFU 算法&#xff0c;命中率高。 丰富策略&#xff1a;支持容量限制、过期时间、异步加载、自定义清理策略。 统计监控&#x…...

电子电气架构 --- 什么是自动驾驶技术中的域控制单元(DCU)?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

Redis核心技术知识点全集

Redis数据结构和常用命令 1. String字符串2. Hash哈希3. List列表4. Set集合5. Sorted Set有序集合6. Redis常用命令参考Redis事务机制...

【每日学点鸿蒙知识】文件读写、屏幕宽度亮度、扫一扫权限、编码器问题、wlan设置

1、参照文档&#xff0c;在操作文件时&#xff0c;读取不到内容或出现程序闪退&#xff1f; 参照文档&#xff0c;进行文件写入和读取时&#xff0c;出现读取不到或闪退 export function createFile() {// 获取应用文件路径let context getContext(this) as common.UIAbilit…...