2015-04-17 4 views
5

[Edit: решена, см середине пути в тексте вопроса]Youtube + Selenium (Python) - Как узнать, когда заканчивается видео?

Быстрый вопрос о понимании содержания страницы Youtube с видео играет в нем:

Резюмируя

I используйте Selenium для воспроизведения видео на Youtube, как часть графического интерфейса на основе браузера.

Мне нужно знать, когда видео закончило играть, поскольку графический интерфейс делает что-то еще (например, подавать локальный 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=BHjg6cTxmrQ' 
driver.get(youtube_link) 

На данный момент я мог time.wait() для длины видео.

Тем не менее, я задал вопрос, могу ли я запросить страницу youtube через драйвер selenium и измерить оставшееся время для воспроизведения в цикле while (я не знаю, как извлечь эту информацию с страницы YouTube)

Спасибо!

[редактирует с решением]

Селен Решение

Благодаря Stanjer и this answer и this other answer, вы можете получить movie_player статус с помощью этого метода:

player_status = driver.execute_script("return document.getElementById('movie_player').getPlayerState()") 

(не забудьте добавить «return» в начале скрипта)

Селен Альтернативное решение

менее элегантный, но стоит отметить: 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:]) 

[править] В соответствии с комментарием Хосе, эта информация может также быть доступны:

driver.find_element_by_class_name("ytp-time-current").text 

Complication и рядом вопрос

Мне нужно открыть видео в максимальном формате и с автовоспроизведением.

Это означает, что я называю по следующему адресу:

youtube.com/v/<video_code>?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_player элемент здесь.

Подход 1 - могу ли я извлечь таймер из application/x-shockwave-flash?

Подход 2 - Если я запускаю видео с YouTube на классической странице Youtube, как я могу сообщить movie_player, чтобы максимизировать себя?

(примечание: this answer и this answer вероятно, содержат информацию, чтобы решить подход 2, разместит, если я получаю эту работу с селеном)

ответ

6

Вы можете выполнить JavaScript API в контексте YouTube видео страницы:

youtubePlayer = document.getElementById("movie_player"); 
youtubePlayer.getPlayerState(); 

Так, по https://developers.google.com/youtube/js_api_reference?csw=1

state == 0 когда видео закончилось

Вы можете добавить исполнителя в цикл, проверяя состояние каждые N секунд.

+0

Ха, пытаясь подняться, но не хватает репутации! – Pythonic

1

Вы можете получить длину видео и текущее время воспроизведения в виде текста, а затем преобразовать их в считанные секунды. Кроме того, в качестве цикла вы можете подождать, пока текущее время не достигнет длины видео.

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 
1
driver.find_element_by_class_name("ytp-time-current").text 

он работает только тогда, когда время и название отображаются на экране. Через пару секунд названия исчезают, а возвращаемое значение - «».

Смежные вопросы