Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem beim Auslesen von HTML-Sourcecode mit cURL

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem beim Auslesen von HTML-Sourcecode mit cURL

    Hallo,

    ich versuche ein Datensheet von einem Web-Frontend automatisch einzulesen, um daraus ein automatisches Reporting zu erstellen.

    folgendes habe ich mit cURL ausgeführt:

    PHP-Code:
    // init cURL HTTP Client
    $header = array();
    $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[] = "Accept-Language: en-us,en;q=0.5";
    $header[] = "Pragma: ";

    $ch curl_init();
    curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7');
    curl_setopt($chCURLOPT_HTTPHEADER$header);
    curl_setopt($chCURLOPT_COOKIEFILE'/.cookies');
    curl_setopt($chCURLOPT_COOKIEJAR,  '/.cookies');
    curl_setopt($chCURLOPT_AUTOREFERERTRUE);
    curl_setopt($chCURLOPT_FOLLOWLOCATIONTRUE);
    curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
    curl_setopt($chCURLOPT_FAILONERRORTRUE);
    curl_setopt($chCURLOPT_HEADERTRUE);
    curl_setopt($chCURLOPT_CONNECTTIMEOUT600);

    curl_setopt($chCURLOPT_URL'https:// ... /signin.html');
    curl_setopt($chCURLOPT_POSTTRUE);
    curl_setopt($chCURLOPT_POSTFIELDS"username=".$login."&password=".$pass);
    $response curl_exec($ch); 
    Soweit alles bestens. Der Login funktioniert. Ich kann mir jetzt auch weitere URLs in dem geschützten Bereich aufrufen. Wenn ich jetzt allerdings den eigentlichen Datasheet holen will, mit:

    PHP-Code:
    curl_setopt($chCURLOPT_URL'https:// ... /data.html');
    curl_setopt($chCURLOPT_POSTFALSE);
    curl_setopt($chCURLOPT_POSTFIELDS'');
    $response curl_exec($ch); 
    bekomme ich folgenden Quellcode:

    Code:
    <html>
    <head>
    <script language='javascript'>function autoNavigate() {window.location="data.html";}</script>
    </head>
    <body onload='autoNavigate()'></body>
    </html>
    D.h. die gleiche Seite, die ich vorher aufgerufen habe, wird wieder per Javascript geladen. Im Browser funktioniert das ohne Problem, aber wenn ich die Seite mit curl_exec($ch) nochmal lade, bekomme ich eine 302-Fehler.

    Gibt es eine Möglichkeit mit cURL einen "Refresh" ohne einen "Reload" zu machen? Oder hat jemand eine Idee, wie ich auch diese Seite bekomme oder was den Fehler verursachen könnte?

    Vielen Dank!

  • #2
    refersh ohne relaod?
    lade doch einfach die seite neu.

    Kommentar


    • #3
      Zitat von digg_de Beitrag anzeigen
      bekomme ich eine 302-Fehler.
      302 ist kein Fehler.

      Du machst einen POST-Request. Nach einem POST-Request ist es nichts ungewöhnliches, direkt weiterzuleiten. Das verhindert, dass du beim zurück klicken in der History wieder auf diesen POST-Request stößt, und das Formular somit doppelt absendest.

      Sende danach einfach nochmal einen Request per GET, Cookies hat curl ja.
      [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

      Kommentar


      • #4
        Ja, richtig ein 302 ist kein Fehler. Ich hatte vergessen zu schreiben, dass der 302 auf eine Error-Page weiterleitet.

        Hier ein Teil des Header:
        Code:
        HTTP/1.1 302 Found
        Server: Apache-Coyote/1.1
        Cache-Control: private
        Location: https:// ... /reportingError.html
        Content-Type: text/html;charset=windows-1252
        Content-Length: 0
        Set-Cookie: JSESSIONID=C9CFFE27F202765BC562274539CA11F5; Path=/; Secure; HttpOnly
        Vary: User-Agent
        Das erneute Laden der gleichen Seite verursacht ja gerade den Fehler. Im Browser wird natürlich nicht auf die Error-Page weitergeleitet, sondern der richtige Inhalt angezeigt.

        Ich habe das jetzt mit CasparJS umgesetzt. Da funktioniert alles wie es soll und der richtige Content wird angezeigt. Aber das eigentliche Problem mit cURL bleibt. Ich denke, irgendwas wird da im Hintergrund der Seite noch gemacht, womit cURL nicht klar kommt, da es ja nicht direkt einen Browser simuliert.

        Kommentar

        Lädt...
        X