View Full Version : [c++]prendere dati dal web!
moritzplatz
13-04-2009, 17:18
ciao a tutti!
io volevo creare un programma capace di raccogliere dei dati da alcune pagine web dando in imput al programma stesso l'indirizzo di queste pagine...
esiste un modo per fare ciò?
grazie mille a tutti !
ciao a tutti!
io volevo creare un programma capace di raccogliere dei dati da alcune pagine web dando in imput al programma stesso l'indirizzo di queste pagine...
esiste un modo per fare ciò?
grazie mille a tutti ! sicuro: devi usare Windows Internet, di cui trovi la documentazione qui:
http://msdn.microsoft.com/en-us/library/aa385331(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa383630(VS.85).aspx
in particolare qui:
http://msdn.microsoft.com/en-us/library/aa384322(VS.85).aspx
non é molto difficile.
se invece vuoi scrivere un sorgente portabile che funzioni anche su Linux, ahité e che Dio ti aiuti: devi usare l'interfaccia BSD dei sockets (che contiene porcate a tratti stupefacenti) ed imparare le basi del protocollo HTTP; se poi devi pure passare per un proxy allora tanti saluti.
moritzplatz
13-04-2009, 18:03
sicuro: devi usare Windows Internet, di cui trovi la documentazione qui:
http://msdn.microsoft.com/en-us/library/aa385331(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa383630(VS.85).aspx
in particolare qui:
http://msdn.microsoft.com/en-us/library/aa384322(VS.85).aspx
non é molto difficile.
se invece vuoi scrivere un sorgente portabile che funzioni anche su Linux, ahité e che Dio ti aiuti: devi usare l'interfaccia BSD dei sockets (che contiene porcate a tratti stupefacenti) ed imparare le basi del protocollo HTTP; se poi devi pure passare per un proxy allora tanti saluti.
grazie mille!
no io non devo passare ne per proxy ne per linux ne per niente!
ora mi leggo tutto!
a proposito, se per "raccogliere dati da alcune pagine web" intendevi dire che devi fare il parsing dell'HTML e leggere il contenuto di alcuni tag allora puoi farti aiutare dall'implementazione Microsoft del DOM:
http://msdn.microsoft.com/en-us/library/ms766487(VS.85).aspx
solo che questa é una cosa giá piu difficile perché richiede una minima conoscenza di COM, il layer di interoperabilitá che permette a quello e a molti altri set di API di essere usati virtualmente da qualunque linguaggio di programmazione.
per una vita agevole in un ambiente COM in C++, ATL é d'obbligo, solo che non lo danno piu con l'SDK; dovresti scaricare il vecchio Platform SDK, che ancora contiene ATL ed MFC e che si trova qui:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=d8eecd75-1fc4-49e5-bc66-9da2b03d9b92
moritzplatz
13-04-2009, 18:15
a proposito, se per "raccogliere dati da alcune pagine web" intendevi dire che devi fare il parsing dell'HTML e leggere il contenuto di alcuni tag allora puoi farti aiutare dall'implementazione Microsoft del DOM:
http://msdn.microsoft.com/en-us/library/ms766487(VS.85).aspx
solo che questa é una cosa giá piu difficile perché richiede una minima conoscenza di COM, il layer di interoperabilitá che permette a quello e a molti altri set di API di essere usati virtualmente da qualunque linguaggio di programmazione.
per una vita agevole in un ambiente COM in C++, ATL é d'obbligo, solo che non lo danno piu con l'SDK; dovresti scaricare il vecchio Platform SDK, che ancora contiene ATL ed MFC e che si trova qui:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=d8eecd75-1fc4-49e5-bc66-9da2b03d9b92
ecco ora inizio a non capire :D
ti dico cosa vorrei fare di preciso:
si tratta di pagine di un gioco online.
ho pagine come questa: http://www94.hattrick.org/Club/Players/Player.aspx?PlayerID=241160761&BrowseIds=241160761,240825163,240712091,241797788,241617612,241749748,241797858,237809268,235863168,234575276,230123304,240782777,241316416,241797938,241797951,241797964,241797963,241797995,241334685,241023848,241794878,234254045,241621155,241320522,241544552 (giocatore)
e io vorrei fare un programma che, dato il link mi prenda un dato qualsiasi...che so il nome del giocatore!
ecco ora inizio a non capire :D
ti dico cosa vorrei fare di preciso:
si tratta di pagine di un gioco online.
ho pagine come questa: http://www94.hattrick.org/Club/Players/Player.aspx?PlayerID=241160761&BrowseIds=241160761,240825163,240712091,241797788,241617612,241749748,241797858,237809268,235863168,234575276,230123304,240782777,241316416,241797938,241797951,241797964,241797963,241797995,241334685,241023848,241794878,234254045,241621155,241320522,241544552 (giocatore)
e io vorrei fare un programma che, dato il link mi prenda un dato qualsiasi...che so il nome del giocatore!
a parte il fatto che con Hattrick devi creare un'applicazione certificata e loro ti danno accesso in qualche modo ai dati..
cmq in Java per parsare pagine web c'è HttpClient
in .NET c'è sicuramente qualcosa di simile..
non vedo perchè scomodar cose di tropp basso livello
moritzplatz
13-04-2009, 18:46
a parte il fatto che con Hattrick devi creare un'applicazione certificata e loro ti danno accesso in qualche modo ai dati..
cmq in Java per parsare pagine web c'è HttpClient
in .NET c'è sicuramente qualcosa di simile..
non vedo perchè scomodar cose di tropp basso livello
si ti danno l'accesso CHPP ... ma ci vogliono anni per ottenerlo...mentre a me serve solo una cosa che data una pagina così prenda un solo numero!
tomminno
13-04-2009, 21:23
se invece vuoi scrivere un sorgente portabile che funzioni anche su Linux, ahité e che Dio ti aiuti: devi usare l'interfaccia BSD dei sockets (che contiene porcate a tratti stupefacenti) ed imparare le basi del protocollo HTTP; se poi devi pure passare per un proxy allora tanti saluti.
Quanto sei catastrofista.
Basta usare cUrl (http://curl.haxx.se/)
Quanto sei catastrofista.
Basta usare cUrl (http://curl.haxx.se/) cUrl, come qualunque altra libreria di terze parti, non é magica e non risolve un bel nulla: il problema di portarsi appresso la dipendenza non scompare, se sul tuo computer 10 programmi diversi usano cUrl esistono 10 copie diverse di cUrl. chiaramente questo problema é giá stato risolto 10 anni fa con gli SxS, ma se devi fare un sistema di distribuzione portabile é piu facile dire ai programmatori "tenetevi i sorgenti e linkateli staticamente", e niente SxS.
in generale se il tuo programma deve girare solamente su Windows conviene usare solo roba giá presente in Windows: fare diversamente é stupido, significa solo aumentare la dimensione di download (e magari anche ridurre la qualitá).
ecco ora inizio a non capire :D
ti dico cosa vorrei fare di preciso:
si tratta di pagine di un gioco online.
ho pagine come questa: giocatore (http://www94.hattrick.org/Club/Players/Player.aspx?PlayerID=241160761&BrowseIds=241160761,240825163,240712091,241797788,241617612,241749748,241797858,237809268,235863168,234575276,230123304,240782777,241316416,241797938,241797951,241797964,241797963,241797995,241334685,241023848,241794878,234254045,241621155,241320522,241544552)
e io vorrei fare un programma che, dato il link mi prenda un dato qualsiasi...che so il nome del giocatore!
qui c'é uno stralcio di codice che ti spiega come istanziare l'oggetto Document del DOM:
http://msdn.microsoft.com/en-us/library/ms756987(VS.85).aspx
é un punto d'inizio; per il resto usa ATL. se non hai mai visto in vita tua nulla di COM allora dimenticati questo post, lascia perdere e usa qualche altro sistema :D
ah, non é detto che tu debba usare il C++: ad esempio il DOM é molto piu accessibile se usi Windows Script Host, che significa che dovresti scrivere in JScript o in VBScript il tuo programmetto (eliminando in una volta sola un mare di complicazioni).
moritzplatz
14-04-2009, 14:32
siè vero potrei farlo in javascrit!
quindi mi devo studiare questo DOM...ok ora vedo!
grazie!
cUrl, come qualunque altra libreria di terze parti, non é magica e non risolve un bel nulla: il problema di portarsi appresso la dipendenza non scompare, se sul tuo computer 10 programmi diversi usano cUrl esistono 10 copie diverse di cUrl. chiaramente questo problema é giá stato risolto 10 anni fa con gli SxS, ma se devi fare un sistema di distribuzione portabile é piu facile dire ai programmatori "tenetevi i sorgenti e linkateli staticamente", e niente SxS.
in generale se il tuo programma deve girare solamente su Windows conviene usare solo roba giá presente in Windows: fare diversamente é stupido, significa solo aumentare la dimensione di download (e magari anche ridurre la qualitá).
Su windows forse, su linux basta installare una sola volta curl. Semplicemente creerai il tuo bel pacchetto con solo il tuo programma, specificando che ha come dipendenza curl. Quando la persona che ha scaricato il programma cliccherà due volte sul pacchetto verrà automaticamente scaricata ed installata curl.
Da quel momento se scarichi un altro programma che usa curl quando fai doppio click sul pacchetto le dipendenze sono soddisfatte, quindi non reinstalla un bel niente, usa curl che è già installato
moritzplatz
14-04-2009, 16:24
ho trovato questa guida sul DOM
http://javascript.html.it/guide/lezione/811/loggetto-document/
solo che guardando l'html mi sono scoraggiato....
ma non esiste una funzione che mi prende l'html di una pagina e me lo salva in un file di testo?
poi così potrei lavorarmelo agevolmente in C++
tomminno
14-04-2009, 22:43
ma non esiste una funzione che mi prende l'html di una pagina e me lo salva in un file di testo?
poi così potrei lavorarmelo agevolmente in C++
Un banale esempio usando curl:
string download;
//array per contenere gli eventuali errori
char errorBuffer[CURL_ERROR_SIZE];
//Inizializzazione di CURL
CURL *curl = curl_easy_init();
//Impostazione del buffer per gli errori
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, &errorBuffer[0]);
//Impostazione della url da scaricare
curl_easy_setopt(curl, CURLOPT_URL, "http://url.da.scaricare");
//caso mai il sito rispondesse con Location impostiamo curl per reindirizzare
//automaticamente
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
//Ipostazione della funzione di callback richiamata da curl sulla ricezione di dati
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
//Impostazione del dato da passare alla callback
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &download);
//Non ci interessa l'header http tra i dati letti dalla callback
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
//Esecuzione dell'operazione
CURLcode result = curl_easy_perform(curl);
if (result != CURLE_OK) //Errore!
cout << errorBuffer << endl;
else
{
//a questo punto in download ci sono i dati correttamente scaricati
ofstream of("download.html");
of << download;
}
//Cleanup
curl_easy_cleanup(curl);
//Da qualche parte la callback sarà:
int writer(char *data, size_t size, size_t nmemb, std::string *buffer)
{
//il return di un valore differente da size * nmemb causa l'interruzione del download con segnalazione di errore
if (!buffer)
return 0;
//Accodamento dei dati ricevuti
buffer->append(data, size * nmemb);
return size * nmemb;
}
moritzplatz
14-04-2009, 22:57
ecco io devo includere curl
#include "curl/curl.h"
dove lo trovo questo file?
tomminno
14-04-2009, 23:43
ecco io devo includere curl
#include "curl/curl.h"
dove lo trovo questo file?
Lo trovi all'interno della libreria curl, nella cartella include.
moritzplatz
14-04-2009, 23:51
ma non credo ci sia di default questa libreria...
!
tomminno
14-04-2009, 23:59
ma non credo ci sia di default questa libreria...
!
Su windows certamente no. Devi scaricarla e compilarla (c'è già la soluzione per Visual Studio).
Su windows forse, su linux basta installare una sola volta curl. Semplicemente creerai il tuo bel pacchetto con solo il tuo programma, specificando che ha come dipendenza curl. Quando la persona che ha scaricato il programma cliccherà due volte sul pacchetto verrà automaticamente scaricata ed installata curl.
Da quel momento se scarichi un altro programma che usa curl quando fai doppio click sul pacchetto le dipendenze sono soddisfatte, quindi non reinstalla un bel niente, usa curl che è già installato non hai capito niente: leggi tutto quello che hai quotato, non solo la parte che hai messo in grassetto.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.