Python 2.7 Youtube+;Selenium ChromeDriver(Python)-如何知道视频何时结束?

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

[编辑:已解决,请参见问题正文的中间部分]

了解Youtube页面内容并播放视频的快速问题:

总之

我使用Selenium在Youtube上播放视频,作为基于浏览器的GUI的一部分

我需要知道视频何时播放完毕,以便GUI执行其他操作(例如,将本地HTML输入浏览器)

代码片段和问题

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&amp;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]")
在铬上工作