2015-04-17 13 views
5

[Edit: risolto, vedi a metà strada nel testo della domanda]Youtube + Selenium (Python) - Come sapere quando termina il video?

Domanda veloce sulla comprensione dei contenuti di una pagina di YouTube con un video che gioca in esso:

In sintesi

I utilizzare Selenium per riprodurre video su Youtube, come parte di una GUI basata su browser.

Ho bisogno di sapere quando il video ha finito di suonare, perché la GUI fa qualcos'altro (ad esempio, carica l'HTML locale nel browser).

snippet di codice in discussione

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) 

A questo punto ho potuto time.wait() per la lunghezza del video.

Tuttavia, mi chiedo se ho potuto interrogare la pagina di YouTube tramite il driver selenio e misurare il tempo rimanente per il play-through in un ciclo while (io non sono a conoscenza di come estrarre queste informazioni da una pagina youtube)

Grazie!

[modifiche con la soluzione]

Selenio soluzione

Grazie a Stanjer, ea this answer e this other answer, è possibile ottenere lo stato movie_player attraverso questo metodo:

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

(non dimenticare di aggiungere "return" all'inizio della sceneggiatura)

Soluzione alternativa Selenio

meno elegante ma vale la pena sottolineare: driver.text restituisce una stringa che rappresenta il timer di video in questo formato stringa '01:00/02:00'. Pertanto si può verificare se il video viene riprodotto fino da qualcosa in queste righe:

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

[modifica] Come da commento di Jose, queste informazioni si può accedere anche da:

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

Complication e il prossimo domanda

Ho bisogno di aprire il video in formato ingrandito e con autoplay.

Ciò significa che io chiamo il seguente url:

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

Tuttavia questo restituisce un brevissimo html che contiene solo un codice embed, come da esempio qui:

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

quindi non ho movie_player elemento qui.

Metodo 1: è possibile estrarre il timer dallo application/x-shockwave-flash?

Approccio 2 - Se lancio il video di youtube in una classica pagina Youtube, come posso dire allo movie_player di ingrandirsi?

(nota: this answer e this answer probabilmente contengono informazioni per risolvere approccio 2, posterò se ottengo questo lavoro con selenio)

risposta

6

è possibile eseguire API JavaScript nel contesto della pagina dei video youtube:

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

Quindi, secondo https://developers.google.com/youtube/js_api_reference?csw=1

state == 0 è quando un video è terminato

È possibile aggiungere un esecutore in un ciclo controllando lo stato ogni N secondi.

+0

Ha, cercando di upvotare ma non ha abbastanza rep! – Pythonic

1

È possibile ottenere la durata del video e il tempo di riproduzione corrente come testo, quindi convertirli in secondi. Inoltre, come loop puoi aspettare che l'ora attuale raggiunga la lunghezza del video.

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 

funziona solo mentre il tempo e il titolo vengono visualizzati sullo schermo. Dopo un paio di secondi, i titoli scompaiono e il valore restituito è "".

Problemi correlati