Startseite | Programmieren | C++ | CURL | 01
RSS Githublogo Youtubelogo higgs.at kovacs.cf

Mit (lib)CURL können Daten über Netzwerke(Internet) übertragen werden. Mit dem Programm ist es z.B. möglich den Inhalt einer Webseite zu übertragen(crawlen).

Dieses kurze Beispiel zeigt, wie eine einzelne Seite heruntergeladen werden kann.

Mehr Informationen über CURL und deren Optionen/Einstellungen sind unter at http://curl.haxx.se/libcurl/ zu finden.
#include <string>
#include <iostream>
#include <curl/curl.h>

size_t write_r_data( void* ptr, size_t size, size_t nmemb, void * data )
{
   std::string * result = static_cast<std::string*>(data);
   *result += std::string( (char*)ptr, size*nmemb );
   return size*nmemb;
}

int main()
{
   std::string url_full="www.phys.ik.cx/index.php";
   std::string useragent = "www.phys.ik.cx/robot/faq.php";   // user agent string

   CURL * ch_ = curl_easy_init();   // einen CURL handle erzeugen
   char error_buffer[CURL_ERROR_SIZE];
   std::cout << error_buffer << std::endl;   // Anzeigen des Error logs

   // OPTIONEN SETZEN
   curl_easy_setopt( ch_, CURLOPT_ERRORBUFFER, error_buffer );   // option für den error_buffer
   curl_easy_setopt( ch_, CURLOPT_WRITEFUNCTION, &write_r_data);   // pointer zu den erhaltenen Daten

   std::string result;
   curl_easy_setopt( ch_, CURLOPT_WRITEDATA, &result );   // Variable für die empfangenen Daten

   int id = 1;
   curl_easy_setopt( ch_, CURLOPT_VERBOSE, id );   // 1 ... Infos anzeigen
   curl_easy_setopt( ch_, CURLOPT_URL, url_full.c_str() );
   curl_easy_setopt( ch_, CURLOPT_USERAGENT, useragent.c_str() );   // agent string setzen
   curl_easy_setopt( ch_, CURLOPT_CONNECTTIMEOUT, 10);   // max. Verbingundszeit(Sekunden) mit Server
   curl_easy_setopt( ch_, CURLOPT_TIMEOUT, 30);   // max. Zeitdauer(sek.) für Übertragungen
   // OPTIONEN SETZEN


   curl_easy_perform(ch_);   // Übertragung mit obigen Optionen starten
   curl_easy_cleanup(ch_);   // handle löschen(wenn die Übertragung abgeschlossen ist)

   std::cout << result << std::endl;
}

Um den Code zu kompilieren (unix) muss g++ crawl.cpp -lcurl im Terminal eingegeben werden. Die Option -lcurl linkt die curl-Bibliothek. Diese ist vorher zu installieren.

Die Funtion write_r_data wird benützt um die erhaltenen Daten zu verarbeiten. #

std::string url_full enthält die URL von der Seite, die wir crawlen wollen.

std::string useragent ist der User Agent String, welcher in den Serverlogfiles aufscheint. Hier sollten Informationen bereitgestellt werden, welche den Crawler beschreiben. Z.B. ein link zu einer Seite, die beschreibt was das Programm tut und wofür man den Crawler betreibt. Eine Kontaktmöglichkeit sollte man auch bereitstellen. Natürlich kann hier auch ein Browser gefakt werden(damit scheint es so, als ob die Seite von einem Browser gecrawlt wurde)

Danach wird ein CURL handle erzeugt mit CURL * ch_ = curl_easy_init();

Dann werden die Optionen (für den handle) gesetzt.

curl_easy_perform(ch_) startet die Übertragung. Es können für einen handle hier beliebig viele Übertragungen gestartet werden. Die gesetzten Optionen bleiben erhalten.

curl_easy_cleanup(ch_) löscht(bereinigt) den erzeugten handle.

Wir erhalten folgendes:

[claus@mau SPIDER]$ g++ crawl.cpp -lcurl
[claus@mau SPIDER]$ ./a.out
* About to connect() to www.phys.ik.cx port 80 (#0)
* Trying 217.70.142.105...
* connected
* Connected to www.phys.ik.cx (217.70.142.105) port 80 (#0)
> GET /index.php HTTP/1.1
User-Agent: www.phys.ik.cx/robot/faq.php
Host: www.phys.ik.cx
Accept: */*
< HTTP/1.1 200 OK
< Date: Sun, 08 Dec 2013 00:06:04 GMT
< Server: Apache/2.2.16 (Debian)
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Set-Cookie: PHPSESSID=8bd8ac219abbea49b9a38003577d0ed8; path=/
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=iso-8859-1
<
* Connection #0 to host www.phys.ik.cx left intact
* Closing connection #0
.
.
.


Danach folgt der Quellcode der erhaltenen Seite (wurde hier nicht angeführt)

Mit diesem Programm kann eine einzelne Seite von einem Server geholt werden.

der Quellcode: crawl.cpp