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

18爬虫:关于playwright相关内容的学习

1.如何在python中安装playwright

打开pycharm,进入终端,输入如下的2个命令行代码即可自动完成playwright的安装

pip install playwright  ——》在python中安装playwright第三方模块

playwright install ——》安装playwright所需的工具插件和所支持的浏览器

看到这里,是否想要动手进行安装。先不要着急,playwright对安装环境也是有一定要求的。

python版本要求Python 3.8 或更高版本
windows系统要求Windows 10+、Windows Server 2016+
MacOS系统版本要求MacOS 12 Monterey 或 MacOS 13 Ventura
linux系统版本要求Debian 11、Debian 12、Ubuntu 20.04 或 Ubuntu 22.04

2.playwright的录屏功能

playwright具有录屏功能,并自动生成相应的同步操作代码或者异步操作代码,这个功能是非常强大的。

打开pycharm进入终端,输入如下的命令

打开浏览器并启动录屏操作playwright codegen
打开浏览器并进入指定网页同时启动录屏操作playwright codegen https://www.baidu.com/
查看对应的参数playwright codegen --help

当我们在pycharm终端中输入:playwright codegen 后,会自动弹出浏览器和代码录屏窗口

我们在使用playwright弹出的浏览器时,需要讲该浏览器的搜索引擎变更问百度或者其他在国内可用的搜索引擎,原浏览器搜索引擎默认是google。

接下来我们进入百度页面,输入python,可以发现右侧的代码记录工具将我们在浏览器上的操作逐一映射成python代码,默认是生成同步代码,这个代码是可以直接在python编译环境中运行的

import re
from playwright.sync_api import Playwright, sync_playwright, expectdef run(playwright: Playwright) -> None:browser = playwright.chromium.launch(headless=False)context = browser.new_context()page = context.new_page()page.goto("https://www.baidu.com/s?ie=UTF-8&wd=%E7%99%BE%E5%BA%A6")with page.expect_popup() as page1_info:page.locator("#content_left [id=\"\\31 \"]").get_by_role("link", name="百度一下,你就知道").click()page1 = page1_info.valuepage1.locator("#kw").click()page1.locator("#kw").fill("pytho")page1.locator("#kw").press("Enter")page1.locator("#kw").press("Enter")page1.get_by_role("button", name="百度一下").click()# ---------------------context.close()browser.close()with sync_playwright() as playwright:run(playwright)

3.playwright驱动浏览器的两种方式

使用with驱动浏览器,代码如下:

from playwright.sync_api import sync_playwrightwith sync_playwright() as p: # 实例化一个playwright对象# headless设置有头模式启动浏览器browser = p.chromium.launch(headless=False) # 创建一盒浏览器对象,指定驱动的浏览器,用launch设置启动的模式context = browser.new_context() # 创建上下文,上下文可以理解为上下文的交互,同时会打开一个浏览器page = context.new_page() # 打开一个浏览器的标签页page.goto('url') # 访问的网址page.wait_for_timeout(10000) # 默认的单位是毫秒,作用类似于timeout,该种方法是playsright自带的# 正常关闭playwright的步骤page.close() # 关闭访问的页面context.close() # 关闭上下文管理工具browser.close() # 关闭浏览器

不使用with,一般使用录屏工具生成的代码都是不使用with,代码如下:

from playwright.sync_api import sync_playwrightp = sync_playwright().start() # 实例化一个playwright对象
browser = p.chromium.launch(headless=False,slow_mo=2000) # 创建一个浏览器对象,有头的模式,slow_mo表示每执行一个步骤暂停2秒
context = browser.new_context() # 创建上下文管理器
page = context.new_page() # 创建一个网页对象
page.goto("https://www.baidu.com/") # 使用网页对象访问对应url网站
page.wait_for_timeout(10000) # 等待10秒。10000毫秒page.close() # 关闭网页对象
context.close() # 关闭上下文管理器
browser.close() # 关闭浏览器对象p.stop() # 停止playwright对象

使用with驱动浏览器可以自动帮我们打开浏览器(sync_playwright().start()),也可以帮我们自动停止浏览器进程(sync_playwright().stop())。不使用with则需要我们手动开启和停止,除此以外代码逻辑没有区别。

4.playwright同时驱动两个浏览器

在同一个浏览器中使用一个context管理器管理所有的标签页,如果想要同时驱动两个浏览器或者多个浏览器,需要创建两个不同的context管理器,具体的代码如下:

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)context1 = browser.new_context()context2 = browser.new_context()page1 = context1.new_page()page2 = context2.new_page()page1.goto('https://www.baidu.com/')page2.goto('https://www.mi.com/shop')page1.wait_for_timeout(10000)page2.wait_for_timeout(10000)print(page1.title)print(page2.title)page1.close()page2.close()context1.close()context2.close()browser.close()

在上述的代码中,我们分别创建两个不同context管理器对象,并创建两个不同的浏览器页面分别访问百度和小米。

5.在同一个浏览器中访问两个不同的网页

有了驱动两个不同浏览器的基础,在同一个浏览器中访问两个不同的网页,也就是打开两个标签是非常简单的。在代码中,我们使用同一个context管理器创建两个不同的page对象分别访问不同的url,具体代码如下:

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)context = browser.new_context()# 只需要一个context对象page1 = context.new_page()page2 = context.new_page()page1.goto('https://www.baidu.com/')page2.goto('https://www.mi.com/shop')page1.wait_for_timeout(10000)page2.wait_for_timeout(10000)print(page1.title)print(page2.title)page1.close()page2.close()context.close()browser.close()

6.网页之间的切换操作

学习过前端的相关知识后,我们发现在网页上点击某一超链接,有的会在原标签页上打开超链接对应的网页,有的会打开一个新的标签页,有的会弹出一个新的浏览器窗口。那么如何才能让代码访问到新打开的网页,如何才能返回原网上上呢。

这里就需要使用context管理器中的pages属性,该属性是一个列表,记录我们当前代码打开的所有网页,索引0表示原网页,索引1表示第二次打开的网页,以此类推。

《写文章-CSDN创作中心》对应的索引为0——〉原网页

《qq_37587269-CSDN博客》对应的索引为1——〉第二次打开的网页

《路飞学城-帮助有志向的年轻人》对应的索引为2——〉第三次打开的网页

'''
网页之间的切换有些网页的超链接打开之后会新开一个标签页,也有可能是弹出一个新的窗口如果要定位新页面上面的元素的话,需要进行网页切换pages = context.pages——》上下文管理器中的pages能够记录当前浏览器打开恶所有网页pages[i].bring_to_front()——》激活当前页面的句柄# 切换网页的另外两种方式context.go_to_page(pages[i])context.go_to_url(pages[i].url)
'''from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False,slow_mo=2000)context = browser.new_context()page = context.new_page()page.goto("https://blog.csdn.net/weixin_40744274/article/details/140598126") # CSDN网页page.locator('xpath=//*[@id="markdownContent"]/p[3]/a').click() # 网页上的某一个超链接,点击之后打开一个新的标签页page.locator('xpath=//*[@id="markdownContent"]/p[4]/a').click() # 网页上的某一个超链接,点击之后打开一个新的标签页page.wait_for_timeout(5000)pages = context.pages # 获取所有的打开网页'''pages的形式是所有打开的网页的url组成的列表,url的顺序是我们打开网页的顺序,整体称为网页句柄pages = [<Page url='https://blog.csdn.net/weixin_40744274/article/details/140598126'>, <Page url='https://link.csdn.net/?from_id=140598126&target=https%3A%2F%2Fedu.51cto.com%2Fvideo%2F4645.html%3Futm_platform%3Dpc%26utm_medium%3D51cto%26utm_source%3Dzhuzhan%26utm_content%3Dwzy_tl'>, <Page url='https://link.csdn.net/?from_id=140598126&target=https%3A%2F%2Fedu.51cto.com%2Fvideo%2F3832.html%3Futm_platform%3Dpc%26utm_medium%3D51cto%26utm_source%3Dzhuzhan%26utm_content%3Dwzy_tl'>]'''print(pages)# 切换到网页2上pages[1].bring_to_front() # 调整当前playwright的视角至第二个打开的网页上pages[1].locator('xpath=//*[@id="linkPage"]/div[1]/div[2]/div[2]/a').click()pages[1].wait_for_timeout(5000)# 切换到网页3上pages[2].bring_to_front() # 调整当前playwright的视角至第三个打开的网页上pages[2].locator('xpath=//*[@id="linkPage"]/div[1]/div[2]/div[2]/a').click()pages[2].wait_for_timeout(5000)# 返回初始网页,也就是网页1page.bring_to_front() # pages[0],bring_to_front()t = page.locator('xpath=/html/head/title').inner_text() # python playwright模拟鼠标右键点击-CSDN博客print(t)page.close()context.close()browser.close()

不同网页之间的切换代码如上所示:利用context.pages中记录的不同网页对象,通过context.pages[i].bring_to_front()激活当前网页,也就是将playwright的视角切换至当前网页。综上所述,playwright切换网页依赖于context的pages属性与bring_to_front()方法。

context.pages记录当前context管理器下所有打开的网页
context.pages[i].bring_to_front()激活指定索引对应的网页

7.模拟网页中的前进与后退

当我们打开某个超链接后,有的会在原标签页上打开超链接对应的网页,此时我们不需要切换playwright的视角就可以访问新网页,这一点是非常人性化的。

当我们访问完新网页后,如何才能退回至原来的网页中呢。这时如果再使用网页切换是不可行的,在context.pages中仅仅保存了最新的url,此时需要使用page中的go_forward()与go_back()方法模拟网页中的前进与后退。具体代码如下:

'''
模拟浏览器中的前进与后退
page.go_forward()和page.go_back()方法,实现网页的前进与后退,同一网页标签上的前进与后退
'''
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)context = browser.new_context()page = context.new_page()page.goto("https://www.mi.com/?g_utm=Thirdparty.Baidu.ProductUnion.BrandZone-Baidu-PC.Brand-A-2")page.wait_for_timeout(5000)# 点击网页登录,相当于网页前进异步page.locator('xpath=//div[contains(text(),"登录")]').click()loc = page.locator('xpath=//input[@name="account"]')page.wait_for_timeout(5000)# 模拟浏览器中的前进后退page.go_back() # 网页后退page.wait_for_timeout(5000)page.go_forward() # 网页前进page.wait_for_timeout(5000)# 测试前进后退之后是否需要重新定位元素# 跳转到登录的页面loc.fill('123456')page.locator('xpath=//input[@name="password"]').fill('1234567')page.wait_for_timeout(5000)page.locator('xpath=//button[@type="submit"]').click()page.wait_for_timeout(5000)page.close()context.close()browser.close()

8.playwright中的元素定位

playwrigh中元素定位多种,这里我们仅以代码的形式演示如何使用xpath进行元素定位,代码如下:

'''
playwright中的元素定位方法playwright中有内置的get_xx_xx方法,系统默认同样也有locator()方法进行定位contains关键字的使用,对应的语法结构为contains(属性,值)and关键字的使用  例如://div[@class="uesr_name" and @id="account"]在xpath中通过文本进行定位:注意开始标签和结束标签之间的文本才是元素上的文字,元素上的文字才可以使用该种定位方法<div>文本</div>对应的语法结构为: //div[text()="输入"]也可以结合contains进行文本定位: contains(text(),'登录')xpath定位中一些不常用的定位方法playwright中的文本定位,精确匹配page.locator('text="登录"'),模糊匹配page.locator('text=登录')该定位比xpath中的定位强大很多,不仅可以定位HTML标签之间的文字,也可以定位HTML标签属性内的文字元素,也就是说只要页面上存在的文字都可以拿来使用只掌握xpath定位即可
'''from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)context = browser.new_context()page = context.new_page()page.goto("https://www.mi.com/?g_utm=Thirdparty.Baidu.ProductUnion.BrandZone-Baidu-PC.Brand-A-2")# page.locator('xpath=//div[@class="user-name"]').click() # 通过xpath定位登录按钮然后进行点击登录# xpath中关键字contains使用# page.locator('//div[contains(@class,"name")]').click() # 定位div标签,其class属性值包含name# 使用xpath进行文本定位# page.locator('xpath=//div[text()="登录"]').click()# contains结合文本进行定位page.locator('xpath=//div[contains(text(),"登录")]').click()page.wait_for_timeout(5000)# 通过xpath中的文本进行定位# 跳转到登录的页面page.locator('xpath=//input[@name="account"]').fill('123456')page.locator('xpath=//input[@name="password"]').fill('1234567')page.wait_for_timeout(5000)page.locator('xpath=//button[@type="submit"]').click()page.wait_for_timeout(5000)page.close()context.close()browser.close()

9.playwright中保存cookie信息以及如何使用cookie自动登录网页

如果想要保存cookie信息,需要使用 context.storage_state(path='login_status.json')

如果想要使用本地的cookie信息,需要在创建context对象时加入本地保留的cookie信息,context = browser.new_context(storage_state='login_status.json')

playwright保留登录的cookie信息,代码如下:

'''
context.storage_state(path='login_status.json') 将cookie保存至一个json文件中
'''
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)context = browser.new_context()page = context.new_page()page.goto("https://www.mi.com/?g_utm=Thirdparty.Baidu.ProductUnion.BrandZone-Baidu-PC.Brand-A-2")page.get_by_text("登录").click()page.locator('xpath=//*[@id="rc-tabs-0-panel-login"]/form/div[1]/div[1]/div[2]/div/div/div/div/input').fill('XXXXXX')page.locator('xpath=//*[@id="rc-tabs-0-panel-login"]/form/div[1]/div[2]/div/div[1]/div/input').fill('XXXXXX')page.locator('xpath=//*[@id="rc-tabs-0-panel-login"]/form/div[1]/div[3]/label/span[1]/input').click()page.locator('xpath=//*[@id="rc-tabs-0-panel-login"]/form/div[1]/button').press('Enter')page.wait_for_timeout(5000)# 暴露cookie信息,将对应的信息保存至json文件context.storage_state(path='login_status.json')page.close()context.close()browser.close()

使用本地保留的cookie信息登录代码如下:

'''
context.storage_state(path='login_status.json') 将cookie保存至一个json文件中
context = browser.new_context(storage_state='login_status.json')使用保留的json文件
'''
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)context = browser.new_context(storage_state='login_status.json') # 在实例化上下文的时候使用cookie信息直接登录page = context.new_page()page.goto("https://www.mi.com/?g_utm=Thirdparty.Baidu.ProductUnion.BrandZone-Baidu-PC.Brand-A-2")page.wait_for_timeout(10000)page.close()context.close()browser.close()

10:实战:bili中指定关键字搜索页面中视频的标题和作者名称

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)context = browser.new_context()page = context.new_page()page.goto("https://bilibili.com")page.locator('xpath=//input[@class="nav-search-input"]').fill('python')page.locator('xpath=//*[@id="nav-searchform"]/div[2]').click()# 此时虽然打开一个新的网页,但是playwright的视角页进行了同步切换,检查context.pages只有一个url记录t3 = page.locator('xpath=//h3').all()for t in t3:print(t.get_attribute('title'))page.wait_for_timeout(10000)page.close()context.close()browser.close()

相关文章:

18爬虫:关于playwright相关内容的学习

1.如何在python中安装playwright 打开pycharm&#xff0c;进入终端&#xff0c;输入如下的2个命令行代码即可自动完成playwright的安装 pip install playwright ——》在python中安装playwright第三方模块 playwright install ——》安装playwright所需的工具插件和所支持的…...

图解BWT(Burrows-Wheeler Transform) 算法

Burrows-Wheeler Transform (BWT) 是一种数据转换算法, 主要用于数据压缩领域. 它由 Michael Burrows 和 David Wheeler 在 1994 年提出, 广泛应用于无损数据压缩算法(如 bzip2)中. BWT 的核心思想是通过重新排列输入数据, 使得相同的字符更容易聚集在一起, 从而提高后续压缩算…...

CMake轻松实现把编译生成文件分类输出到指定路径,同时又拷贝一份到别的指定路径(Window/Linux通用)

使用CMake管理的C项目工程你是否有以下需求&#xff1a; 1.项目编译时将生成的文件分类自动输出到指定位置&#xff1b; 2.除了上面输出到指定位置以外&#xff0c;还要拷贝一份到指定位置&#xff08;包含头文件&#xff0c;配置文件&#xff0c;第三方依赖库文件等&#xf…...

AJAX笔记原理篇

黑马程序员视频地址&#xff1a; AJAX-Day03-01.XMLHttpRequest_基本使用https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p33https://www.bilibili.com/video/BV1MN411y7pw?vd_sour…...

C32.【C++ Cont】静态实现双向链表及STL库的list

目录 1.知识回顾 2.静态实现演示图 3.静态实现代码 1.初始双向链表 2.头插 3.遍历链表 4.查找某个值 4.任意位置之后插入元素 5.任意位置之前插入元素 6.删除任意位置的元素 4.STL库的list 1.知识回顾 96.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删 97.【C…...

【Elasticsearch】terms聚合误差问题

Elasticsearch中的聚合查询在某些情况下确实可能存在误差&#xff0c;尤其是在处理分布式数据和大量唯一值时。这种误差主要来源于以下几个方面&#xff1a; 1.分片数据的局部性 Elasticsearch的索引通常被分成多个分片&#xff0c;每个分片独立地计算聚合结果。由于数据在分…...

2-kafka服务端之延时操作实现原理

文章目录 背景案例延时生产实现原理延时拉取实现原理 总结 背景 上篇我们说到了kafka时间轮是延时操作内部实现的重要数据结构&#xff0c;这篇我们来说下kafka内部的延时操作实现原理。这里我们以延时生产和延时拉取为例说明延时操作的实现原理。 案例 延时生产 我们知道如…...

UE求职Demo开发日志#22 显示人物信息,完善装备的穿脱

1 创建一个人物信息显示的面板&#xff0c;方便测试 简单弄一下&#xff1a; UpdateInfo函数&#xff1a; 就是获取ASC后用属性更新&#xff0c;就不细看了 2 实现思路 在操作目标为装备栏&#xff0c;或者操作起点为装备栏时&#xff0c;交换前先判断能否交换&#xff08;只…...

【DeepSeek论文精读】6. DeepSeek R1:通过强化学习激发大语言模型的推理能力

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html&#xff09;原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】2. DeepSeek LLM&#xff1a;以长期主义扩展开源语言模型 【DeepSeek论文精读】…...

顺丰大数据开发面试题及参考答案

Flink 的提交过程是怎样的? Flink 的提交过程通常包含以下步骤: 代码编写与打包:开发人员首先使用 Flink 提供的 API 编写数据处理逻辑,包括定义数据源、转换操作和数据 sink 等。完成代码编写后,将项目打包成可执行的 JAR 文件,其中包含了所有依赖的库和资源。选择提交方…...

C# 函数多个返回值

有时候需要从C#函数中返回多个返回值&#xff0c;而且返回值的类型又不一样&#xff0c;这个时候又不能用数组或者list。 其实C#函数是支持多个不同类型的返回值的&#xff0c;请参看下面的code. //多返回值函数定义 (string name, int age) GetNameAge(int id) {return (&qu…...

Deepseek 接入Word处理对话框(隐藏密钥)

硅基流动邀请码&#xff1a;1zNe93Cp 邀请链接&#xff1a;网页链接 亲测deepseek接入word&#xff0c;自由调用对话&#xff0c;看截图有兴趣的复用代码&#xff08;当然也可以自己向deepseek提问&#xff0c;帮助你完成接入&#xff0c;但是提问逻辑不一样给出的答案是千差万…...

RabbitMQ深度探索:简单实现 MQ

基于多线程队列实现 MQ &#xff1a; 实现类&#xff1a; public class ThreadMQ {private static LinkedBlockingDeque<JSONObject> broker new LinkedBlockingDeque<JSONObject>();public static void main(String[] args) {//创建生产者线程Thread producer n…...

Baklib赋能数字内容体验个性化推荐提升用户体验的未来之路

内容概要 随着数字化时代的不断发展&#xff0c;用户对内容消费的需求日益多样化&#xff0c;个性化推荐成为提升用户体验的重要手段。Baklib以其先进的技术手段&#xff0c;在数字内容领域内积极推动个性化推荐的实施&#xff0c;从而满足用户在信息获取和内容消费中的独特需…...

使用 TensorRT 和 Python 实现高性能图像推理服务器

在现代深度学习和计算机视觉应用中&#xff0c;高性能推理是关键。本文将介绍如何使用 TensorRT 和 Python 构建一个高性能的图像推理服务器。该服务器能够接收客户端发送的图像数据&#xff0c;使用 TensorRT 进行推理&#xff0c;并将结果返回给客户端。 1. 概述 1.1 项目目…...

[MySQL#1] database概述 常见的操作指令 MySQL架构 存储引擎

#1024程序员节&#xff5c;征文# 目录 一. 数据库概念 0.连接服务器 1. 什么是数据库 口语中的数据库 为什么数据不直接以文件形式存储&#xff0c;而需要使用数据库呢&#xff1f; 总结 二. ??基础操作 三. 主流数据库 四. 基础知识 服务器&#xff0c;数据库&…...

WebAssembly:前后端开发的未来利器

引言 在互联网的世界里&#xff0c;前端和后端开发一直是两块重要的领域。而 JavaScript 长期以来是前端的霸主&#xff0c;后端则有各种语言诸如 Java、Python、Node.js、Go 等等。然而&#xff0c;近年来一个名为 WebAssembly (Wasm) 的技术正在逐渐改变这一格局。它的高性能…...

Spring Task之Cron表达式

&#x1f31f; Spring Task高能预警&#xff1a;你以为的Cron表达式可能都是错的&#xff01;【附实战避坑指南】 开篇暴击&#xff1a;为什么你的定时任务总在凌晨3点翻车&#xff1f; “明明设置了0 0 2 * * ?&#xff0c;为什么任务每天凌晨3点执行&#xff1f;” —— 来…...

deepseek API 调用-python

【1】创建 API keys 【2】安装openai SDK pip3 install openai 【3】代码&#xff1a; https://download.csdn.net/download/notfindjob/90343352...

数字滤波器的分类

数字滤波器可以根据不同的标准进行分类&#xff0c;以下是几种常见的分类方式&#xff1a; 1. 按实现结构分类 FIR滤波器&#xff08;有限脉冲响应滤波器&#xff09; - 特点&#xff1a;系统的脉冲响应在有限时间内衰减到零。 - 优点&#xff1a;线性相位特性&#xff08;保…...

iOS 老项目适配 #Preview 预览功能

前言 iOS 开发者 最憋屈的就是UI 布局慢,一直以来没有实时预览功能,虽然swiftUI 早就支持了,但是目前主流还是使用UIKit在布局,iOS 17 苹果推出了 #Preview 可以支持UIKit 实时预览,但是仅仅是 iOS 17,老项目怎么办呢?于是就有了这篇 老项目适配 #Preview 预览 的文章,…...

高等代数笔记—域与一元多项式

域与环 数域 F F F&#xff1a;至少包含两个元素且对加减乘除运算封闭的复数集合 F F F&#xff0c;其中作除运算时除数不为0。 封闭&#xff1a;集合 F F F中的两个元素作某一运算的结果仍属于集合 F F F&#xff0c;则称 F F F对该运算封闭。 Q , R , C \mathbb{Q}, \mathbb…...

【C语言设计模式学习笔记1】面向接口编程/简单工厂模式/多态

面向接口编程可以提供更高级的抽象&#xff0c;实现的时候&#xff0c;外部不需要知道内部的具体实现&#xff0c;最简单的是使用简单工厂模式来进行实现&#xff0c;比如一个Sensor具有多种表示形式&#xff0c;这时候可以在给Sensor结构体添加一个enum类型的type&#xff0c;…...

2.Python基础知识:注释、变量以及数据类型、标识符和关键字、输入函数、输出函数、运算符、程序类型转换

1. 注释 注释是用来解释代码&#xff0c;增强代码可读性的部分。在 Python 中&#xff0c;注释分为单行注释和多行注释。 单行注释&#xff1a;以 # 开头&#xff0c;后面的内容都被视为注释。 # 这是一个单行注释 print("Hello, World!") # 输出 "Hello, Wor…...

介绍10个比较优秀好用的Qt相关的开源库

记录下比较好用的一些开源库 1. Qt中的日志库“log4qt” log4qt 是一个基于 Apache Log4j 设计理念的 Qt 日志记录库&#xff0c;它为 Qt 应用程序提供了强大而灵活的日志记录功能。Log4j 是 Java 领域广泛使用的日志框架&#xff0c;log4qt 借鉴了其优秀的设计思想&#xff…...

利用Muduo库实现简单且健壮的Echo服务器

一、muduo网络库主要提供了两个类&#xff1a; TcpServer&#xff1a;用于编写服务器程序 TcpClient&#xff1a;用于编写客户端程序 二、三个重要的链接库&#xff1a; libmuduo_net、libmuduo_base、libpthread 三、muduo库底层就是epoll线程池&#xff0c;其好处是…...

渗透测试之文件包含漏洞 超详细的文件包含漏洞文章

目录 说明 通常分为两种类型&#xff1a; 本地文件包含 典型的攻击方式1&#xff1a; 影响&#xff1a; 典型的攻击方式2&#xff1a; 包含路径解释&#xff1a; 日志包含漏洞&#xff1a; 操作原理 包含漏洞读取文件 文件包含漏洞远程代码执行漏洞: 远程文件包含…...

高性能 :DeepSeek-V3 inference 推理时反量化实现 fp8_cast_bf16

FP8 (8 bits) & FP16 (16 bits) FP8 和 BF16 都是浮点数格式&#xff08;floating-point formats&#xff09;&#xff0c;float通过科学计数法表示数据&#xff0c;float [符号位指数位系数位] FP8 (8 bits)&#xff1a;SEEEMMMMFP16 (16 bits)&#xff1a;SEEEEEMMMMM…...

kakailio官网推荐的安装流程ubuntu 22.04

https://kamailio.org/docs/tutorials/6.0.x/kamailio-install-guide-git/ # 非必须项 wget -O- https://deb.kamailio.org/kamailiodebkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/kamailio.gpg在/etc/apt/sources.list文件追加以下内容 deb [signed-by/usr/sh…...

能否通过蓝牙建立TCP/IP连接来传输数据

前言&#xff1a; 最近在做一个项目时&#xff0c;产生了一个疑问&#xff1a;能否通过蓝牙建立TCP/IP连接来传输数据 查阅了一些文章&#xff0c;可以得出结论&#xff1a;不行 下面是我截取的两篇个人认可的文章的回答&#xff1a; 文章一&#xff1a; 蓝牙是一种短距离无…...

git基础使用--1--版本控制的基本概念

文章目录 git基础使用--1--版本控制的基本概念1.版本控制的需求背景&#xff0c;即为啥需要版本控制2. 集中式版本控制SVN3. 分布式版本控制 Git4. SVN和Git的比较 git基础使用–1–版本控制的基本概念 1.版本控制的需求背景&#xff0c;即为啥需要版本控制 先说啥叫版本&…...

高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案

目录 一、Ollama 介绍 二、Ollama下载 2.1 官网下载 2.2 GitHub下载 三、模型库 四、Ollmal 使用 4.1 模型运行&#xff08;下载&#xff09; 4.2 模型提问 五、Ollama 常用命令 相关推荐 一、Ollama 介绍 Ollama是一个专为在本地机器上便捷部署和运行大型语言模型&…...

高级java每日一道面试题-2025年01月30日-框架篇[SpringBoot篇]-如何理解 Spring Boot 配置加载顺序 ?

如果有遗漏,评论区告诉我进行补充 面试官: 如何理解 Spring Boot 配置加载顺序 ? 我回答: 在 Java 高级面试中讨论 Spring Boot 配置加载顺序时&#xff0c;理解其机制对于有效管理和调试应用程序配置至关重要。Spring Boot 通过一系列预定义的规则来确定如何加载和覆盖配置…...

代码随想录day06

242.有效的字母异位词 刚学哈希表想着使用unordered_set来实现&#xff0c;结果无法通过&#xff0c;原因是对字母异位词理解有问题&#xff0c;字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语&#xff0c;并使用所有原字母一次。对字母出现的次数有要求&am…...

C#常用744单词

1.visual 可见的 2.studio 工作室 3.dot 点 4.net 网 5.harp 尖端的&#xff0c;锋利的。 6.amework 骨架&#xff0c;构架&#xff0c;框架 7.beta 测试版&#xff0c;试用版 8.XML&#xff08;全称&#xff1a;eXtensible Markup Language&#xff09…...

14.PPT:中国注册税务师协会宣传【26】

目录 NO12 NO3/4/5​ NO678​ 【文本框水平/垂直居中】【文本框内容水平/垂直居中】 NO12 坑&#xff1a;注意❗Word文档的PPt素材.docx的标题大纲是混乱的&#xff0c;虽然他设置了&#xff0c;所以我们需要重新设置 设计→主题视图→幻灯片母版→删除版式插入logo NO3/4…...

Python大数据可视化:基于Python的王者荣耀战队的数据分析系统设计与实现_flask+hadoop+spider

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 比赛信息管理 看板展示 系统管理 摘要 本文使用Python与…...

简单3步部署本地国产大模型DeepSeek大模型

简单3步部署本地国产大模型DeepSeek大模型 DeepSeek是最近非常火的开源大模型&#xff0c;国产大模型 DeepSeek 凭借其优异的性能和对硬件资源的友好性&#xff0c;受到了众多开发者的关注。 无奈&#xff0c;在使用时候deepseek总是提示服务器繁忙&#xff0c;请稍后再试。 …...

Redis常见数据类型与编码方式

⭐️前言⭐️ 本小节围绕Redis中常见的数据类型与编码方式展开。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主日常练习代码均已上传GitHu…...

利用matlab寻找矩阵中最大值及其位置

目录 一、问题描述1.1 max函数用法1.2 MATLAB中 : : :的作用1.3 ind2sub函数用法 二、实现方法2.1 方法一&#xff1a;max和find2.2 方法二&#xff1a;max和ind2sub2.3 方法对比 三、参考文献 一、问题描述 matlab中求最大值可使用函数max&#xff0c;对于一维向量&#xff0…...

解锁云电脑爽玩TGA游戏,ToDesk、海马云等多款云电脑游戏横测

作为一名游戏爱好者&#xff0c;我深入研究了云电脑技术在游戏娱乐中的应用。通过对比传统游戏机与云电脑的成本效益&#xff0c;我发现云电脑以其低成本和灵活性脱颖而出。我以自身为例&#xff0c;分析了云电脑如何满足对游戏体验的高要求。在测评中&#xff0c;我选择了ToDe…...

蓝桥杯思维训练(五)

文章目录 子集II1191.K次串联后最大子数组之和 子集II 子集II 思路分析&#xff1a; 求解子集的问题的关键就是&#xff0c;通过递归与回溯&#xff0c;我们就是得确定以某个元素开始的子集&#xff0c;对于这个题目来说&#xff0c;比较麻烦的一点就是&#xff0c;存在重复的…...

kaggle视频行为分析1st and Future - Player Contact Detection

这次比赛的目标是检测美式橄榄球NFL比赛中球员经历的外部接触。您将使用视频和球员追踪数据来识别发生接触的时刻&#xff0c;以帮助提高球员的安全。两种接触&#xff0c;一种是人与人的&#xff0c;另一种是人与地面&#xff0c;不包括脚底和地面的&#xff0c;跟我之前做的这…...

2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品

2024年12月&#xff0c;中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛&#xff08;简称2024 CCF BDCI&#xff09;。本届比赛的算能赛道吸引了1748名选手报名&#xff0c;经过激烈角逐&#xff0c;北京航空航天大学的“常务副SOTA”团队脱颖而出&#xf…...

结合深度学习、自然语言处理(NLP)与多准则决策的三阶段技术框架,旨在实现从消费者情感分析到个性化决策

针对电商个性化推荐场景的集成机器学习和稳健优化三阶段方案。 第一阶段:在线评论数据处理&#xff0c;利用深度学习和自然语言处理技术进行特征挖掘&#xff0c;进而进行消费者情感分析&#xff0c;得到消费者偏好 在第一阶段&#xff0c;我们主要关注如何通过深度学习和自然语…...

Linux系统安装Nginx详解(适用于CentOS 7)

目录 1. 更新系统包 2. 安装EPEL仓库 3. 安装Nginx 4. 启动Nginx服务 5. 设置Nginx开机自启 6. 检查Nginx状态 7. 配置防火墙 8. 访问Nginx默认页面 9. 配置Nginx&#xff08;可选&#xff09; 10. 重启Nginx 解决步骤 1. 检查系统版本 2. 移除错误的 Nginx 仓库 …...

Qt常用控件 输入类控件

文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1&#xff0c;录入用户信息1.4 例子2&#xff0c;正则验证手机号1.5 例子3&#xff0c;验证输入的密码1.6 例子4&#xff0c;显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1&#xff0c;获取输入框的内容2.4 例…...

[LeetCode]全排列I,II

全排列I 给定一个不含重复数字的整数数组 nums &#xff0c;返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#xff1…...

力扣.270. 最接近的二叉搜索树值(中序遍历思想)

文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的中序遍历) 本题的难点在于可能存在多个答案&#xff0c;并且要返回最小的那一个&#xff0c;为了解决这个问题&#xff0c;我门则要利用上二叉搜索树中序遍历为有序序列的特性&#xff0c;具体到代码中&a…...

Spring 核心技术解析【纯干货版】- VIII:Spring 数据访问模块 Spring-Tx 模块精讲

在企业级开发中&#xff0c;事务管理是保障数据一致性和完整性的重要手段。Spring 作为 Java 生态中广泛使用的框架&#xff0c;其事务管理模块&#xff08;Spring-Tx&#xff09;不仅提供了强大的功能&#xff0c;还极大地简化了开发者在不同技术栈中的事务处理工作。无论是编…...