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

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/57564.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux NUMA架构(非统一内存访问)

NUMA架构 NUMA Architecture| Non Uniform Memory Access Policy/Model | Numa Node Configuration (CPU Affinity) NUMA架构产生的原因 cpu的高速处理功能和内存存储直接的速度会严重影响cpu的性能。传统的计算机单核架构,cpu通过内存总线(内存访问控制器)直接连接到一…

Ubuntu安装harbor(http模式)并随便上传一个

Ubuntu安装harbor(http模式) docker和harbor的介绍就免了,都不知道啥东西,还安装搞毛 先安装docker环境 不要问,软件源之类的配置,挨个梭就行 sudo apt update sudo apt install apt-transport-https ca…

【Spring Cloud 三】Eureka服务注册与服务发现

系列文章目录 【Spring Cloud一】微服务基本知识 Eureka服务注册与服务发现 系列文章目录前言一、什么是Eureka?二、为什么要有服务注册发现中心?三、Eureka的特性四、搭建Eureka单机版4.1Eureka服务端项目代码pom文件配置文件启动类启动项目查看效果 E…

uni-app选择器( uni-data-picker)选择任意级别

背景说明 uni-app 官方的插件市场有数据驱动选择器,可以用作多级分类的场景。引入插件后,发现做不到只选择年级,不选择班级(似乎,只能到最后子节点了)。 需求中,有可能选择的不是叶子。比如&a…

力扣 C++|一题多解之动态规划专题(1)

动态规划 Dynamic Programming 简写为 DP,是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理&…

django使用ztree实现树状结构效果,子节点实现动态加载(l懒加载)

一、实现的效果 由于最近项目中需要实现树状结构的效果,考虑到ztree这个组件大家用的比较多,因此打算在django项目中集成ztree来实现树状的效果。最终实现的示例效果如下: 点击父节点,如果有子节点,则从后台动态请求数据,然后显示出子节点的数据。 二、实现思路 …

openCV C++环境配置

文章目录 一、openCV 安装二、新建项目三、配置环境变量四、测试使用 编译器:vs2017 OpenCV:4.5.4 一、openCV 安装 将openCV安装到一个路径下,我安装到了D盘根目录下 二、新建项目 在vs2017新建控制台空项目,打开项目属性 在VC目录 -> 包含目录下…

基于ARM+FPGA (STM32+ Cyclone 4)的滚动轴承状态监测系统

状态监测系统能够在故障早期及时发现机械设备的异常状态,避免故障的 进一步恶化造成不必要的损失,滚动轴承是机械设备的易损部件,本文对以滚动 轴承为研究对象的状态监测系统展开研究。现有的监测技术多采用定时上传监 测数据,…

Docker-Compose编排与部署

目录 Docker Compose Compose的优点 编排和部署 Compose原理 Compose应用案例 安装docker-ce 阿里云镜像加速器 安装docker-compose docker-compose用法 Yaml简介 验证LNMP环境 Docker Compose Docker Compose 的前身是 Fig,它是一个定义及运行多个 Dock…

【ARM Coresight 系列文章 2.4 - Coresight 寄存器:DEVARCH,DEVID, DEVTYPE】

文章目录 1.1 DEVARCH(device architecture register)1.2 DEVID(Device configuration Register)1.3 DEVTYPE(Device Type Identifier Register) 1.1 DEVARCH(device architecture register) DEVARCH 寄存器标识了coresight 组件的架构信息。 bits[31:21] 定义了组件架构&…

使用 github 同步谷歌浏览器书签

想必使用谷歌浏览器Chrome的用户一定非常头疼的一件事就是:账户不能登录,书签收藏夹不能同步,换一台电脑书签收藏夹没有了! 下面教大家一招亲测有效适用的方法解决书签同步问题,在任何电脑都可以同步了 1、去下载谷歌…

数据分析基础-Excel图表的美化操作(按照教程一步步操作)

一、原始数据 包含月份和对应的销量和产量。 时间销量产量1月60722月38673月28344月58685月67596月72357月61428月24319月556710月243511月122112月2645 二、原始的图表设计-采用Excel自带模板 三、优化思路 1、删除多余元素 2、弱化次要元素 对于可以弱化的元素&#xff0c…

Excel如何把两列互换

第一步:选择一列 打开excel,选中一列后将鼠标放在列后,让箭头变成十字方向。 第二步:选择Shift键 按住键盘上的Shift键,将列往后移动变成图示样。 第三步:选择互换 完成上述操作后,松开鼠标两…

Ajax快速入门

文章目录 Ajax原生ajaxaxios案例 Ajax Ajax就是前端访问服务器端数据的一个技术 还有主要就是异步交互 就是在不刷新整页面的情况下,和服务器交换部分我也数据 比如搜索的联想技术 同步和异步的概念 一个是客户端需要等待服务器完成处理,才能进行别的事…

使用爬虫代理IP速度慢是什么原因?

你们有没有遇到过使用爬虫代理IP速度慢的问题呢?相信很多使用爬虫抓取的人都曾经陷入过这个烦恼,今天我们就来聊聊这个话题。 首先,我们得明白为什么爬虫代理IP速度会变得慢。其实,原因有很多,比如代理服务器过多的连接…

pytorch-gpu 极简安装

1、进入pytoch官网:PyTorch 找到pytorch-gpu版本,看到CUDA11.8、11.7、CPU,这里我选择安装CUDA11.8 2、下载CUDA Toolkit:CUDA Toolkit 11.8 Downloads | NVIDIA Developer 3、下载CUDANN:cuDNN Download | NVIDIA D…

QT充当客户端模拟浏览器等第三方客户端对https进行双向验证

在 ssl单向证书和双向证书校验测试及搭建流程 文章中,已经做了基于https的单向认证和双向认证,,, 在进行双向认证时,采用的是curl工具或浏览器充当客户端去验证。 此次采用QT提供的接口去开发客户端向服务器发送请求&a…

element-ui - $prompt非空验证

//点击删除按钮 delStoreFun(data) { let than this; this.$prompt(删除门店请填写备注, 提示, { confirmButtonText: 确定, cancelButtonText: 取消, inputValidator: (value) > { //非空验证 if (!value) { return 输入不能为空 } }, }).then(({ value }) > { delS…

从Spring的角度看Memcached和Redis及操作

目录 Memcached和Redis的区别 适用场景 Memcached配置使用 Redis配置使用 在SpringBoot的框架里,有直连Redis的SDK却没有Memcached的,可见相比地位。不过各有各的适应场景,Redis这个单线程模型确实非常强。 Memcached和Redis的区别 共同…

RF手机天线仿真介绍(一):金属边框天线和LDS天线

目录 简介LDS天线LDS天线仿真 金属边框天线金属边框天线仿真 简介 最早的手机是外置式天线,从NOKIA开始采用内置式天线,开始采用内置金属片(一般是0.1MM厚的不锈钢片冲压而成),随后为降低成本,后来改用FPC…