Selenium Chrome Webdriver 如何获取 Youtube 悬停文本

Playwright: Pytest vs Library vs LibraryAsync:三者如何选? Python中Playwright的3个Target:Pytest(推荐用于E2E自动化测试,支持报告、并行、重试)、Library(同步脚本,适合爬虫与简单任务,需手动管理浏览器)、LibraryAsync(异步脚本,适用于高并发批量操作)。选择依据:测试项目选Pytest,轻量脚本选Library,高并发场景选LibraryAsync。 阅读详情

导语

Youtube 是一个非常流行的视频分享平台,有时候我们可能想要爬取一些视频的信息,比如标题、播放量、点赞数等。但是有些信息并不是直接显示在网页上的,而是需要我们将鼠标悬停在某个元素上才能看到,比如视频的时长、上传时间等。这些信息被称为悬停文本,它们是通过 JavaScript 动态生成的,所以我们不能用普通的 HTML 解析方法来获取它们。那么,我们该如何用爬虫来获取 Youtube 的悬停文本呢?本文将介绍一种方法,使用 Selenium Chrome Webdriver 来模拟浏览器操作,获取 Youtube 的悬停文本。

正文

概述

Selenium 是一个自动化测试工具,它可以控制浏览器进行各种操作,比如打开网页、输入文字、点击按钮等。Selenium 支持多种浏览器和编程语言,其中 Chrome Webdriver 是用于控制 Chrome 浏览器的驱动程序。我们可以使用 Selenium Chrome Webdriver 来模拟人类的浏览行为,获取 Youtube 的悬停文本。

亮点

使用 Selenium Chrome Webdriver 的优点有:

  ·可以获取动态生成的网页内容,不受 JavaScript 的限制

  · 可以模拟鼠标悬停、滚动、点击等操作,更接近真实的用户体验

  · 可以设置代理服务器,突破网站的反爬机制

  · 可以设置浏览器选项,如无头模式、隐身模式等,提高爬虫效率和安全性

案例

下面我们来看一个具体的案例,如何使用 Selenium Chrome Webdriver 来获取 Youtube 的悬停文本。我们以 https://www.youtube.com/watch?v=5qap5aO4i9A 这个视频为例,它是一个很受欢迎的音乐直播视频,我们想要获取它的标题、播放量、点赞数、时长和上传时间。 首先,我们需要导入必要的库和模块,如 Selenium、Chrome Webdriver 等:

  # 导入必要的库和模块
  from selenium import webdriver # 导入 Selenium 库
  from selenium.webdriver.common.by import By # 导入 By 类
  from selenium.webdriver.support.ui import WebDriverWait # 导入 WebDriverWait 类
  from selenium.webdriver.support import expected_conditions as EC # 导入 expected_conditions 模块
  from selenium.webdriver.common.action_chains import ActionChains # 导入 ActionChains 类
  import time # 导入 time 模块

然后,我们需要设置代理服务器,这里我们使用亿牛云提供的代理服务器:

  #  爬虫加强版 设置代理服务器
  proxyHost = "www.16yun.cn" # 代理服务器域名或 IP 地址
  proxyPort = "31111" # 代理服务器端口号
  # 代理验证信息
  proxyUser = "16YUN" # 代理用户名
  proxyPass = "16IP" # 代理密码
  # 构造代理认证字符串
  proxyAuth = proxyUser + ":" + proxyPass
  # 构造 Chrome 选项对象
  chrome_options = webdriver.ChromeOptions()
  # 添加代理扩展
  chrome_options.add_extension("Proxy-Auto-Auth_v2.0.crx")
  # 添加代理认证参数
  chrome_options.add_argument("--proxy-server=http://" + proxyHost + ":" + proxyPort)
  chrome_options.add_argument("--proxy-auth=" + proxyAuth)

接下来,我们需要创建一个 Chrome Webdriver 对象,并打开目标网页:

  # 创建 Chrome Webdriver 对象
  driver = webdriver.Chrome(options=chrome_options)
  # 打开目标网页
  driver.get("https://www.youtube.com/watch?v=5qap5aO4i9A")

然后,我们需要等待网页加载完成,并找到我们想要获取的元素:

  # 等待网页加载完成
  wait = WebDriverWait(driver, 10) # 设置最长等待时间为 10 秒
  wait.until(EC.presence_of_element_located((By.ID, "container"))) # 等待 id 为 container 的元素出现
  # 找到视频标题元素
  title = driver.find_element_by_xpath("//h1/yt-formatted-string") # 使用 XPath 定位视频标题元素
  # 找到视频播放量元素
  views = driver.find_element_by_xpath("//div[@id='info']/div[@id='info-text']/ytd-video-view-count-renderer/span[@class='view-count style-scope ytd-video-view-count-renderer']") # 使用 XPath 定位视频播放量元素
  # 找到视频点赞数元素
  likes = driver.find_element_by_xpath("//div[@id='top-level-buttons']/ytd-toggle-button-renderer[1]/a/yt-formatted-string") # 使用 XPath 定位视频点赞数元素
  # 找到视频时长元素
  duration = driver.find_element_by_xpath("//div[@id='movie_player']/div[@class='ytp-chrome-bottom']/div[@class='ytp-chrome-controls']/div[@class='ytp-left-controls']/span[@class='ytp-time-duration']") # 使用 XPath 定位视频时长元素
  # 找到视频上传时间元素
  upload_time = driver.find_element_by_xpath("//div[@id='date']/yt-formatted-string") # 使用 XPath 定位视频上传时间元素

接着,我们需要模拟鼠标悬停在视频时长和上传时间元素上,才能获取它们的文本:

  # 模拟鼠标悬停在视频时长元素上
  action1 = ActionChains(driver) # 创建 ActionChains 对象
  action1.move_to_element(duration) # 移动鼠标到视频时长元素上
  action1.perform() # 执行操作
  # 模拟鼠标悬停在视频上传时间元素上
  action2 = ActionChains(driver) # 创建 ActionChains 对象
  action2.move_to_element(upload_time) # 移动鼠标到视频上传时间元素上
  action2.perform() # 执行操作

最后,我们可以获取各个元素的文本,并打印出来:

  # 获取各个元素的文本
  title_text = title.text # 获取视频标题文本
  views_text = views.text # 获取视频播放量文本
  likes_text = likes.text # 获取视频点赞数文本
  duration_text = duration.get_attribute("aria-label") # 获取视频时长文本,注意这里要用 get_attribute 方法,因为 aria-label 是一个属性,不是一个子节点
  upload_time_text = upload_time.get_attribute("aria-label") # 获取视频上传时间文本,同理
  # 打印各个元素的文本
  print("标题:", title_text)
  print("播放量:", views_text)
  print("点赞数:", likes_text)
  print("时长:", duration_text)
  print("上传时间:", upload_time_text)

运行上面的代码,我们可以得到如下的输出:

  标题: lofi hip hop radio - beats to relax/study to
  播放量: 3.8亿次观看
  点赞数: 1000万次赞同
  时长: 视频长度 0:00 / 0:00。
  上传时间: 已于 2020年2月22日发布。

结语

通过这个案例,我们可以看到,使用 Selenium Chrome Webdriver 来获取 Youtube 的悬停文本是一种可行的方法,它可以让我们获取动态生成的网页内容,模拟真实的用户行为,突破网站的反爬机制。当然,这种方法也有一些缺点,比如需要安装浏览器和驱动程序,运行速度运行相对较慢,占用较多的系统资源等。因此,我们需要根据不同的爬虫需求,选择合适的爬虫工具和方法。

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

Understand-Anything:AI驱动的代码知识图谱,实现项目全局洞察与高效导航 在软件开发中,理解复杂代码库的结构和依赖关系是提升开发效率的关键。传统代码阅读方式往往陷入局部视角,难以快速把握系统全貌。知识图谱技术通过将代码实体(如文件、类、函数)及其关系(调用、继承、依赖)可视化,为代码理解提供了全局视角。这项技术的核心价值在于将静态代码转化为动态、可交互的认知地图,极大降低了系统学习与维护成本。在实际工程中,它广泛应用于新成员快速入职、遗留系统梳理、架构影响分析等场景。本文介绍的Understand-Anything工具,正是基于这一理念,通过多智能体分析管道,自动构建代码的结构图 阅读详情

相关推荐

TortoiseSVN的安装与使用

TortoiseSVN的安装与应用1、安装1.1、下载TortoiseSVN    点击下载TortoiseSvn1.2、下载汉化包。上面的页面中,找到Chinese, simplified汉化包,点击32位或者64位的Setup,下载汉化包。1.3、安装TortoiseSVN。在选择安装路径页面时要记得勾选“command line client tools”,默认不是勾选的。这里不勾选的话在I...

qq_28566071的博客 4万+

Playwright实战:浏览器自动化与网页视频交互完整指南

浏览器自动化是现代软件开发和测试中的关键技术,它通过编程方式模拟用户操作,实现网页交互、数据采集和功能验证。其核心原理是利用WebDriver或DevTools协议与浏览器通信,控制页面导航、元素操作和事件响应。这项技术的价值在于提升测试效率、确保应用兼容性,并支持构建智能化的网页交互应用。在自动化测试、爬虫开发和RPA流程中,浏览器自动化已成为基础工具。当应用场景涉及多媒体内容时,视频交互成为新的挑战,需要结合特定API处理视频播放、控制和内容分析。本文聚焦于使用Playwright框架,深入讲解如何实现

379

【机器学习】实验2,基于回归分析的大学综合得分预测(完整代码实现+分析)

大学排名是一个非常重要同时也极富挑战性与争议性的问题,一所大学的综合实力涉及科研、师资、学生等方方面面。目前全球有上百家评估机构会评估大学的综合得分进行排序,而这些机构的打分也往往并不一致。在这些评分机构中,世界大学排名中心(Center for World University Rankings,缩写CWUR)以评估教育质量、校友就业、研究成果和引用,而非依赖于调查和大学所提交的数据著称,是非常有影响力的一个。

高丽大学人工智能硕士在读|专注大模型、RAG、OCR与AI工程实践 1976

Selenium抓取Facebook评论时只加载出前几条的分页处理

针对 Selenium 抓 Facebook 评论只出前几条的问题,说明先查滚动容器与等待条件,区分未触发加载和加载后读取过早两种情况,给出可验证的循环判断与停止边界。

dd8989089的博客 185

Anomalies,Factors,andMultiFactorModels

转 Anomalies, Factors, and Multi-Factor Models 作者:石川,量信投资创始合伙人,清华大学学士、硕士,麻省理工学院博士;精通各种概率模型和统计方法,擅长不确定性随机系统的建模及优化。知乎专栏:https://zhuanlan.zhihu.com/mitcshi。未经授权,严禁转载。 摘要:本文解释了异象、因子以及多因子模型的区别和联系;梳理了从异象到因子再...

绿杨 794

RT-Thread Studio使用笔记(四):带片外Flash(W25Q128)的OTA(YModem)

前言 在学习OTA之前,请先参考上两篇博客写的关于SPI设备及W25Q128的使用方法,传送门: https://blog.youkuaiyun.com/tigerots/article/details/107423633 https://blog.youkuaiyun.com/tigerots/article/details/107933991 如何使用OTA 一. 制作BootLoader 打开Bootloader 在线获取地址,注册,并根据RT-thread官方文档生成BootLoader,官方文档已经写的很清楚,再此

tigerots的专栏 4008

不搭 Selenium 或 Playwright,怎么测试公司的内网业务?

面向内网 ERP、CRM、审批后台等系统,一套私有部署环境即可完成录制、维护、执行到报告的完整流程,截图与执行记录留在本地。

Kami‘s home 376

PIV实验流场流速云图(MALAB contour函数用法)

clear;clc; for k=1:5 str1=['filename1']; str2=['filename2']; str3=['filename3']; str=eval(['str',num2str(k)]); load(str); [m n]=size(y); y=flipud(y); v=-v; x=x-x(1,...

Nick_Cui的博客 3223

spring mvc 请求地址的 路径贪婪匹配 “请求错误:Request method ‘POST‘ not supported“

spring mvc 路径变量贪婪匹配

zzwpublic的专栏 186

51单片机定时器的原理、应用与编程实现

本文系统介绍了51单片机定时器的基本原理与应用。首先阐述了定时器的工作原理,包括定时模式和计数模式的区别。然后详细讲解了定时器的四种工作模式(方式0-方式3)及其适用场景,并分析了相关寄存器(TMOD、TCON、THx/TLx)的功能设置。文章还给出了定时器编程的具体步骤,包括初始化、计数初值计算和示例代码。最后通过LED闪烁、PWM波形产生、脉冲计数等实际应用案例,展示了定时器的多样化应用。掌握这些知识对嵌入式系统开发具有重要意义。

2501_91227323的博客 1524

PCL 改进的RANSAC算法实现点云粗配准【2024最新版】

一种改进的RANSAC点云粗配准算法,具体改进见论文:“Pose Estimation using Local Structure-Specific Shape and Appearance Context”

点云侠的博客 37万+

MySQL 高频面试题全解:索引失效、MVCC 与间隙锁、深度分页优化(2026 招聘 JD 真题复盘)

按 2026 招聘 JD 与一线面经整理 12 道 MySQL 高频题:B+树索引原理、聚簇索引与覆盖索引、最左前缀与索引失效真实场景、MVCC 与 ReadView、间隙锁与死锁实战、深度分页优化、慢 SQL 六步排查、count(*)、主从延迟、分库分表与两阶段提交,每题附可直接复述的工程化答案。

蒙眼过河 286

Spring AI Alibaba实战训练营-16 NL2SQL (自然语言转 SQL)应用开发指南

本文介绍了一个基于AI的智能BI应用开发项目,主要实现自然语言转SQL(NL2SQL)功能,包含对话模块、MCP模块、向量数据管理模块。项目采用Spring AI Alibaba框架,集成通义千问大模型,支持内存向量库和AnalyticDB向量数据库两种存储方案。重点展示了chat模块的三个控制器实现:AnalyticNl2SqlController用于生产环境,SimpleChatController适用于开发测试,Nl2sqlForGraphController支持基于图的复杂对话流程。系统通过将业务知

program哲学 1587

Python自动化测试pytest中fixtureAPI简单说明

这篇文章主要为大家介绍了Python自动化测试pytest中fixtureAPI的简单说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

2601_96797912的博客 227

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Spring 高频面试题:用一次用户注册串起 IoC、AOP、事务和 MVC

学 Spring 时,我最容易混淆的是这些「看起来一样」的操作:调用业务方法和向容器取 Bean,调用目标对象和调用代理,方法正常返回和事务成功提交。把它们放进同一个例子里,很多面试题就能顺着调用路径推出来。假设我们要实现一个注册接口:前端发来,Controller 接收用户名,Service 在数据库里创建用户和默认资料。下面用这条链路理解 Spring 的几个核心机制。代码是用于讲解的片段,省略了导入、依赖声明和数据库实现。

weixin_42927227的博客 321

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

短链接服务中基于TDD的高并发处理与幂等性实现实战

引言在当今互联网服务中,短链接服务作为提升用户体验与降低传播成本的重要工具,广泛应用于各类业务场景。然而,随着用户量的增长,如何保障短链接服务在高并发场景下的可用性、幂等性以及应对流量突增带来的稳定性问题,成为开发者需要解决的关键难题。本文以TDD(测试驱动开发)为核心,结合单元测试手段,从设计到实现逐步讲解如何构建一个具备高可用性的短链接服务,并在实际部署中应对限流降级等挑战。

后台模板 69

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【鸿蒙专题与实战】测试体系:单元测试、组件测试与 UI 测试

本文系统讲解鸿蒙开发中的三层测试实践:底层单元测试(用Hypium框架,优先覆盖纯函数、边界与异常)、中层ViewModel逻辑、顶层仅测3-5条关键UI路径。强调测试应“越往下写得越多”,因单元测试快且成本低,而UI测试慢易出错。通过实例说明断言拆分提升定位效率,结合覆盖率报告(hvigorwtest --coverage)发现盲区,核心是“用覆盖率找漏测,而非追求数字”。附五步落地清单:建测试文件、按优先级补用例、精简UI测试、生成报告、定位未覆盖行。下一篇将开启实战项目:从需求到上架全流程。

信息安全领域优质创作者|操作系统领域专家 185

MySQL 的四种隔离级别到底隔离了什么:MVCC、间隙锁与幻读

对账差异源于事务隔离级别误解:默认“同一事务内查询数据一致”不成立。因脚本中两次查询分属不同事务,读取了不同时刻的数据。问题本质是“不可重复读”——可重复读级别下,首次快照读生成的ReadView保证后续读取一致;而读已提交则每条语句重生成视图,易受并发修改影响。关键在于区分快照读与当前读,避免混用。此外,长事务、间隙锁、索引缺失等也常引发隐性问题。验证时应通过会话实验直观感受级别差异,排查需结合连接上下文与实际执行日志,而非仅依赖配置文件。

xiaobaishu_520的博客 250

【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试

上一篇我们落地了第一个业务子服务——语音识别,把微服务的标准开发流程完整走了一遍。这一篇趁热打铁,落地第二个独立服务:文件存储子服务。之所以第二个选它,原因和语音服务一样:它和其他子服务的业务交叉最少,职责单一闭环,只需要管好文件的上传下载。更重要的是,开发它的过程中能沉淀出两个通用公共组件:UUID 唯一ID生成器和二进制文件读写封装,后面用户、消息、好友等所有服务都能直接复用。本文顺着「设计思想 → 框架搭建 → 公共工具 → 业务实现 → 单元测试 → 踩坑修复」的完整开发路径,一步步拆解文件存储子服

会当凌绝顶,一览众山小 1526

Pytest 库自动化测试

即,这里运行后,Python 会自动执行 test_answer() 与 test_answer1() 两个测试样例。我们的被测试函数是 inc(),这里我们书写了两个用于自动化 pytest 库进行测试的样例,test_answer() 与 test_answer1()。结果显示,运行了两个测试样例,test_answer1() 完全通过测试,test_answer() 只通过了一半。], “-v”) 的写法,这里的 -v 指的是 verbose,即将测试结构详细输出出来。

u011699626的博客 154

Class文件结构学习总结:常量池

本文系统梳理了JVM常量池在Class文件中的结构与作用,解析了类、字段、方法、字符串及动态调用信息的存储机制。常量池并非简单数组,而是基于tag区分类型的结构化符号引用表,通过索引关联CONSTANT_Utf8_info等条目,实现类型、名称与描述符的精准映射。重点揭示了CONSTANT_Class_info、Fieldref、Methodref等类型如何构建符号引用,并结合OpenJDK源码说明其在类加载、方法调用等过程中的实际应用,为深入理解JVM运行机制提供基础支撑。

wuminyu的博客 266

MySQL 的 MVCC

MySQL 的 MVCC 通过 undo log 和 ReadView 实现非阻塞读,保障快照读的一致性。它依赖隐藏列记录事务版本,基于可见性规则选择数据版本,区分快照读与当前读。RR 隔离级别下读取同一快照,而 RC 每次重新生成;但即使在 RR,当前读仍可能产生幻读,需间隙锁防护。MVCC 不解决写写冲突,长事务会导致 undo 膨胀,引发性能问题。项目中应避免“读后写”逻辑缺陷,合理使用乐观锁,杜绝长事务,才能充分发挥 MVCC 优势。

2401_89855466的博客 179

谈SpringMVC与Spring WebFlux的区别与适用场景

Spring MVC是“稳健的老师傅”,适用于 90% 的常规业务场景。是“精密的特种兵”,适用于对并发和资源利用率有极致要求的特殊战场。在现代开发中,最明智的做法是:在网关和关键的高并发节点使用 WebFlux,而在普通的业务微服务中继续使用 Spring MVC。

敲代码的小小酥的博客 364
上一篇: 白盒测试之代码检查三种方式
下一篇: 单元测试和功能测试代码覆盖率实操详解
字节自动化测试
博客等级 码龄6年 7034粉丝 1810原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值