Selenium Chrome Webdriver 如何获取 Youtube 悬停文本
导语
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 的悬停文本是一种可行的方法,它可以让我们获取动态生成的网页内容,模拟真实的用户行为,突破网站的反爬机制。当然,这种方法也有一些缺点,比如需要安装浏览器和驱动程序,运行速度运行相对较慢,占用较多的系统资源等。因此,我们需要根据不同的爬虫需求,选择合适的爬虫工具和方法。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取
相关文章:

Selenium Chrome Webdriver 如何获取 Youtube 悬停文本
导语 Youtube 是一个非常流行的视频分享平台,有时候我们可能想要爬取一些视频的信息,比如标题、播放量、点赞数等。但是有些信息并不是直接显示在网页上的,而是需要我们将鼠标悬停在某个元素上才能看到,比如视频的时长、上传时间…...

【LeetCode每日一题】——766.托普利茨矩阵
文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【题目进阶】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 矩阵 二【题目难度】 简单 三【题目编号】 766.托普利茨矩阵 四【题目描述…...

第三方材料检测实验室LIMS系统源码 lims源码
实验室LIMS系统采用国际规范的业务管理流程和严格的质量控制体系,对每个检测流程节点采用 “人、机、料、法、环、测”进行质量控制,可记录,可追溯。强大的数据查询和统计分析能力,提高工作效率;自动化地采集实验室原始…...

【数据结构与算法——TypeScript】数组、栈、队列、链表
【数据结构与算法——TypeScript】 算法(Algorithm)的认识 解决问题的过程中,不仅仅 数据的存储方式会影响效率,算法的优劣也会影响效率 什么是算法? 定义: 🟢 一个有限指令集,每条指令的描述不依赖于言语…...
[运维|中间件] Apache APISIX使用笔记
简介 Apache APISIX 是一个现代化、高性能、可扩展的开源 API 网关和微服务管理平台。 安装 快速安装 curl -sL https://run.api7.ai/apisix/quickstart | sh...
Android Intent 使用(详细版)
经典好文推荐,通过阅读本文,您将收获以下知识点: 一、通过组件名启动 二、通过包名、类名启动 三、通过类启动 四、打电话 五、发短信 六、打开网页 七、播放音乐 八、打开图片 九、创建闹钟 十、创建定时器 十一、添加日历事件 十二、拍照 十三、打开Camera 十四、打开视频录…...

【Clion 2】多行TODO使用
一、TODO: 说明: 有时需要标记部分代码以供将来参考: 优化和改进的领域、可能的更改、要讨论的问题等等。 支持: TODO和FIXME小写和大写。这些模式可以在任何受支持的文件类型的行注释和块注释内使用。 创建TODO项 在要添加注释的代码行中…...

【运维】hive 终端突然不能使用:Hive Schema version does not match metastore‘s schema version
文章目录 一. 问题描述二. 常规排查1. 元数据库2. hive-site.xml相关meta连接信息检查 三. 正解 一. 问题描述 进入hive终端,执行如下命令报错: hive> show tables; FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: …...
P1049 [NOIP2001 普及组] 装箱问题
题目描述 有一个箱子容量为 V,同时有 n 个物品,每个物品有一个体积。 现在从 n 个物品中,任取若干个装入箱内(也可以不取),使箱子的剩余空间最小。输出这个最小值。 输入格式 第一行共一个整数 V&#…...
QCustomPlot获取选点坐标
QCustomPlot版本:Version: 2.1.1 设置点选择模式 customPlot->setInteractions(QCP::iSelectPlottables);2.绑定点击事件 connect(customPlot, &QCustomPlot::plottableClick, this, &CCustomPlot::onPlotClick);3.读取点位置 void CustomPlot::onP…...
Qt配置Android开发
1.使用Qt5.14.2 2.安装java和SDK,NDK 具体参考该博客【原创】基于Qt5.14的一站式安卓开发环境搭建_qt安卓开发环境搭建_Jamie.T的博客-CSDN博客 3.后续可能会遇到的问题: ①SDK配置问题: 若出现以下编译错误,是build-tools 2…...

花费7元训练自己的GPT 2模型
在上一篇博客中,我介绍了用Tensorflow来重现GPT 1的模型和训练的过程。这次我打算用Pytorch来重现GPT 2的模型并从头进行训练。 GPT 2的模型相比GPT 1的改进并不多,主要在以下方面: 1. GPT 2把layer normalization放在每个decoder block的前…...
性能分析工具
性能分析工具 valgrind 交叉编译 android arm/arm64 平台 valgrind android32 #!/usr/bin/env bashexport NDKROOT~/opt/android-ndk-r14b/ export AR$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar export LD$NDKROO…...

1.netty介绍
1.介绍 是JBOSS通过的java开源框架是异步的,基于事件驱动(点击一个按钮调用某个函数)的网络应用框架,高性能高可靠的网络IO程序基于TCP,面向客户端高并发应用/点对点大量数据持续传输的应用是NIO框架 (IO的一层层封装) TCP/IP->javaIO和网络编程–>NIO—>Netty 2.应用…...

【Jmeter】压测mysql数据库中间件mycat
目录 背景 环境准备 1、下载Jmeter 2、下载mysql数据库的驱动包 3、要进行测试的数据库 Jmeter配置 1、启动Jmeter图形界面 2、加载mysql驱动包 3、新建一个线程组,然后如下图所示添加 JDBC Connection Configuration 4、配置JDBC Connection Configurati…...

leetcode原题 路径总和 I II III(递归实现)
路径总和 I : 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。…...

【css】css设置表格样式-边框线合并
<style> table, td, th {border: 1px solid black;//设置边框线 }table {width: 100%; }td {text-align: center;//设置文本居中 } </style> </head> <body><table><tr><th>Firstname</th><th>Lastname</th><t…...

使用Flutter的image_picker插件实现设备的相册的访问和拍照
文章目录 需求描述Flutter插件image_picker的介绍使用步骤1、添加依赖2、导入 例子完整的代码效果 总结 需求描述 在应用开发时,我们有很多场景要使用到更换图片的功能,即将原本的图像替换设置成其他的图像,从设备的相册或相机中选择图片或拍…...
数学建模体系
1评价类 主观求权重:层次分析法客观求权重:TOPSIS综合评价:典型相关分析 2预测插值算法拟合多元回归分析时间序列分析、ARCH和garch模型岭回归和lasso回归 3关系相关系数典型相关分析多元回归分析灰色关联分析 4图最短路径:迪杰斯…...

13.7 CentOS 7 环境下大量创建帐号的方法
13.7.1 一些帐号相关的检查工具 pwck pwck 这个指令在检查 /etc/passwd 这个帐号配置文件内的信息,与实际的主文件夹是否存在等信息, 还可以比对 /etc/passwd /etc/shadow 的信息是否一致,另外,如果 /etc/passwd 内的数据字段错…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...