Formular absenden und Antwort parsen

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

  • Formular absenden und Antwort parsen

    Ich hoffe meine Fragen sind nicht zu blöd, ich habe wirklich noch nie was mit php gemacht

    Ich suche eine Möglichkeit, Daten von Büchern abzufragen.

    Ich habe bereits einiges in Java und C/C++ programmiert, Skriptsprachen wie PHP oder Perl und der Einsatz im Internet gingen bisher an mir vorbei (bzw. konnte ich mich davor während meiner Ausbildung erfolgreich drücken ).
    Da ich aber genau diese Wissenslücke nun aufholen will, habe ich vor, für mich persönlich ein PHP-Skript zu machen, dem man z.B. den Buchtitel übergibt und das Skript das zugehörige Erscheinungsdatum, Autor und dergleichen findet.

    Das alles läuft dann lokal auf meinem PC und ist nur für mich gedacht, um damit Erfahrungen zu sammeln.

    Ich habe mir dazu die API von Amazon angeschaut, aber die scheint kostenpflichtig zu sein. Dann hat mir jemand geraten, meine Anfrage per GET an die Amazon-Suche zu senden und die Antwort entsprechend zu parsen.

    Das hab ich dann versucht. Und nachdem Skripte zusammenkopieren wie erwartet nicht das Wahre war habe ich nun mehr oder weniger ein eigenes geschrieben. Das ruft auch die Amazon-Suchseite auf und übergibt einen Suchbegriff und speichert das Ergebnis als HTML.
    Zumindest sollte es so sein, gespeichert wird aber nur die Suchseite (immerhin).

    Ich geh mal stark davon aus, dass ich die Suchanfrage falsch zusammenbaue aber so richtig weiß ich nun nicht, wie ich weitermachen soll. Muss ich die Ergebnisseite vielleicht nochmal abfragen? Ich steh auf dem Schlauch

    Für jede Hilfe bin ich dankbar!

    PHP-Code:
    <?php
    printf
    ("Start!\n");

    // host, site and searchstring
    $host "www.amazon.de";
    $path "/Erweiterte-Suche-Bücher/b?ie=UTF8&node=124535011";
    $referer "www.amazon.de";
    $suchstring "Der Herr der Ringe";

    // url öffnen und daten senden
    $amazon_suche fsockopen($host80);
    printf("Open socket!\n");
    fputs($amazon_suche"GET $path HTTP/1.1\r\n");
    fputs($amazon_suche"Host: $host\r\n");
    fputs($amazon_suche"Referer: $referer\r\n");
    fputs($amazon_suche"Content-type: application/x-www-form-urlencoded\r\n");
    fputs($amazon_suche"Content-length: "strlen($suchstring) ."\r\n");
    fputs($amazon_suche"Connection: close\r\n\r\n");
    printf($amazon_suche+"\n");
    fputs($amazon_suche$suchstring);
    printf("Send data!\n");

    // antwort entgegenehmen
    while(!feof($amazon_suche)) {
        
    printf("test\n");
        
    $ergebnis .= fgets($amazon_suche128);
    }
    printf("Recieve data!\n");
    fclose($amazon_suche);

    // seite speichern
    $file fopen("test.html","w");
    fputs($file$ergebnis);
    printf("Save file!\n");

    printf("End!\n");

    ?>

  • #2
    Hallo,

    zunächst mal ist der HTTP-Zugriff über Sockets nicht so ganz das Wahre, weil du den Response des Servers erst dekodieren müsstest, um an den HTML-Code zu kommen (Stichwort: Chunked Transfer Coding). Besser du nutzt die cURL-Erweiterung von PHP.

    Dein zweites Problem ist die mangelnde Kenntnis des HTT-Protokolls selbst. Eine GET-Anfrage hat nie einen Request Body, daher ist es völlig richtig, dass der Server den ignoriert und die Anfrage als Aufruf der Suchseite versteht. Entweder du übergibst die Parameter per GET in der URL oder halt per POST im Request Body.

    Den Suchstring musst du dann als Wert des entsprechenden Parameters übergeben und das natürlich auch URL-encoded und nicht einfach irgendwie.

    Wenn du Firefox benutzt, installier dir mal die LiveHTTPHeaders-Extension und sieh dir damit an, wie dein Browser mit dem Server kommuniziert, um schonmal einen Eindruck davon zu bekommen, wie es richtig gehen müsste.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Hallo AmicaNoctis und danke für Deine Hilfe!

      Danke für den Tipp mit der LiveHTTPHeaders-Extension. Habe diese installiert und nun ist mir auch klar, warum es nicht funktioniert hat. Wie Du richtigerweise erkannt hast, hatte ich das HTTP-Protokoll nicht verstanden. Aber wenn man sieht, was der Browser schickt kann man das leicht interpretieren.

      Bzgl. Chunked Transfer Coding werde ich mich noch schlau machen. Danke nochmals.

      Kommentar


      • #4
        Zitat von isotrix Beitrag anzeigen
        ...

        Bzgl. Chunked Transfer Coding werde ich mich noch schlau machen. Danke nochmals.
        Ein einfacher Hack ist, die Anfrage als HTTP-1.0 zu deklarieren. Ein ordentlich konfigurierter Server verzichtet dann darauf, Chunked-Transfer-Encoding zu verwenden.

        Natürlich ist das nicht das Wahre. Aber in den Benutzerkommentaren zu fsockopen() solltest du diverse Beispiele finden, die mit CTE klarkommen. Ein Blick in die passende RFC-Dokumentation schadet auch nicht.
        Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

        Kommentar


        • #5
          Zitat von isotrix Beitrag anzeigen
          Bzgl. Chunked Transfer Coding werde ich mich noch schlau machen.
          ... was du aber gar nicht müsstest, wenn du einfach cURL verwendest. Das kümmert sich für dich um alles - sozusagen ein programmgesteuerter Textbrowser.
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar

          Lädt...
          X