Videolink auslesen mit Selenium und PhantomJS

  • Moin zusammen,

    ich möchte den Link zum Video und Untertitel der Seite http://www.rtve.es/drmn/embed/video/3886778/ auslesen.
    Da Javascript im Spiel ist, reicht ein einfaches Auslesen des html-Codes nicht aus.

    Um den finalen Seitenquelltext zu erhalten, muß man auf das Bild klicken. Anscheinend erscheint ein Werbespot, der sich mit einem Klick rechts oben auf den entsprechenden Kasten ("Saltar promocion") nach 3 Sekunden überspringen läßt. Erst danach erhält man die finale Seite geliefert.

    Ich muß also irgendwie diese zwei Mausklicks unter Selenium nachbilden.
    Was muß ich dazu tun?

    Mein Code unter Phyton 2.7.13 und Windows 8.1 pro 64-bit sieht zur Zeit wie folgt aus:

    Das funktioniert soweit, ich erhalte den Seitentitel und ein korrektes Bild.

    Mein erster Versuch bestand darin, den 'Play-Button' zu lokalisieren und darauf "zu klicken". Das scheint aber gar nix zu ändern.

    Code
    driver.find_element_by_xpath("//*[@id='embed']/div/a/span/img").click()

    Außerdem habe ich noch folgendes probiert, ebenfalls erfolglos:

    Code
    el=driver.find_element_by_xpath("//*[@id='embed']/div/a/span/img")
    action = webdriver.common.action_chains.ActionChains(driver)
    action.move_to_element_with_offset(el, 5, 5)
    action.click()
    action.perform()


    ===> Hat jemand irgendeine Idee wie ich die gewünschten Informationen erhalte ?

    Im finalen Dokument sind folgende Angaben enthalten (die .vtt-Datei weist ein srt-Format auf):

    [font='Consolas, "']<video id="9455815513_html5_api" class="vjs-tech" preload="auto" autoplay="" src="http://mvod.lvlt.rtve.es/resources/TE_G…85475369464.mp4" >
    <p class="vjs-no-js">Para poder reproducir este contenido por favor habilite javascript en su navegador, y considere actualizar su navegador a uno que <a href="http://videojs.com/html5-video-support/" target="_blank" class="vjs-hidden" hidden="hidden">soporte HTML 5</a></p>
    <track kind="subtitles" label="es" srclang="es" src="/servicios/subtitulos/vtt/2015/1485507150340.vtt"></video>[/font]

  • Hey Giesinger !
    Mit CasperJS könntest du mit WaitForSelector auf den 'saltar promocion' button warten, und ihn dann mit casper.click klicken.
    Dann liest du mit getPageContent den Seitencode aus, und parst das teil, was du brauchst. Zwischendurch schaust du dir mit casper.capture an, was dein script gerade macht.
    Vorausgesetzt natürlich Casper ist okay, aber da Phantom schon im Titel steht wird es wohl in Ordnung gehen, oder ?

    Hier die Dokumentation für die einzelnen Befehler:
    http://docs.casperjs.org/en/latest/

    Ich würde dir ja gern den ganzen Code schreiben, brauche aber selber immer eine gefühlte Ewigkeit, bis ich was mit Casper ans laufen bekomme ^^

  • Ich steig' schon gar nicht mehr durch, welches Package wofür gut ist:
    MechanicalSoup, mechanize, robobrowser, selenium, phantomjs, ghost, casperjs, ghostdriver usw.
    CasperJS wird wohl prinzipiell in Javascript programmiert und eine Integration in Python ist nicht vorgesehen bzw. nur mit Aufwand möglich, da Python JavaScript nicht kennt. Python dient nur im Hintergrund der 'Kommunikation' zwischen CasperJS und PhantomJS.
    Ich würde daher eine reine Python-Lösung bevorzugen, mit welchem Package das realisiert wird, ist dabei eher zweitrangig.

  • Nightmare js nicht vergessen ;D
    PhantomJS schreibst du ja auch mit Javascript. Casper würde im Gegensatz zum 'reinen' Phantom einiges vereinfache, aber dass du eine reine Python Lösung willst kann ist verständlich.

    Ich blicke da ehrlich gesagt auch nicht durch, und hab mich auch nur kurz mit Casper / Phantom beschäftigt. Bei den anderen Packages kann ich dir leider nicht helfen.

  • Mit el.size erhalte ich die Ausgabe {'width': 48, 'height': 48} und mit el.location die Ausgabe {'y': 741.0, 'x': 16.0}, das entspricht ja genau den Eigenschaften des 'Play'-Icons.
    Wieso bewirkt el.click() nix bzw. die 'action'-Lösung ?

  • So, ich habe Geckodriver installiert und das Beispiel von oben funktioniert jetzt, wenn ich als webdriver Firefox anstelle PhantomJS benutze. Dummerweise besitzt Selenium keine Funktion, um Fenster zu minimieren, als work-around wird im Netz das Verschieben in den nicht-sichtbaren Bereich des Desktops oder alternativ die Änderung der Fenstergröße auf 1x1 Pixel genannt... Aber selbst dann dürfte bei Aufruf unter Kodi ganz kurz der Bildschirm 'aufflackern', wenn das Fenster geöffnet und verschoben/verkleinert wird.

  • So, letzter Versuch für heute:

    Unter Firefox oder Chrome kann ich mittels el=driver.find_element_by_xpath("//*[@id='embed']/div/a/span/img") das Play-Icon lokalisieren. Allerdings schaffe ich es nicht, den "Saltar promocion"-Button zu finden. Mit content = driver.find_element_by_css_selector(".vast-skip-button.enabled") findet er komischerweise nichts.

    Außerdem würde ich gerne statt der Abkürzung http://www.rtve.es/drmn/embed/video/3886778/ die eigentliche URL http://www.rtve.es/alacarta/showE…ricano/3886778/ benutzen. Bei mehrmaligem Aufruf der Abkürzung-URL erhalte ich hier eine 503-Fehlermeldung seitens des Servers, während die vollständige URL nach wie vor funktioniert.
    Aber bei Benutzen der vollständigen URL wird nicht einmal mehr das Play-Icon gefunden.... Woran liegt denn das jetzt?

  • Hat keiner eine Idee, wie ich unter Python den Video-Link von der Seite

    http://www.rtve.es/alacarta/showE…ricano/3886778/

    auslesen kann ?? Mittlerweile denke ich, daß Chrome am geeignetsten wäre, wenngleich ich hiermit bislang kein einziges Element finden kann, was folgende Mausklicks erschwert...
    Ansonsten ist mir natürlich auch jede andere Lösung recht, solange es später in einem Video-Plugin benutzbar ist.

  • Lynx187:
    Im ersten Ansatz hatte ich tatsächlich die Website gescrapt, weil ich die API nicht kannte. Das habe ich zwischenzeitlich geändert bzw. teilweise greife ich nach wie vor auf die Website zurück, weil die API nicht alle notwendigen Funktionen bereitstellt. Zum Beispiel ist es m.W. mit der API nicht möglich, zwischen 'kompletten' Episoden und Vorschau zu unterscheiden. Das geht nur über die Website.
    Und bei dem ursprünglichen Problem hilft die API ohnehin nicht weiter, nämlich der Entschlüsselung der Links. Dazu habe ich mit den Entwicklern des streamlink-Projektes Kontakt aufgenommen und diese haben es implementiert. Ich warte hierzu noch auf eine kleine Optimierung, sobald diese von den streamlink-Machern aufgenommen und umgesetzt wurde, kann ich das Addon veröffentlichen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!