récuperer infos d'une page web (parsing)

récuperer infos d'une page web (parsing) - C++ - Programmation

Marsh Posté le 31-08-2007 à 20:28:54    

Salut tous,
 
je cherche a créer un petit programme qui pourrait automatiquement me parser une page html pour récuperer des infos et remplir une base mysql.
Il faudrait que je charge tout le texte d'une page web (distante) dans une variable ; apres le parsing est facile.
 
Quel type de variable dois je utiliser? Comment acceder a la page web et stocker ensuite le code source dans cette variable?
 
Je travaille en c++ sur vc2005
 
Merci de votre aide

Reply

Marsh Posté le 31-08-2007 à 20:28:54   

Reply

Marsh Posté le 03-09-2007 à 19:07:57    

Salut,
 
libcurl devrait pouvoir t'aider? Je ne connais pas de lib qui soit C++ et uniquement orienté http/réseau par contre, mais ça peut valoir le coup de fouiller.

Reply

Marsh Posté le 04-09-2007 à 15:17:22    

S'il faut juste lire un fichier distant via HTTP avec un programme Win32, alors vous pouvez vous inspirer du code suivant (si vous utilisez C++/CLI, alors je crois que la solution peut être beaucoup plus simple avec les fonctions de .NET Framework) :
 

Code :
  1. #pragma comment(lib, "wininet.lib" )
  2. #include <winsock.h>
  3. #include <wininet.h>
  4. #include <stdio.h>
  5. char *buffer;
  6. int GetHTTPFile(char cFileName[128], int iMaxFileSize)
  7. {
  8. HINTERNET hSession, hFile;
  9. hSession = InternetOpen("WEB_GetFiles",
  10.    INTERNET_OPEN_TYPE_DIRECT,
  11.    NULL,
  12.    NULL,
  13.    NULL);
  14. if (!hSession)
  15. {
  16.  return -1;
  17. }
  18. hFile = InternetOpenUrl(hSession,
  19.    cFileName,
  20.    NULL,
  21.    0,
  22.    INTERNET_FLAG_DONT_CACHE,
  23.    NULL);
  24. DWORD dwBytesToRead;
  25. DWORD dwBytesRead;
  26. buffer = (char*)malloc(iMaxFileSize);
  27. dwBytesToRead = iMaxFileSize;
  28. if (!InternetReadFile(hFile,
  29.    &buffer,
  30.    dwBytesToRead,
  31.    &dwBytesRead))
  32. {
  33.  return -1;
  34. }
  35. buffer[dwBytesRead] = 0;
  36. InternetCloseHandle(hSession);
  37. return 0;
  38. }


 
Pour rendre tout ça compatible Unicode, il suffit de changer quelques lignes.

Reply

Marsh Posté le 04-09-2007 à 17:23:14    

c'est exactement ce que je cherchais, merci de vos réponses. Je teste tout cela tout de suite :)

Reply

Marsh Posté le 05-09-2007 à 11:54:49    

Pour info, sous linux :

Code :
  1. lynx -dump http://ma.page.web | awk 'ce que je cherche {print "ce que je veux"}' > resultat


;)


Message édité par SkippyleGrandGourou le 05-09-2007 à 11:55:09
Reply

Marsh Posté le 16-06-2008 à 19:49:53    

Bonjour, quelqu'un pourrait m'expliquer ce code SVP ?
personellement je cherche a récupérer le code source de plusieurs pages html faites pareil pour les traiter et en copier a chaque fois le meme type d'information (un nom et un lien sur une photo en fait) dans un fichier texte
une piste pour moi ? sachant que je suis novice en C
merci :)

Reply

Marsh Posté le 16-06-2008 à 20:44:18    

je crois avoir trouvé une piste, reste a comprendre comment ca marche justement :)
http://www.commentcamarche.net/faq [...] b-distante

Reply

Marsh Posté le 16-06-2008 à 21:03:42    

Et bien, la fonction GetHTTPFile() récupére le contenu d'une page specifique dans une chaine de caractères buffer.
Pour extraire les informations à partir de plusieurs pages, tu peux je pense faire appel à GetHTTPFile() plusieurs fois de suite, en variant l'URL passé en paramètres. Par contre, l'appel suivant va effacer le contenu de buffer, donc il faut extraire les informations necessaires juste après chaque appel.
 
Après, coté extraction des infos à partir de la chaine de caractères, à toi de voir comment faire selon tes besoins.

Reply

Marsh Posté le 17-06-2008 à 00:02:49    

yep j'vais tester ca merci beaucoup, au besoin je reviens t'facon :)

Reply

Marsh Posté le 17-06-2008 à 00:18:25    

alors voila, j'ai testé quand meme avec ce que j'avais trouvé (lien dans message précédent)
 

Code :
  1. #include <curl/curl.h>
  2. #include <iostream>
  3. #include <stdlib.h>
  4. #include <string>
  5. using namespace std;
  6. void istr(int i, char* in_pszbuffer)
  7. {
  8.      // permet de copier un int dans la chaîne buffer
  9.      sprintf(in_pszbuffer, "%d", i);
  10. }
  11. int main()
  12. {
  13.     char* urlarp;
  14.     char* urlsave;
  15.     char* buf;
  16.     int i;
  17.     for(i=1;i<=2179;i++)
  18.     {
  19.      istr(i,buf);
  20.      urlarp=strcat("http://lien.php?var=",buf);
  21.      CURL *session = curl_easy_init();
  22.       curl_easy_setopt(session, CURLOPT_URL, urlarp);
  23.       urlsave=strcat(strcat("./save/user_",buf),".txt" );
  24.         FILE * fp = fopen(urlsave, "w" );
  25.         curl_easy_setopt(session,  CURLOPT_WRITEDATA, fp);
  26.     curl_easy_setopt(session,  CURLOPT_WRITEFUNCTION, fwrite);
  27.     curl_easy_perform(session);
  28.     fclose(fp);
  29.     curl_easy_cleanup(session);
  30.     }
  31. system("PAUSE" );
  32. return 0;
  33. }


 
ca compile sous devcpp mais ca m'affiche a l'execution un message d'erreur "la memoire ne peut pas etre "written" " saurais-tu d'ou ca vient ?

Reply

Marsh Posté le 17-06-2008 à 00:18:25   

Reply

Marsh Posté le 17-06-2008 à 00:21:00    

Pour quelle ligne s'affiche l'erreur ? Ca peut éviter d'avoir à étudier tout le code entier...

Reply

Marsh Posté le 17-06-2008 à 00:24:10    

En tout cas, déjà, lorsque je vois :
 

Code :
  1. char* urlarp;
  2. urlarp=strcat(........


 
 :non:...
 
 
Regarde du coté des tutoriels sur la manipulation des chaines de caractère en C. Car ça ne se fait pas comme avec les variables, donc tu ne peux pas faire juste un char* x = quelque_chose.

Reply

Marsh Posté le 17-06-2008 à 00:25:51    

e fait j'avais pensé le faire avec des string, mais ca déconne ... j'ai l'impression de mélanger C et C++ dans ce truc et je n'sais pas qui est ou en fait

Reply

Marsh Posté le 17-06-2008 à 00:26:01    

Reply

Marsh Posté le 17-06-2008 à 00:30:24    

netcorsair a écrit :

e fait j'avais pensé le faire avec des string, mais ca déconne ... j'ai l'impression de mélanger C et C++ dans ce truc et je n'sais pas qui est ou en fait


Non mais fais le avec char*. Mais ne le fais pas n'importe comment. :D Tout ce qui concerne les chaines de caractères peut très bien être fait sur des char* dans la mesure où string.h fournit une large gamme de fonctions permettant la manipulation des chaines de caractères. J'ai jamais utilisé les string en C/C++, et jamais j'en ai eu vraiment besoin, donc...

Reply

Marsh Posté le 17-06-2008 à 00:33:17    

ok ok, donc deja une erreur de plus j'avais mi #include <string> et pas <string.h>
de plus j'ai compri grace a ton lien mon erreur avec les affectation dans des char*
ca donne ca ?
 

Code :
  1. int main()
  2. {
  3.     char* urlarp;
  4.     char* urlsave;
  5.     char* buf;
  6.     int i;
  7.     for(i=1;i<=2179;i++)
  8.     {
  9.      istr(i,buf);
  10.    
  11.         strcpy(urlarp,"http://lien.php?id=" );
  12.      strcat(urlarp,buf); // la on a blablabla?id=n° DANS urlarp
  13.    
  14.      CURL *session = curl_easy_init();
  15.       curl_easy_setopt(session, CURLOPT_URL, urlarp);
  16.    
  17.       strcpy(urlsave,"./saved/user_" );
  18.       strcat(urlsave,buf);
  19.         strcat(urlsave,".txt" );
  20.        
  21.         FILE * fp = fopen(urlsave, "w" );
  22.         curl_easy_setopt(session,  CURLOPT_WRITEDATA, fp);
  23.     curl_easy_setopt(session,  CURLOPT_WRITEFUNCTION, fwrite);
  24.     curl_easy_perform(session);
  25.     fclose(fp);
  26.     curl_easy_cleanup(session);
  27.     }
  28. system("PAUSE" );
  29. return 0;
  30. }


 
PS: l'erreur est toujours la: ce n'est pas une erreur a la compilation, mais a l'execution: je lance mon truc en mode console, je vois la console apparaitre, tout de suite apres y'a une msgbox avec l'erreur


Message édité par netcorsair le 17-06-2008 à 00:35:01
Reply

Marsh Posté le 17-06-2008 à 00:36:28    

Ah bah j'imagine, oui.
 
Mais... je demande à nouveau, à quelle ligne c'est, l'erreur ?

Reply

Marsh Posté le 17-06-2008 à 00:38:15    

j'sais pas, il se compile sans erreurs comme je te dis ...

Reply

Marsh Posté le 17-06-2008 à 00:53:44    

netcorsair a écrit :

j'sais pas, il se compile sans erreurs comme je te dis ...


 :heink: Ben y a pas moyen de faire le débogage ?
 
Mais sinon ben à voir le début du code, urlarp est utilisé au sein de strcpy, ligne 11, alors qu'il n'a été défini nulle part. Donc un petit urlarp = (char*)malloc(...); sera le bienvenu.
 
Sinon ben je te conseille d'aller lire quelques tutoriels/manuels du coté de la manipulation des chaines de caractères en C ; car bon, ce n'est pas une très bonne idée de faire quelque chose sans trop savoir ce qu'on fait exactement.

Reply

Marsh Posté le 17-06-2008 à 00:54:42    

ouai j'pense que c'est ce que je vais faire ... ca s'voit que j'galere lol

Reply

Marsh Posté le 17-06-2008 à 01:01:03    

et apres debug, aparemment il y a erreur de segmentation ligne 26

Code :
  1. curl_easy_perform(session);


Message édité par netcorsair le 17-06-2008 à 01:01:24
Reply

Marsh Posté le 17-06-2008 à 01:24:46    

Ah bah là, j'peux pas t'aider, vu que je ne connais pas du tout la libcurl. Desolé.

Reply

Marsh Posté le 17-06-2008 à 02:43:52    

ok, merci de l'aide déja c'est beaucoup :) j'vais chercher pour libcurl

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed