Python爬虫第17节-动态渲染页面抓取之Selenium使用下篇
目录
引言
一、获取节点信息
1.1 获取属性
1.2 获取文本值
1.3 获取ID、位置、标签名、大小
二、切换Frame
三、延时等待
3.1 隐式等待
3.2 显式等待
四、前进后退
五、Cookies
六、选项卡管理
七、异常处理
引言
这一节我们继续讲解Selenium的使用下篇,在利用Selenium进行网页操作时,获取节点信息以及应对各种相关场景是关键环节。很多人起初习惯通过获取网页源代码,再用解析库提取信息,但其实Selenium自身就蕴含着诸多更便捷的方式。接下来,我们就深入了解下如何借助Selenium直接获取节点信息,以及处理Frame切换、等待、Cookies操作等一系列实用技巧。
一、获取节点信息
前文提到,通过page_source属性可获取网页源代码,进而使用正则表达式、Beautiful Soup、pyquery等解析库提取信息。
然而,既然Selenium已提供选择节点的方法,且返回的是WebElement类型,那么它必然也具备直接提取节点属性、文本等信息的方法和属性。如此一来,我们便无需通过解析源代码来获取信息,操作更加便捷。
接下来,让我们看看如何获取节点信息。
1.1 获取属性
如果想要获取网页中某个节点的属性值,我们可以运用`get_attribute()`方法来达成这一目的。不过需要注意的是,在使用这个方法之前,必须要先将目标节点选中才行。下面为你展示具体的示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()
url = 'https://www.baidu.com/'
browser.get(url)# 旧版API
# logo = browser.find_element_by_id('zh-top-link-logo')
# 新版API
logo = browser.find_element(By.ID, 'lg')print(logo)
print(logo.get_attribute('class'))
当执行这段代码时,程序将自动启动浏览器并访问百度页面。随后,程序会在页面中定位到百度的logo节点,进而获取并打印出该节点的相关信息,以及它的`class`属性值。在控制台中呈现的输出结果如下:
使用`get_attribute()`方法时,只要在调用该方法的过程中传入你期望获取的节点属性名称,就可以顺利地获取到该属性所对应的值。
1.2 获取文本值
对于每一个`WebElement`类型的节点而言,它们都具备`text`这一属性。在实际操作中,我们仅需直接调用该属性,就能够获取到这个节点内部所包含的文本信息。这种获取文本信息的方式,和`Beautiful Soup`库中的`get_text()`方法,以及`pyquery`库中的`text()`方法的作用类似。下面给出具体的示例来进行说明:
from selenium import webdriver
from selenium.webdriver.common.by import By
import timebrowser = webdriver.Chrome()
url = 'https://www.zhihu.com/signin?next=%2F'
browser.get(url)# 等待页面加载
time.sleep(2)# 新版API
# 不能处理带空格,对于包含多个类名的元素,我们应该使用 CSS 选择器。
#button = browser.find_element(By.CLASS_NAME, '')# 新版API - 使用CSS选择器
button = browser.find_element(By.CSS_SELECTOR, '.Button.SignFlow-submitButton')print(button.text)
这段代码的执行逻辑是这样的:首先,它会启动并打开知乎的页面。页面加载完毕后,代码会在页面中找到“登录注册”按钮对应的节点。在成功获取该节点之后,代码便会将这个节点的文本值打印输出。
控制台打印结果为:
登录/注册
1.3 获取ID、位置、标签名、大小
除了前面提到的属性之外,`WebElement`节点还拥有一些其他非常实用的属性。就像`id`属性,通过它可以获取到节点对应的`id`标识;`location`属性则专门用来获取该节点在网页页面中所处的相对位置;`tag_name`属性能够让我们得知节点的标签名称;而`size`属性可以获取到节点的尺寸大小,也就是它的宽度和高度信息。下面通过具体的示例来展示这些属性的使用方法:
from selenium import webdriver
from selenium.webdriver.common.by import By
import timebrowser = webdriver.Chrome()
url = 'https://www.zhihu.com/signin?next=%2F'
browser.get(url)# 等待页面加载
time.sleep(2)# 新版API
# 不能处理带空格,对于包含多个类名的元素,我们应该使用 CSS 选择器。
#button = browser.find_element(By.CLASS_NAME, '')# 新版API - 使用CSS选择器
button = browser.find_element(By.CSS_SELECTOR, '.Button.SignFlow-submitButton')print(button.text)
print(button.id)
print(button.location)
print(button.tag_name)
print(button.size)
输出结果:
上述代码首先获取“登录注册”按钮这个节点,接着调用其`id`、`location`、`tag_name`、`size`属性来获取相应的属性值。通过这些属性,我们能更全面地了解节点在页面中的特征和位置信息,有助于更精准地进行页面元素的操作和分析 。
二、切换Frame
在网页里,有一种节点叫做`iframe`,也就是子Frame。它就像是页面里嵌套的子页面,有着和外部网页一样的结构。当使用Selenium打开网页时,默认是在父级Frame的环境下进行操作的。要是页面中有子Frame,直接操作的话,是没办法获取到子Frame里面的节点的。要是想操作子Frame里的内容,就得用`switch_to.frame()`方法来切换Frame。下面是具体的示例:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementExceptionbrowser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)browser.switch_to.frame('iframeResult')
try:# 旧版API# logo = browser.find_element_by_class_name('logo')# 新版APIlogo = browser.find_element(By.CLASS_NAME, 'logo')
except NoSuchElementException:print('NO LOGO')
browser.switch_to.parent_frame()# 旧版API
# logo = browser.find_element_by_class_name('logo')
# 新版API
logo = browser.find_element(By.CLASS_NAME, 'logo')print(logo)
print(logo.text)
控制台输出:
上述代码以之前演示动作链操作的网页作为示例。一开始,利用`switch_to.frame()`方法进入子Frame,接着尝试查找子Frame里的`logo`节点。但实际上,子Frame中并没有这个节点,这就会触发`NoSuchElementException`异常。捕获到这个异常后,程序会输出`NO LOGO`。之后,使用`switch_to.parent_frame()`方法返回父级Frame,再次去获取`logo`节点,这时就能够成功获取到该节点,并且打印出节点及其文本内容。
由此可知,当网页包含子Frame时,如果要获取子Frame内的节点,一定要先使用`switch_to.frame()`方法切换到相应的Frame,之后才能继续进行后续操作。不然,可能会因为找不到节点而致使操作失败。
三、延时等待
在Selenium里,`get()`方法会在网页框架加载结束时执行完毕。不过,这时获取的`page_source`,有可能不是浏览器完全加载好的页面内容。要是页面有额外的Ajax请求,仅靠网页源代码或许无法成功获取相关数据。所以,得设置延时等待,保证所需的节点都已经加载出来。
延时等待的方式主要有两种,分别是隐式等待和显式等待。
3.1 隐式等待
当运用隐式等待开展测试工作时,要是Selenium在文档对象模型(DOM)里找不到指定的节点,它不会马上停止,而是会继续等待。要是超过了预先设定的时间,还是没找到节点,就会抛出节点未找到的异常。简单来讲,在查找节点时,如果这个节点没有立刻出现,隐式等待会让程序等待一段时间之后,再去查找DOM中的节点。需要注意的是,隐式等待的默认等待时间是0。下面是具体的示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
import timebrowser = webdriver.Chrome()
browser.implicitly_wait(10)
url = 'https://www.zhihu.com/signin?next=%2F'
browser.get(url)# 新版API
# 不能处理带空格,对于包含多个类名的元素,我们应该使用 CSS 选择器。
#button = browser.find_element(By.CLASS_NAME, '')# 新版API - 使用CSS选择器
button = browser.find_element(By.CSS_SELECTOR, '.Button.SignFlow-submitButton')print(button)
在上述代码里,借助`implicitly_wait()`方法将隐式等待时间设定成了10秒。这意味着当Selenium查找节点却未能立即找到时,会持续等待10秒,若10秒内节点加载出来则继续执行后续操作,若超过10秒仍未找到节点,就会抛出节点未找到的异常。
3.2 显式等待
隐式等待在实际应用中效果并非总能尽如人意,这是因为它所设置的等待时间是固定的。然而,页面的加载时间会受到网络状况、服务器响应等多种因素的影响,固定的等待时间难以适配各种复杂情况。
相比之下,显式等待就要灵活得多。它允许我们明确指定要查找的节点,同时设定最长的等待时间。在规定的时间范围内,如果节点成功加载完成,程序就会返回该节点;但要是超过了设定时间,节点依旧没有加载出来,程序便会抛出超时异常。下面通过一个示例来具体说明:
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 ECbrowser = webdriver.Chrome()
browser.get('https://www.taobao.com/')# 等待页面加载
wait = WebDriverWait(browser, 10)# 定位搜索输入框
# 使用ID定位更准确
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))# 定位搜索按钮
# 使用更精确的CSS选择器
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.btn-search.tb-bg')))print("搜索框:", input)
print("搜索按钮:", button)
print("搜索框类型:", input.get_attribute('type'))
print("搜索按钮文本:", button.text)
在这段代码里,首先引入了`WebDriverWait`对象,并且把最长等待时间设定成了10秒。接着调用`until()`方法,同时传入等待条件`expected_conditions`。就拿`presence_of_element_located`这个条件来说,它代表节点已经完成加载,其参数是节点的定位元组,这里指的是ID为`q`的搜索框节点。也就是说,在10秒的时间内,要是ID为`q`的节点成功加载出来,程序就会返回这个节点;要是超过10秒还没加载好,就会抛出异常。
对于按钮节点,等待条件被设置为`element_to_be_clickable`(节点可点击),也就是去查找CSS选择器为`.btn - search`的按钮。若在10秒内这个按钮变得可以点击(意味着已经成功加载),程序就会返回该按钮节点;若超过10秒按钮还是不可点击(即未加载完成),同样会抛出异常。
当网络状况良好时,运行这段代码能够成功加载并输出这两个节点。具体的控制台输出如下:
控制台输出如下:
搜索框: <selenium.webdriver.remote.webelement.WebElement (session="958f257d68f99e09f2e00835aa7eea4d", element="f.EF316286D5F2BC448BCF689697FBF6B0.d.ECC671338A30A18D014C352C3583444B.e.2")>
搜索按钮: <selenium.webdriver.remote.webelement.WebElement (session="958f257d68f99e09f2e00835aa7eea4d", element="f.EF316286D5F2BC448BCF689697FBF6B0.d.ECC671338A30A18D014C352C3583444B.e.12")>
搜索框类型: text
搜索按钮文本: 搜索
一旦网络状态不好,在那预先设定的10秒时间内,节点无法顺利完成加载,这种情况下程序就会抛出`TimeoutException`异常。
此外,等待条件的类型其实是多种多样的,除了前面提到的那些,还可以用来判断网页的标题内容,或者查看某个节点内部是不是包含特定的文字信息等等。所有的等待条件以及它们对应的含义,都详细地罗列在了下表当中。
等待条件及其含义
若你想了解更多关于等待条件参数的详细信息以及它们的具体用法,可查阅官方文档,链接为:(http://selenium - python.readthedocs.io/api.html#module - selenium.webdriver.support.expected_conditions)。在该文档中你能获取更全面和深入的讲解。
四、前进后退
在日常使用浏览器的过程中,前进和后退功能是我们经常会用到的。而Selenium也提供了对这些操作的支持。在Selenium里,通过调用`back()`方法就能实现浏览器页面的后退操作,使用`forward()`方法则可以实现页面的前进操作。下面为你展示具体的示例代码:
import time
from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.python.org/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()
在上述代码里,程序首先会依次访问百度、淘宝以及Python官网这三个网页。接着调用`back()`方法,此时浏览器会向后退回到淘宝页面。在等待1秒钟之后,再调用`forward()`方法,浏览器便会前进到Python官网页面,最后关闭浏览器。借助这样的操作方式,我们能够在Selenium所驱动的浏览器中模拟用户在浏览网页时前进和后退的操作。
五、Cookies
借助Selenium,我们可以非常方便地对Cookies进行各类操作,像获取Cookies信息、添加新的Cookies以及删除指定的Cookies等。下面是具体的示例代码,它将展示如何使用Selenium来完成这些操作:
from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
在代码执行时,第一步是访问知乎页面。当页面加载完毕后,浏览器会自动生成Cookies。此时调用`get_cookies()`方法,就能获取到页面所有的Cookies信息并打印输出。
随后,使用`add_cookie()`方法来添加一个新的Cookie,该方法需要传入一个字典,字典里要包含`name`(名称)、`domain`(域)和`value`(值)等必要信息。再次调用`get_cookies()`方法时,输出结果中会显示新增了刚刚添加的那个Cookie。
最后,执行`delete_all_cookies()`方法,这个操作会把所有的Cookies都删除。当再次获取Cookies时,得到的结果就会为空。
下面是控制台可能出现的输出情况:
没错,利用上述提到的`get_cookies()`、`add_cookie()`和`delete_all_cookies()`等方法,可轻松对浏览器里的Cookies进行管理和操作。无论是在测试环境中模拟用户登录状态,还是在数据采集时处理特定的用户标识信息,这些操作都能灵活满足不同场景下的数据处理需求,提升自动化测试与数据处理的效率和准确性。
六、选项卡管理
在日常浏览网页过程中,我们经常会同时打开多个选项卡来提高浏览效率。在Selenium里,也具备对选项卡进行操作的能力。下面是一个示例,为你展示如何在Selenium中操作选项卡:
import time
from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.baidu.com')# 打开新窗口
browser.execute_script('window.open()')
print(browser.window_handles)# 切换到新窗口
# 旧版API
# browser.switch_to_window(browser.window_handles[1])
# 新版API
browser.switch_to.window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)# 切换回第一个窗口
# 旧版API
# browser.switch_to_window(browser.window_handles[0])
# 新版API
browser.switch_to.window(browser.window_handles[0])
browser.get('https://python.org')
控制台输出如下:
在上述代码中,整体操作模拟了用户在浏览器中对多个选项卡进行管理的场景。具体而言,一开始打开百度页面,之后借助`execute_script()`方法执行`window.open()`这条JavaScript语句,从而新开一个选项卡。`window_handles`属性发挥了重要作用,调用它可以获取当前所有已打开选项卡的信息,它会返回一个包含各选项卡代号的列表。
要想实现选项卡之间的切换,新版switch_to.window方法就派上用场了,只需把目标选项卡的代号作为参数传入即可。在示例里,先将第二个选项卡的代号传入该方法,成功切换到第二个选项卡后,在这个选项卡中打开了淘宝页面。等待1秒之后,又把第一个选项卡的代号传入switch_to.window 方法,从而切换回第一个选项卡,并在该选项卡中打开了Python官网页面。
通过这样的操作方式,能够在Selenium中灵活地对多个选项卡进行管理,完美模拟了用户在实际浏览网页时于不同页面间进行切换的操作。
七、异常处理
在运用Selenium开展自动化测试或者网页操作时,各种异常情况难以避免,像超时异常、节点未找到异常等错误都可能出现。一旦碰到这类错误,程序往往会停止运行。为了防止程序因为异常而中断,我们可以借助`try - except`语句来捕获并处理各种异常。
下面先通过一个节点未找到的异常示例,来看看如何运用`try - except`语句进行异常处理:
from selenium import webdriver
from selenium.webdriver.common.by import Bybrowser = webdriver.Chrome()
browser.get('https://www.baidu.com')# 旧版API
# browser.find_element_by_id('hello')
# 新版API
browser.find_element(By.ID, 'hello')
上述代码在打开百度页面之后,试图去查找一个ID为`hello`的节点,然而这个节点实际上并不存在于页面中,所以会触发异常。当代码运行起来,控制台就会输出相应的错误信息,下面是具体的输出情况:
从输出情况能够看出,代码抛出了`NoSuchElementException`异常,一般而言,这意味着在页面中没有找到指定的节点。为了避免程序因为这样的异常而中断运行,我们可以采用`try - except`语句来捕获并处理异常。下面是具体的示例代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException, NoSuchElementExceptionbrowser = webdriver.Chrome()
try:browser.get('https://www.baidu.com')
except TimeoutException:print('Time Out')
try:browser.find_element(By.ID, 'hello')
except NoSuchElementException:print('No Element')
finally:browser.close()
在这段代码里,`try - except`语句发挥了重要作用,它能够捕获不同操作时可能出现的异常。针对`get()`方法,代码捕获`TimeoutException`异常,一旦出现超时情况,就会输出`Time Out`。而对于`find_element_by_id()`方法,捕获的是`NoSuchElementException`异常,要是没有找到指定的节点,便会输出`No Element`。
另外,代码里的`finally`块保证了无论是否有异常发生,浏览器最终都会被关闭。下面是控制台可能出现的输出内容:
No Element
要是还想了解更多Selenium里的异常类,能去参考官方文档,链接是:(http://selenium - python.readthedocs.io/api.html#module - selenium.common.exceptions) 。
上面把Selenium的各项功能都介绍了一遍,到这儿,咱们对它的常用操作方法也都清楚了。有了Selenium,处理JavaScript动态渲染的页面就简单多了。在网页数据抓取、自动化测试这些工作中,Selenium可是个既强大又好用的工具。不管是做简单的页面操作,还是获取复杂的动态数据,Selenium都能派上大用场,让我们高效完成任务。往后,大家可以根据自己实际的需求,进一步去研究和使用Selenium的更多高级功能,来解决不同场景下网页数据处理和测试的问题 。
相关文章:
Python爬虫第17节-动态渲染页面抓取之Selenium使用下篇
目录 引言 一、获取节点信息 1.1 获取属性 1.2 获取文本值 1.3 获取ID、位置、标签名、大小 二、切换Frame 三、延时等待 3.1 隐式等待 3.2 显式等待 四、前进后退 五、Cookies 六、选项卡管理 七、异常处理 引言 这一节我们继续讲解Selenium的使用下篇࿰…...
【数据结构】第四弹——LinkedList与链表
文章目录 一. ArrayList 的缺陷二.链表2.1 链表的概念及结构2.2 链表的结构2.2.1 单向或者双向2.2.2 带头或者不带头2.2.3 循环非循环 2.3 链表的实现1. IList接口2. MySingleList 类中具体实现(不带头单向非循环链表)1. 节点抽象成内部类手搓一个链表2. 头插法3. 尾插法4. 指定…...
设计模式从入门到精通之(五)观察者模式
观察者模式:实现高效事件通知的秘诀 在日常生活中,我们经常需要同步通知多方的信息变更。比如天气预报系统、股票价格波动提醒、社交媒体的点赞通知等。这些场景中,通知机制需要高效、灵活,而不会因为通知方的变化影响系统整体。 …...
chili3d调试笔记3 加入c++ 大模型对话方法 cmakelists精读
加入 #include <emscripten/bind.h> #include <emscripten/val.h> #include <nlohmann/json.hpp> 怎么加包 函数直接用emscripten::function,如: emscripten::function("send_to_llm", &send_to_llm); set (CMAKE_C…...
使用人工智能大模型kimi,如何免费制作PPT?
使用人工智能大模型kimi,如何免费制作PPT? 手把手操作视频https://edu.csdn.net/learn/40406/666573...
ModbusTCP 转 Profinet 主站网关
一、 功能概述 1.1 设备简介 本产品是 ModbusTCP 和 Profinet(M) 网关(以下简称网关),使用数据映射 方式工作。 本产品在 ModbusTCP 侧作为 ModbusTCP 从站,接 PLC 、上位机、 wincc 屏 等;在 Profin…...
进阶篇|CAN FD 与性能优化
引言 1. CAN vs. CAN FD 对比 2. CAN FD 帧结构详解...
6.6 “3步调用ChatGPT打造高可靠Python调度器,零依赖实现定时任务自动化“
3步调用ChatGPT打造高可靠Python调度器,零依赖实现定时任务自动化 关键词:ChatGPT代码生成、Python调度器设计、定时任务自动化、异常处理机制、日志监控系统 需求分析与技术选型 GitHub Sentinel 需要实现两种定时任务模式: #mermaid-svg-prOScv2NNhn6w90N {font-family:…...
HarmonyOS 基础语法概述 UI范式
ArkUI框架 - UI范式 ArkTS的基本组成 装饰器: 用于装饰类、结构、方法以及变量,并赋予其特殊的含义。如上述示例中Entry、Component和State都是装饰器,Component表示自定义组件,Entry表示该自定义组件为入口组件,Stat…...
23种设计模式-创建型模式之建造者模式(Java版本)
Java 建造者模式(Builder Pattern)详解 🧱 什么是建造者模式? 建造者模式用于将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。 适用于创建过程复杂、构造顺序稳定但组件变化的对象。…...
【AI提示词】退休规划顾问专家
提示说明 随着人口老龄化的加剧,越来越多的人开始关注退休规划问题。一个专业的退休规划顾问可以帮助用户合理规划退休生活,确保退休后的生活质量。 提示词 # 角色 退休规划顾问专家## 注意 1. 专家设计应符合退休规划的专业性和可靠性,帮…...
文献总结:NIPS2023——车路协同自动驾驶感知中的时间对齐(FFNet)
FFNet 一、文献基本信息二、背景介绍三、相关研究1. 以自车为中心的3D目标检测2. 车路协同3D目标检测3. 特征流 四、FFNet网络架构1. 车路协同3D目标检测任务定义2. 特征流网络2.1 特征流生成2.2 压缩、传输与解压缩2.3 车辆传感器数据与基础设施特征流融合 3. 特征流网络训练流…...
(二十六)Java观察者模式在Android开发中的应用详解
Java观察者模式在Android开发中的应用 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得多个观察者对象可以同时监听一个主题对象。当主题对象的状态发生变化时,所有注册的观察者…...
goland做验证码识别时报“undefined: gosseract.NewClient”
gosseract 应该有 和 c 相关的配置库因此需要安装 cgo 并且启用 CGO_ENABLED 在cmd下面输入这个 go env -w CGO_ENABLED1 接着输入 go env 验证是否设置成功 解决了这个问题后 “undefined: gosseract.NewClient” 又出现了 # runtime/cgo …...
ceph weight 和 reweight 的区别
ceph osd df ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS0 nvme 6.98630 0.95508 7.0 TiB 5.0 TiB 4.9 TiB 13 GiB 33 GiB 2.0 TiB 71.10 0.96 83 up1 nvme 6.98630...
# 使用 PyTorch 构建并训练一个简单的 CNN 模型进行图像分类
使用 PyTorch 构建并训练一个简单的 CNN 模型进行图像分类 在深度学习领域,卷积神经网络(CNN)是处理图像分类任务的强大工具。本文将通过一个简单的示例,展示如何使用 PyTorch 构建、训练和测试一个 CNN 模型,用于对食…...
Linux网络编程 深入解析TFTP协议:基于UDP的文件传输实战
知识点1【TFTP的概述】 学习通信的基本:通信协议(具体发送上面样的报文)、通信流程(按照什么步骤发送) 1、TFTP的概述 tftp:简单文件传输协议,**基于UDP,**不进行用户有效性验证 …...
汽车免拆诊断案例 | 2019款大众途观L车鼓风机偶尔不工作
故障现象 一辆2019款大众途观L车,搭载DKV发动机和0DE双离合变速器,累计行驶里程约为8万km。车主进厂反映,鼓风机偶尔不工作。 故障诊断 接车后试车,鼓风机各挡位均工作正常。用故障检测仪检测,空调控制单元&#x…...
编程常见错误归类
上一篇讲了调试,今天通过一个举例回忆一下上一篇内容吧! 1. 回顾:调试举例 在VS2022、X86、Debug的环境下,编译器不做任何优化的话,下⾯代码执⾏的结果是啥? #include <stdio.h> int main() {int …...
Python 3.13 support for PyTorch
Python 3.13 support for PyTorch Python 3.13 support for PyTorch 去官网可以查到具体信息:https://pytorch.org/get-started/locally/ 然后选择自己的CUDA版本,下面会显示下载网站,比如我选择12.4,则会出现:pip3 …...
中国联通:《DeepSeek洞察与大模型应用:人工智能技术发展与应用实践》(可下载)
近年来,人工智能(AI)技术迅猛发展,尤其是大模型技术的崛起,正在深刻改变各行各业的运营模式和创新路径。作为中国通信行业的领军企业之一,中国联通积极拥抱AI技术变革,结合自身在通信网络、大数…...
k8s 调整Node节点 Max_Pods
默认情况下,Kubernetes集群中一个Node最多能起110个Pod。 这是基于性能和资源管理的考虑,以确保Kubernetes集群的稳定性和可靠性。 查看kht125节点上支持的最大pod数量: kubectl describe node kht125 | grep -i “Capacity|Allocatable” -A 6 调整…...
VR拍摄要点与技巧有哪些?有哪些最佳实践?
VR拍摄要点与技巧:最佳实践 VR技术通过模拟环境,使用户能够沉浸在一个完全由计算机生成的虚拟世界中,进行互动体验。在VR拍摄领域,我们主要利用这一技术来创建360度全景视频或图片,让观众能够全方位、无死角地感受拍摄…...
使用 Docker 安装 Elastic Stack 并重置本地密码
Elastic Stack(也被称为 ELK Stack)是一个非常强大的工具套件,用于实时搜索、分析和可视化大量数据。Elastic Stack 包括 Elasticsearch、Logstash、Kibana 等组件。本文将展示如何使用 Docker 安装 Elasticsearch 并重置本地用户密码。 ###…...
安卓手机万能遥控器APP推荐
软件介绍 安卓手机也能当“家电总控台”?这款小米旗下的万能遥控器APP,直接把遥控器做成“傻瓜式操作”——不用配对,不连蓝牙,点开就能操控电视、空调、机顶盒,甚至其他品牌的电器!雷总这波操作直接封神&…...
PLOS ONE:VR 游戏扫描揭示了 ADHD 儿童独特的大脑活动
在孩子的成长过程中,总有那么一些“与众不同”的孩子。他们似乎总是坐不住,课堂上小动作不断,注意力难以集中,作业总是拖拖拉拉……这些行为常常被家长和老师简单地归结为“淘气”“不听话”。然而,他们可能并不只是“…...
Linux 系统编程 day4 进程管道
进程间通信(IPC) Linux环境下,进程地址空间相互独立,任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能互相访问,要交换数据必须通过内核,在内核中开辟一块缓冲区…...
基于DeepSeek的考研暑假日志分析
注:我去年考研时写了日志,大致记录了我每天的主要活动。由于过于琐碎,一直没有翻看。突发奇想,现在利用deepseek总结其中规律。 从你的日志中可以总结出以下规律和活动兴衰起落: 一、学习活动规律与演变 …...
Python 写生成 应用商店(2025版) 网页 方便收集应用 ,局域网使用
工具【1】:nginx 配置 nginx.conf 文件 server { listen 8080; server_name example.com; location / { root E:/BIT_Soft_2025; index index.html index.htm; } # 定义错误页面 error_page 404 /4…...
LLaMA Factory多模态微调实践:微调Qwen2-VL构建文旅大模型
LLaMA Factory 是一款开源低代码大模型微调框架,集成了业界最广泛使用的微调技术,支持通过 Web UI 界面零代码微调大模型,目前已经成为开源社区内最受欢迎的微调框架之一,GitHub 星标超过 4.7 万。本教程将基于通义千问团队开源的…...
Ubuntu20.04 部署llama-factory问题集
llama3 微调教程之 llama factory 的 安装部署与模型微调过程,模型量化和gguf转换。_llamafactory 部署-CSDN博客 1.跟着教程 llama-factory下载不下来 来,试着换源,多试几次,就可以成功了。。。 2.跟着教程,发现无法…...
鸿蒙语言基础
准备工作 去鸿蒙官网下载开发环境 点击右侧预浏览,刷新和插销按钮,插销表示热更新,常用按钮。 基础语法 string number boolean const常量 数组 let s : string "1111"; console.log("string", s);let n : number …...
每天一道C语言精选编程题之字符串拷贝
题目描述 写⼀个函数my_strcpy,实现拷⻉字符串的功能,假设给定⼀个字符数组a,再给定⼀个字符数组b,将字符串a中的内容拷⻉到字符串b中,拷⻉内容包含字符串末尾的 \0 字符。 解法思路 使⽤ while 循环通过指针的⽅式逐…...
C#中扩展方法和钩子机制使用
1.扩展方法: 扩展方法允许向现有类型 “添加” 方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像实例方法一样进行调用。 使用场景: 1.当无法修改某个类的源代码&#…...
基于CNN与VGG16的图像识别快速实现指南
基于CNN与VGG16的图像识别快速实现指南 以下是从零实现代码到原理剖析的完整流程,包含TensorFlow/Keras框架的代码示例与关键优化技巧,满足快速实验需求。 一、核心原理对比 特性CNN(基础模型)VGG16结构深度5-10层(如…...
中间件--ClickHouse-9--MPP架构(分布式计算架构)
1、MPP 架构基础概念 MPP(Massively Parallel Processing 大规模并行处理) 是一种分布式计算架构,专门设计用来高效处理大规模数据集。在这种架构下*,数据库被分割成多个部分,每个部分可以在不同的服务器节点上并行处理*。这意味着ÿ…...
如何在PDF.js中改造viewer.html以实现PDF的动态加载
在PDF.js中改造viewer.html实现PDF动态加载,需结合参数传递、文件流处理及跨域配置等技术。以下是综合多个技术方案的核心实现步骤: 一、基础参数传递法 1. URL参数动态加载 通过修改viewer.html的URL参数传递PDF路径,适用于静态文…...
Android——动画
帧动画 帧动画就是很多张图片,一帧一帧的播放,形成的一个动画效果。 frame.xml <?xml version"1.0" encoding"utf-8"?> <animation-list xmlns:android"http://schemas.android.com/apk/res/android">&l…...
基于linux 设置无线网卡Monitor模式 sniffer抓包
硬件 TP-WN722N 开源无线网卡 网卡设置成抓包模式,条件是什么? 硬件条件 网卡芯片支持监听模式,外置天线或高增益天线可提升抓包效果驱动与软件条件:正确的驱动程序系统与权限条件 Linux:原生支持(Kali …...
Ubuntu18.04安装Qt5.12
本文介绍了在Ubuntu18.04环境下安装QT QT5.12相关安装包下载地址 https://download.qt.io/archive/qt/5.12/ Linux系统下Qt的离线安装包以.run结尾 (sudo apt-get install open-vm-tools open-vm-tools-desktop解决无法paste的问题) 安装 1.cd命令 终端进入对应的文件夹下面 2.…...
克服储能领域的数据处理瓶颈及AI拓展
对于储能研究人员来说,日常工作中经常围绕着一项核心但有时令人沮丧的任务:处理实验数据。从电池循环仪的嗡嗡声到包含电压和电流读数的大量电子表格,研究人员的大量时间都花在了提取有意义的见解上。长期以来,该领域一直受到对专…...
PDF.js 生态中如何处理“添加注释\添加批注”以及 annotations.contents 属性
我们来详细解释一下在 PDF.js 生态中如何处理“添加注释”以及 annotations.contents 属性。 核心要点:PDF.js 本身主要是阅读器,不是编辑器 首先,最重要的一点是:PDF.js 的核心库 (pdfjs-dist) 主要设计用于解析和渲染…...
L38.【LeetCode题解】四数之和(双指针思想) 从汇编角度分析报错原因
目录 1.题目 2.分析 去重的代码 错误代码 3.完整代码 提交结果 1.题目 四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元…...
【第48节】探究汇编使用特性:从基础到混合编程
目录 引言 一、调用约定的奥秘 1.1 . C调用约定(_cdecl) 1.2 stdcall调用约定(_stdcall) 1.3 fastcall快速调用约定(_fastcall) 1.4 thiscall调用约定(C类成员函数) 二、X64汇…...
【jenkins】首次配置jenkins
第一步,输入管理员密码 cat /var/jenkins_home/secrets/initialAdminPassword第二步,点击安装推荐的插件 第三步,创建管理员用户 第四步,返回实例 第五步, 升级jenkins 第六步, 修复提示 第七步,…...
Python 项目文档编写全攻略:从入门到自动化维护
引言 在软件开发领域,完善的文档可提升 40% 的团队协作效率(来源:IEEE 2022 年开发者调查报告 ^^1^^)。本文将深入探讨 Python 项目文档的最佳实践,涵盖文档生成工具、注释规范、自动化维护等关键环节。 一、Python 文…...
基于 React 和 CodeMirror 实现自定义占位符编辑器
npm git 在前端开发中,我们经常需要实现各种复杂的编辑器功能,比如代码编辑器、富文本编辑器等。本文将介绍如何基于 React 和 CodeMirror 实现一个带有自定义占位符功能的编辑器,这种编辑器在模板系统、表单设计器等场景中非常有用。 一…...
GitHub Copilot在产品/安全团队中的应用实践:处理Markdown、自动化报告与电子表格、使用CLI命令等
本文来源github.com,由GitHub中国授权合作伙伴-创实信息翻译整理。 在当今的快节奏时代,技术和非技术团队之间的协作至关重要,事实证明,GitHub Copilot等工具已成为不可或缺的助手。这些由AI驱动的工具已不只是开发者的“秘密武器…...
嵌入式系统中Flash操作全面解析与最佳实践
嵌入式系统中Flash操作全面解析与最佳实践 一、Flash存储器基础与分类 Flash存储器是嵌入式系统中最重要的非易失性存储介质,根据内部架构和工作原理主要分为两大类: 1.1 NOR Flash与NAND Flash对比 特性NOR FlashNAND Flash架构随机存取架构串行存取…...
tomcat 的安装与启动
文章目录 tomcat 服务器安装启动本地Tomcat服务器 tomcat 服务器安装 https://tomcat.apache.org/下载 Tomcat 10.0.X 启动本地Tomcat服务器 进入 Tomcat 的 bin...