Dynamischen Inhalt einer Seite erfassen: PHP PhantomJS?



  • Hallo,

    wie kann ich mit PHP von einer (dieser) Website den "dynamischen" Inhalt erfassen?

    Wenn ich im Browser den Quelltext der Seite anzeigen lasse, bekomme ich nur das statische HTML angezeigt.
    Mit den "Developer tools" (Chrome) hingegen sehe ich den dynamisch generierten Inhalt.

    Die Frage ist jedoch wie ich mit PHP daran komme? Ich möchte im Endeffekt den Preis ("$1.0530") auslesen.

    Ich habe da etwas zunächst Vielversprechendes gefunden: PHP PhantomJS
    Jedoch scheint das nicht zu klappen:

    (Mit Wrapper)

    $myUrl = "https://www.iconomi.net/dashboard/#/INDEX";
    $browser = \MTS\Factories::getDevices()->getLocalHost()->getBrowser('phantomjs');
    $windowObj = $browser->getNewWindow($myUrl);
    $domData = $windowObj->getDom();
    echo $domData; // gibt nur statisches HTML aus..
    

    (Ohne Wrapper, wie in Basic Usage)

    $response->getContent(); // auch nur statisches HTML..
    

    Was übersehe ich? Müsste nicht das JS ausgeführt werden und mir der Inhalt zurückgegeben werden, so wie es auch ein Browser machen würde?

    Danke!


  • Mod

    Schon probiert mit einem Delay zu arbeiten? Ich habe PhantomJS nie verwendet, aber bei vielen solchen Tools ist das Problem dass JavaScript ja Asynchron läuft und der Renderer nie weiß wann das JS jetzt fertig ist - sprich, ein 5 Sekunden delay oder so sollte dir das richtige Ergebnis liefern.



  • Moment mal, async bei PHP? 🤡



  • AJAX? Ja, asynchron per PHP und Javascript. Das geht und ist eigentlich nicht unüblich.



  • Moment Nico, du verwechselst da was.

    "PHP PhantomJS" ist PHP Code, welcher das PhantomJS Backend (in meinem Fall ne .exe) anspricht. Und das verarbeitet eine gegebene Seite mit JS entsprechend wie ein Browser.
    Der Output sollte das HTML sein, welches mit JS erzeugt wird.
    Bei mir jedoch leider nur das HTML noch bevor JS etwas dran gemacht hat.

    So versteh ich das jedenfalls..



  • herbert3 schrieb:

    Moment Nico, du verwechselst da was.

    "PHP PhantomJS" ist PHP Code, welcher das PhantomJS Backend (in meinem Fall ne .exe) anspricht. Und das verarbeitet eine gegebene Seite mit JS entsprechend wie ein Browser.
    Der Output sollte das HTML sein, welches mit JS erzeugt wird.
    Bei mir jedoch leider nur das HTML noch bevor JS etwas dran gemacht hat.

    So versteh ich das jedenfalls..

    Ja und was hat das jetzt damit zu tun, dass der auf der Website vorhandene JS eventuell erst nach dem statischen HTML-Content fertig wird?

    Worauf dich Shade hinweisen wollte, ist dass dieser Call $windowObj = $browser->getNewWindow($myUrl); oder auch dieser $domData = $windowObj->getDom(); eventuell den Zustand der Website ausgibt, bevor der JS überhaupt Arbeit geleistet hat. D
    Daher füge einen kleinen wait ein und schaue, ob das das Problem löst.



  • Schon klar, aber PHP kommuniziert ja mit dem PhantomJS backend und muss ja eigentlich mit der Funktion warten, bis alles abgearbeitet ist.
    Das ist doch der Sinn von PhantomJS.

    Aber ich werd's mal versuchen.



  • Tatsächlich...
    Ein sleep(3); zw. $browser->getNewWindow() und $windowObj->getDom() hat's getan!
    Zwar unsauber aber für meinen Zweck ausreichend.
    Danke.



  • Use:

    selector = "[id=someElementId]"; exists = windowObj>getSelectorExists(windowObj->getSelectorExists(selector);
    //true if exists, else false

    That way you won’t have a static delay



  • @Merlinthemagic
    Great, thanks. I may try that out on occasion.


Log in to reply