Gehe zu deutscher Webseite

ViaThinkSoft CodeLib

This article is in:
CodeLibProgramming aidsC / C++

Mit folgendem Code kann der Inhalt einer Webseite ausgelesen werden.

Die Library CURL muss ggf. vorher mit "apt-get install libcurl3-dev" installiert werden. Beim Kompilieren mit GCC muss der Parameter "-lcurl" angegeben werden.

const char* USER_AGENT = "Mein Crawler Name";

#include <curl/curl.h>

 // This is the writer call back function used by curl
 static int writer(char *data, size_t size, size_t nmemb, std::string *buffer)
{
        // What we will return
        int result = 0;

        // Is there anything in the buffer?
        if (buffer != NULL)
        {
                // Append the data to the buffer
                buffer->append(data, size * nmemb);

                // How much did we write?
                result = size * nmemb;
        }

        return result;
}

void http_curl (char* url) {
        CURL *curl;

        curl = curl_easy_init();
        if(curl) {
                // Infos: http://us3.php.net/curl_setopt

                // URL übergeben
                curl_easy_setopt(curl, CURLOPT_URL, url);

                // Keine Kopfzeile einblenden
                curl_easy_setopt(curl, CURLOPT_HEADER, false);

                // Verbindung danach beenden
                curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, true);

                // Pufferoptionen
                char errorBuffer[CURL_ERROR_SIZE];
                curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
                string buffer;
                curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);

                // Benutzerdefinierter User-Agent-Name
                curl_easy_setopt(curl, CURLOPT_USERAGENT, USER_AGENT);

                // Einen Timeout setzen
                curl_easy_setopt(curl, CURLOPT_TIMEOUT, 180);

                // Sehr wichtig, wenn man mit Threads arbeitet
                curl_easy_setopt(curl, CURLOPT_NOSIGNAL, true);
                curl_easy_setopt(curl, CURLOPT_DNS_USE_GLOBAL_CACHE, false);

                // Weiterleitungen beachten, aber nur max. 50x
                curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);
                curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50);

                // Einen HTTP-Fehler-Statuscode beachten
                curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);

                // SSL-Zertifikate nicht prüfen (Warnung! Sicherheitslücke)
                // http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html
                curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
                curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);

                // Abfrage ausführen und Resultat speichern
                CURLcode res;
                res = curl_easy_perform(curl);

                // Clean up
                curl_easy_cleanup(curl);

                // Alles OK?
                if (res == CURLE_OK)
                {
                        cout << buffer << "\n";
                }
                else
                {
                        cout << "Error: [" << res << "] - " << errorBuffer;
                }
        }
}

Anmerkung: Ist die Ausgabe leer, dann ist buffer "\0". Prüfung also mittels:

if (buffer == "\0") {
        cout << "Kein Inhalt";
}

ToDo: C-Kompatibel machen, mit char* arbeiten.
Daniel Marschall
ViaThinkSoft Co-Founder