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

news2024/10/7 8:30:16

导语

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为云CTS 使用场景

云审计服务 CTS 云审计服务(Cloud Trace Service),帮助您监控并记录华为云账号的活动,包括通过控制台、API、开发者工具对云上产品和服务的访问和使用行为,提供对各种云资源操作记录的收集、存储和查询功能&#xff0…

解密Redis:应对面试中的缓存相关问题2

面试官:Redis集群有哪些方案,知道嘛? 候选人:嗯~~,在Redis中提供的集群方案总共有三种:主从复制、哨兵模式、Redis分片集群。 面试官:那你来介绍一下主从同步。 候选人:嗯&#xff…

IDEA基础使用

IDEA基础使用 1、IDEA中显示用法和用户截图展示有调用显示无调用显示 对应方法 2、如何找出项目中所有不被调用方法截图展示对应方法 3、常用代码(Code)说明及快捷键:4、未完待续待日后更新。。。总结:欢迎指导,也祝码友们代码越来越棒,技术越…

python版puppeteer——pyppeteerselenium的加强版——seleniumwire

目录 前言seleniumwire安装创建web driver设置代理反屏蔽修改window.navigator.webdriver关键字返回结果options追加参数 pyppeteerpuppeteer安装快速入门参数配置隐藏浏览器特征拦截请求更多文档&博客 Playwright安装快速入门新概念:Context页面基本操作选择器…

wolfSSL5.6.3移植至ZYNQ(XC7Z010)记录

上篇文章主要描述了如何从源工程中将configure.ac转变为configure,并成功使其在Ubuntu上运行,此篇主要描述将其移植到嵌入式arm开发板上(在官方手册中有列举支持的硬件平台架构)。 交叉编译 1. 解压源工程代码; 2.进…

XUbuntu22.04之统计屏幕使用时间activitywatch(一百八十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Node.js-http模块服务端请求与响应操作,请求报文与响应报文

简单案例创建HTTP服务端: // 导入 http 模块 const http require("http"); // 创建服务对象 const server http.createServer((request, response) > {// 设置编码格式,解决中文乱码问题response.setHeader("content-type", &…

WAF独木难支 RASP与ADR将成应用安全防护2.0时代新宠

曾几何时,黑客攻击大多通过网络层进行,但随着基于网络层的基础安全防护措施趋于严密,防火墙、入侵防御、防病毒等安全软硬件构建起了相对完善的防护体系,想再从网络层钻空子的难度增大。如今,黑客攻击从网络层转入Web为…

学无止境·运维高阶③(Mysqldump脚本)

Mysqldump脚本 1、详细脚本2、执行 1、详细脚本 #!/bin/bash mysql_cmd‘-uroot -pRedHat123’ exclude_db‘information_schema|performance_schema|sys’ bak_path/backup/db mysql m y s q l c m d − e ′ s h o w d a t a b a s e s ′ − N ∣ e g r e p − v " {m…

网络电视盒子哪个品牌好?2023最新性价比电视盒子排行榜

电视盒子是电视机成本最低的更新方案,但面对众多品牌和机型时往往不知道网络电视盒子哪个品牌好,踩雷的消费者非常多,想要小编分享电视盒子推荐,今天带新手们了解一下业内最新的性价比电视盒子排行榜,看看哪些电视盒子…

Docker 安装 Tomcat

目录 一、查看 tomcat 版本 二、拉取 Tomcat Docker 镜像 三、创建 Tomcat 容器 四、访问 Tomcat 五、停止和启动容器 一、查看 tomcat 版本 访问 tomcat 镜像库地址:https://hub.docker.com/_/tomcat,可以通过 Tags 查看其他版本的 tomcat; 二、拉…

聊聊我的故事-悲惨的童年

目录 前言一、介绍二、17年回顾1.出生2.上幼儿园3.上小学4.上初中 高中总结 前言 本人是06年生的,快18了, 提示:以下是本篇文章正文内容,下面案例可供参考 一、介绍 本人已经17了,在这17年过的很悲惨,也…

【Linux多线程】设计一个线程池(代码+讲解)

线程池 Lock.hpp说明 Task.hpp代码代码说明 Threadpool.hpp代码说明 Threadpool.cc代码说明 Log.hpp代码说明 Makefile运行结果 Lock.hpp #pragma once#include <iostream> #include <pthread.h>class Mutex { public:Mutex(){pthread_mutex_init(&lock_, nul…

百度离线地图(包含轨迹回放)

先来个效果图&#xff08;demo没那么仔细&#xff09; 现在下载资源包文件放至static文件内 如果需要新的瓦片则添加至static/tiles(我用的是png也可以是jpg) 在此处修改即可 但是&#xff0c;最好还是放在服务器内&#xff0c;因为瓦片很多&#xff0c;项目是无法运行的&…

FTP Cadence中心库的创建与配置 (中)

在上节介绍的ftp服务器根目录下 一、创建一个文件夹 Cadence_lib&#xff0c;并把其设置为 共享。 共享给用户hw 和用户layout&#xff0c;并设置对应权限。 点击“共享”按钮。 二、在Cadence_lib文件夹下&#xff0c;添加如下文件夹&#xff0c;及文件。 其中 “00DataShee…

Vue-函数式组件

最近在开发项目的时候&#xff0c;定制了一个公司内部样式的Modal模态框组件。 Modal组件伪代码 <!-- Modal/index.vue--> <template><div class"modal-container" id"modalContainer"><!-- Modal Content --><div class&quo…

MySQL的索引使用的数据结构,事务知识

一、索引的数据结构&#x1f338; 索引的数据结构&#xff08;非常重要&#xff09; mysql的索引的数据结构&#xff0c;并非定式&#xff01;&#xff01;&#xff01;取决于MySQL使用哪个存储引擎 数据库这块组织数据使用的数据结构是在硬盘上的。我们平时写的代码是存在内存…

编译原理陈火旺第三版第九章课后题答案

下面的答案仅供参考&#xff01; 1. 有哪些存储分配策略&#xff1f;并叙述何时用何种存储分配策略&#xff1f; 答&#xff1a;存储分配策略分为静态分配策略和动态分配策略两大类,而动态分配策略又可分为栈式动态分配策略和堆式动态分配策略两类。 在一个的具体的编译…

软件测试需求分析的常用方法

软件测试需求分析时&#xff0c;应要求产品人员对需求进行讲解&#xff0c;并使用相对应的方法进行科学分析&#xff0c;否则无法保障软件测试的完整性和科学性&#xff0c;从而造成在项目中后期Bug频出、风险增大等问题。 而常用的测试需求分析的方法&#xff1a; 1、功能分解…

腾讯云MSS多项能力获IDC五星评价,综合实力位列第一

近日&#xff0c;IDC发布了《IDC Technology Assessement: 中国公有云托管安全服务能力&#xff0c;2023》报告&#xff08;以下简称“报告”&#xff09;。腾讯云安全托管服务MSS凭借多年的技术积累和出色的服务能力&#xff0c;在报告的专家能力、漏洞及威胁检测、事件分析、…