2015-04-17 13 views
5

[Edit: rozwiązany, patrz połowie drogi w tekście Pytanie]Youtube + Selenium (Python) - Jak sprawdzić, kiedy wideo się kończy?

szybkie pytanie na zrozumieniu zawartości strony YouTube z odtwarzaniem wideo w nim:

Podsumowując

I używać Selenium do odtwarzania filmów na Youtube, jako część GUI opartego na przeglądarce.

Muszę wiedzieć, kiedy wideo się zakończyło, ponieważ GUI robi coś innego (np. Przesyłaj lokalny kod HTML w przeglądarce).

fragment kodu i pytanie

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) 

W tym momencie mogłem time.wait() do długości filmu.

Zastanawiam się jednak, czy mogę zapytać stronę youtube za pośrednictwem sterownika selenu i ocenić czas pozostały do ​​zakończenia odtwarzania w pętli (nie wiem, jak wyodrębnić te informacje ze strony youtube)

Dzięki!

[Edits roztworem]

Selen Rozwiązanie

Dzięki Stanjer oraz this answer i this other answer, można uzyskać status movie_player dzięki tej metodzie:

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

(nie zapomnij dodać "return" na początku skryptu)

Selen alternatywne rozwiązanie

Mniej eleganckie, ale warto zwrócić uwagę: driver.text Zwraca ciąg reprezentujący licznik wideo w tym formacie string „1:00/2:00”. Dlatego można sprawdzić, czy film jest odtwarzany przez coś wzdłuż tych linii:

video_is_playing = True 
while video_is_playing: 
    time.sleep(1) 
    video_is_playing = not(driver.text[:4] == driver.text[-4:]) 

[edit] Jak na komentarz Jose, ta informacja może być również dostępne przez:

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

komplikacji i następny pytanie

Potrzebuję otworzyć wideo w zmaksymalizowanym formacie iz autoodtwarzaniem.

Oznacza to nazywam następujący adres URL:

youtube.com/v/<video_code>?rel=0&autoplay=1 

Jednak ta zwraca bardzo krótki kod HTML, który zawiera tylko kod do umieszczenia na stronie, jak na przykład tutaj:

<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> 

Więc nie mam movie_player element tutaj.

Podejście 1 - czy mogę wyodrębnić czasomierz z application/x-shockwave-flash?

Podejście 2 - Jeśli uruchomię film z youtube na klasycznej stronie YouTube, jak mogę powiedzieć, że movie_player, aby zmaksymalizować sam?

(uwaga: this answer i this answer prawdopodobnie zawierać informacje rozwiązać podejście 2, będą pisać jeśli dostanę tę pracę z selen)

Odpowiedz

6

Można wykonać javascript API w kontekście strony wideo Youtube:

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

Więc według https://developers.google.com/youtube/js_api_reference?csw=1

state == 0 kiedy film dobiegł końca

Możesz dodać executora w pętli sprawdzając stan co N sekund.

+0

Ha, próbując przegłosować, ale nie masz wystarczającej liczby powtórzeń! – Pythonic

1

Możesz uzyskać długość wideo i bieżący czas odtwarzania jako tekst, a następnie przekonwertować je na sekundy. Ponadto, jako pętlę możesz poczekać, aż bieżący czas osiągnie długość filmu.

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 

to działa tylko wtedy, gdy czas i tytuł są wyświetlane na ekranie. Po kilku sekundach tytuły znikają, a zwrócona wartość "".

Powiązane problemy