Inhalt einer Internetseite einlesen



  • Hi!
    Ich möchte von einer Internetseite den dargestellten Text auslesen. Habe eben schon eine ganze Weile bei Google gesucht, aber irgendwie nichts gefunden, was ich auch so richtig verstehe. Habt ihr da ne Seite die das gut erklärt?

    http://www.tutorials.de/forum/c-c/252271-mit-c-php-dateien-auslesen.html

    Das ist die einzige Seite, wo ich das Gefühl habe, es geht in die Richtung.

    Danke schonmal, für eine Antwort.
    MfG One-Man-Army



  • Ok. Scheint ja keiner zu wissen. Naja dann mache ich mal nen Vorschlag der mir grad noch eingefallen ist. Wisst ihr ob es möglich wäre, mit den Funktionen aus der fstream-Bibliothek das auszulesen?
    Wie gesagt es geht halt um den angezeigten Inhalt, nicht um den Quelltext.



  • Das ist nicht mit fstream möglich, du musst die Daten ja von einem Webserver kriegen. Prinzipiell: Verbindung zum Webserver aufbauen auf Port 80 (Sockets) und einen HTTP Request schicken -> Website kommt zurück.

    Hier dürfte so ziemlich alles stehen was du brauchst:
    http://magazin.c-plusplus.net/artikel/Sockets und das HTTP-Protokoll



  • Nicht so ungeduldig. 😉

    Es gibt verschiedene Möglichkeiten. Du kannst z.B boost::asio benutzen, was aber recht Overhead ist, wenn du lediglich eine Seite laden willst. (gäbe aber sogar ein Beispiel dazu, wie das damit geht).

    Für das einfache lesen würde ich Betriebssystemspezifische Funktionen benutzen. Unter Windows benutze ich:
    http://msdn.microsoft.com/en-us/library/aa385103(VS.85).aspx

    Du brauchst natürlich so das korrekte Handle, damit du die Funktion benutzen kannst..

    Im übrigen kannst du lediglich den Quelltext runterladen. Mehr ist nicht verfügbar.. Du musst dann schon selbst dafür sorgen, dass du die korrekten Sachen parst.



  • Das geht relativ einfach. Zuerst öffnest Du (mit ganz gewöhnlichen Socket-Funktionen, socket(), connect()) eine Verbindung zum Webserver auf Port 80. Danach schickst Du folgenden String hin:

    "GET /xxx HTTP/1.0\r\n\r\n"
    

    Das xxx steht dabei für die Seite die Du anfordern willst, also z.B. index.html. Lässt Du xxx ganz weg, dann liefert dir der Server seine default-Seite.

    Als Rückantwort bekommst Du den HTTP-Header plus angehängter Seite. Die Trennung zwischen HTTP-Header und Seiteninhalt kannst Du als zwei aufeinanderfolgenden "\r\n" erkennen.



  • #include <boost/asio.hpp> 
    #include <boost/array.hpp> 
    #include <iostream> 
    #include <string> 
    
    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::resolver resolver(io_service); 
    boost::asio::ip::tcp::socket sock(io_service); 
    boost::array<char, 4096> buffer; 
    
    void read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred) 
    { 
      if (!ec) 
      { 
        std::cout << std::string(buffer.data(), bytes_transferred) << std::endl; 
        sock.async_read_some(boost::asio::buffer(buffer), read_handler); 
      } 
    } 
    
    void connect_handler(const boost::system::error_code &ec) 
    { 
      if (!ec) 
      { 
        boost::asio::write(sock, boost::asio::buffer("GET / HTTP 1.1\r\nHost: highscore.de\r\n\r\n")); 
        sock.async_read_some(boost::asio::buffer(buffer), read_handler); 
      } 
    } 
    
    void resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it) 
    { 
      if (!ec) 
      { 
        sock.async_connect(*it, connect_handler); 
      } 
    } 
    
    int main() 
    { 
      boost::asio::ip::tcp::resolver::query query("www.highscore.de", "80"); 
      resolver.async_resolve(query, resolve_handler); 
      io_service.run(); 
    }
    


  • Ok. Also der letzte Beitrag sagt mir jetzt gar nichts 😃
    Aber das andere werde ich mir mal angucken. Wenns nicht klappt, muss ich halt nochmal fragen 😉

    Danke schonmal.



  • One-Man-Army schrieb:

    Ok. Also der letzte Beitrag sagt mir jetzt gar nichts 😃
    Aber das andere werde ich mir mal angucken. Wenns nicht klappt, muss ich halt nochmal fragen 😉

    Danke schonmal.

    Schau hier, wenn du einen Einstieg zu boost::asio willst:
    http://www.highscore.de/cpp/boost/asio.html

    Dort ist auch der obige Code erklärt.

    Allerdings finde ich das für das alleinige lesen einer Seite schon recht viel Code. 😉



  • drakon schrieb:

    Schau hier, wenn du einen Einstieg zu boost::asio willst:
    http://www.highscore.de/cpp/boost/asio.html

    Dort ist auch der obige Code erklärt.

    Allerdings finde ich das für das alleinige lesen einer Seite schon recht viel Code. 😉

    Na aber drakon, das kenne ich aber besser von dir. Poste wenigstens den Link zur Doc dazu 😃



  • Tipp: Nimm libcurl und versuch HTTP nicht selbst zu implementieren!



  • Kóyaánasqatsi schrieb:

    drakon schrieb:

    Schau hier, wenn du einen Einstieg zu boost::asio willst:
    http://www.highscore.de/cpp/boost/asio.html

    Dort ist auch der obige Code erklärt.

    Allerdings finde ich das für das alleinige lesen einer Seite schon recht viel Code. 😉

    Na aber drakon, das kenne ich aber besser von dir. Poste wenigstens den Link zur Doc dazu 😃

    Nein. Eher nicht, da er
    1. Besser nicht die Doku von boost dafür anschaut und
    2. Er besser nicht asio dazu nehmen soll, wie auch rüdiger rät.



  • drakon schrieb:

    2. Er besser nicht asio dazu nehmen soll, wie auch rüdiger rät.

    Ok, warum?



  • Kóyaánasqatsi schrieb:

    drakon schrieb:

    2. Er besser nicht asio dazu nehmen soll, wie auch rüdiger rät.

    Ok, warum?

    Riesen Overhead für eine Kleinigkeit.



  • Kóyaánasqatsi schrieb:

    drakon schrieb:

    2. Er besser nicht asio dazu nehmen soll, wie auch rüdiger rät.

    Ok, warum?

    Weil HTTP einfach mehr ist, als ein GET zu senden. Wenn der Server nun mit einem chunked encoding antwortet oä. Mit libcurl hat er das eben alles implementiert und die Daten können auch gziped sein oder über SSL laufen. Es ist einfach aufwendig, wenn man HTTP selbst implementieren will und genug kaputte HTTP Implementierungen gibt es bereits.


Log in to reply