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.
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
#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