Python 2.7 Youtube+;Selenium ChromeDriver(Python)-如何知道视频何时结束?
[编辑:已解决,请参见问题正文的中间部分] 了解Youtube页面内容并播放视频的快速问题: 总之 我使用Selenium在Youtube上播放视频,作为基于浏览器的GUI的一部分 我需要知道视频何时播放完毕,以便GUI执行其他操作(例如,将本地HTML输入浏览器) 代码片段和问题Python 2.7 Youtube+;Selenium ChromeDriver(Python)-如何知道视频何时结束?,python-2.7,selenium,selenium-webdriver,youtube,Python 2.7,Selenium,Selenium Webdriver,Youtube,[编辑:已解决,请参见问题正文的中间部分] 了解Youtube页面内容并播放视频的快速问题: 总之 我使用Selenium在Youtube上播放视频,作为基于浏览器的GUI的一部分 我需要知道视频何时播放完毕,以便GUI执行其他操作(例如,将本地HTML输入浏览器) 代码片段和问题 import os, time from selenium import webdriver # [...] chromedriver = 'path_to_chromedriver_binary' # subs
import os, time
from selenium import webdriver
# [...]
chromedriver = 'path_to_chromedriver_binary' # substitute as appropriate
driver = webdriver.Chrome(chromedriver)
youtube_link = 'https://www.youtube.com/watch?v=somevideo'
driver.get(youtube_link)
此时,我可以time.wait()
查看视频的长度
length_str = driver.find_element_by_class_name("ytp-time-duration").text
current_time_str = driver.find_element_by_class_name("ytp-time-current").text
import re
length = re.findall(r'\d+', length_str) # convert ['2:24'] to ['2', '24']
current_time = re.findall(r'\d+', current_time_str)
length_sec = 60 * int(length[0]) + int(length[1])
current_time_sec = (60 * int(current_time[0]) + int(current_time[1]))
remaining_time = length_sec - current_time_sec
但是,我想知道是否可以通过Selenium驱动程序查询YouTube页面,并在while循环中计算播放剩余时间(我不熟悉如何从YouTube页面提取此信息)
谢谢
[使用解决方案编辑]
硒溶液
import os, time
from selenium import webdriver
# [...]
chromedriver = 'path_to_chromedriver_binary' # substitute as appropriate
driver = webdriver.Chrome(chromedriver)
youtube_link = 'https://www.youtube.com/watch?v=somevideo'
driver.get(youtube_link)
感谢Stanjer和to and,您可以通过以下方法获得电影播放器的状态:
player_status = driver.execute_script("return document.getElementById('movie_player').getPlayerState()")
(不要忘记在脚本开头添加“return”)
硒替代溶液
import os, time
from selenium import webdriver
# [...]
chromedriver = 'path_to_chromedriver_binary' # substitute as appropriate
driver = webdriver.Chrome(chromedriver)
youtube_link = 'https://www.youtube.com/watch?v=somevideo'
driver.get(youtube_link)
不那么优雅但值得指出的是:
driver.text
以字符串格式“1:00/2:00”返回表示视频计时器的字符串。因此,您可以检查视频是否由以下内容播放:
video_is_playing = True
while video_is_playing:
time.sleep(1)
video_is_playing = not(driver.text[:4] == driver.text[-4:])
[编辑]根据Jose的评论,此信息也可以通过以下方式访问:
driver.find_element_by_class_name("ytp-time-current").text
复杂性和下一个问题
import os, time
from selenium import webdriver
# [...]
chromedriver = 'path_to_chromedriver_binary' # substitute as appropriate
driver = webdriver.Chrome(chromedriver)
youtube_link = 'https://www.youtube.com/watch?v=somevideo'
driver.get(youtube_link)
我需要以最大化的格式打开视频,并使用自动播放
这意味着我调用以下url:
youtube.com/v/<video_code>?rel=0&autoplay=1
youtube.com/v/?rel=0&autoplay=1
但是,这将返回一个非常短的html,其中仅包含嵌入代码,如下例所示:
<HTML><HEAD></HEAD>
<BODY leftMargin=0 scroll=no topMargin=0>
<EMBED height="100%"
type=application/x-shockwave-flash
width="100%"
src=https://www.youtube.com/v/Fsc-oT9PsSQ?rel=0&autoplay=1
fullscreen="yes">
</BODY>
</HTML>
所以我这里没有movie\u player
元素
方法1-我可以从应用程序/x-shockwave-flash
中提取计时器吗
方法2-如果我在一个经典的youtube页面中启动youtube视频,我如何告诉电影播放器
最大化自己
(注意:可能包含解决方法2的信息,如果我将其用于Selenium,将发布)您可以在youtube视频页面的上下文中执行javascript API:
youtubePlayer = document.getElementById("movie_player");
youtubePlayer.getPlayerState();
所以根据
state==0
是视频结束时的状态
您可以在循环中添加一个执行器,每N秒检查一次状态
您还可以使用Youtube iFrame API的“onStateChange”函数在状态更改时打印
function onPlayerStateChange(event) {
console.log(player.getPlayerState()); // 1 = Playing || 2 = Paused || 3 = <<- O ->> || 0 = Finished.
}
函数onPlayerStateChange(事件){
console.log(player.getPlayerState());//1=播放| | 2=暂停| | 3=| | 0=完成。
}
您可以将视频长度和当前播放时间作为文本,然后将其转换为秒。此外,作为一个循环,您可以等待直到当前时间达到视频的长度
length_str = driver.find_element_by_class_name("ytp-time-duration").text
current_time_str = driver.find_element_by_class_name("ytp-time-current").text
import re
length = re.findall(r'\d+', length_str) # convert ['2:24'] to ['2', '24']
current_time = re.findall(r'\d+', current_time_str)
length_sec = 60 * int(length[0]) + int(length[1])
current_time_sec = (60 * int(current_time[0]) + int(current_time[1]))
remaining_time = length_sec - current_time_sec
它只在屏幕上显示时间和标题时工作。几秒钟后,标题消失,返回值为“.”还有另一种方法。只需添加等待
重播按钮:
video_ends = driver.find_element_by_css_selector(".ytp-chrome-controls button[title=Replay]")
在铬上工作