2015-04-17 7 views
5

यूट्यूब + सेलेनियम (पायथन) - वीडियो समाप्त होने पर कैसे पता चलेगा?

सारांश

मैं में:

त्वरित सवाल एक वीडियो में यह में खेलने के साथ एक यूट्यूब पेज की सामग्री को समझने पर [संपादित हल, बीच में ही प्रश्न के पाठ में देखते हैं] ब्राउज़र आधारित जीयूआई के हिस्से के रूप में, यूट्यूब पर वीडियो चलाने के लिए सेलेनियम का उपयोग करें।

मुझे यह जानने की ज़रूरत है कि वीडियो कब खेलना समाप्त हो गया है, क्योंकि जीयूआई कुछ और करता है (उदाहरण के लिए ब्राउज़र में स्थानीय HTML फ़ीड करें)।

कोड स्निपेट और इस बात मैं कर सकता time.wait() वीडियो की लंबाई के लिए पर

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) 

सवाल उठाते हैं।

हालांकि, मुझे आश्चर्य है कि क्या मैं सेलेनियम ड्राइवर के माध्यम से यूट्यूब पेज से पूछताछ कर सकता हूं और थोड़ी देर में प्ले-थ्रू के लिए शेष समय गेज कर सकता हूं (मुझे इस जानकारी को यूट्यूब पेज से निकालने के तरीके से परिचित नहीं है)

धन्यवाद!

[संपादित करता समाधान के साथ]

सेलेनियम समाधान

धन्यवाद Stanjer के लिए, और this answer और this other answer करने के लिए, आप इस विधि के माध्यम से movie_player स्थिति प्राप्त कर सकते हैं:

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

(स्क्रिप्ट की शुरुआत में "वापसी" जोड़ने के लिए मत भूलना)

सेलेनियम वैकल्पिक समाधान

कम सुरुचिपूर्ण लेकिन उनका कहना है लायक: driver.text रिटर्न एक स्ट्रिंग इस स्ट्रिंग प्रारूप '01:00/02:00' में वीडियो टाइमर का प्रतिनिधित्व। इसलिए आप देख सकते हैं कि वीडियो इन पंक्तियों के साथ कुछ द्वारा के माध्यम से निभाई है:

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

जटिलता और अगले:

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

[संपादित करें] जोस की टिप्पणी के अनुसार, इस जानकारी भी एक्सेस कर सकता है प्रश्न

मुझे वीडियो को अधिकतम प्रारूप में और ऑटोप्ले के साथ खोलने की आवश्यकता है।

इसका मतलब यह है कि मैं इस यूआरएल फोन:,

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

हालांकि यह एक बहुत ही कम एचटीएमएल जो केवल एक एम्बेड कोड शामिल रिटर्न उदाहरण के अनुसार यहाँ:

<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 - यदि मैं क्लासिक यूट्यूब पेज में यूट्यूब वीडियो लॉन्च करता हूं, तो मैं movie_player को अपने आप को अधिकतम करने के लिए कैसे कह सकता हूं?

(ध्यान दें: this answer और this answer शायद दृष्टिकोण 2 हल करने के लिए जानकारी होते हैं, अगर मैं इस सेलेनियम के साथ काम करने के लिए मिलता पोस्ट करेंगे)

उत्तर

6

आप यूट्यूब वीडियो पृष्ठ के संदर्भ में जावास्क्रिप्ट एपीआई पर अमल कर सकते हैं:

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

तो https://developers.google.com/youtube/js_api_reference?csw=1

state == 0 के अनुसार होता है जब एक वीडियो समाप्त हो गया है

आप प्रत्येक एन सेकेंड में राज्य की जांच करने वाले लूप में एक निष्पादक जोड़ सकते हैं।

+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 

यह केवल, जबकि समय और शीर्षक स्क्रीन पर दिखाए जाते हैं काम करता है। एक बार कुछ सेकंड पहले, खिताब गायब हो जाते हैं और लौटाया मूल्य "" होता है।

संबंधित मुद्दे