Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2335 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1606977
iceteapech​e
www.iceteapeche.com
Posté le 31-08-2007 à 20:28:54  profilanswer
 

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

mood
Publicité
Posté le 31-08-2007 à 20:28:54  profilanswer
 

n°1607722
IrmatDen
Posté le 03-09-2007 à 19:07:57  profilanswer
 

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.

n°1608099
MainMa
Posté le 04-09-2007 à 15:17:22  profilanswer
 

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.

n°1608179
iceteapech​e
www.iceteapeche.com
Posté le 04-09-2007 à 17:23:14  profilanswer
 

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

n°1608437
SkippyleGr​andGourou
Posté le 05-09-2007 à 11:54:49  profilanswer
 

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
n°1747177
netcorsair
Posté le 16-06-2008 à 19:49:53  profilanswer
 

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 :)

n°1747198
netcorsair
Posté le 16-06-2008 à 20:44:18  profilanswer
 

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

n°1747217
MainMa
Posté le 16-06-2008 à 21:03:42  profilanswer
 

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.

n°1747315
netcorsair
Posté le 17-06-2008 à 00:02:49  profilanswer
 

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

n°1747317
netcorsair
Posté le 17-06-2008 à 00:18:25  profilanswer
 

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 ?

mood
Publicité
Posté le 17-06-2008 à 00:18:25  profilanswer
 

n°1747318
MainMa
Posté le 17-06-2008 à 00:21:00  profilanswer
 

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

n°1747320
MainMa
Posté le 17-06-2008 à 00:24:10  profilanswer
 

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.

n°1747322
netcorsair
Posté le 17-06-2008 à 00:25:51  profilanswer
 

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

n°1747323
MainMa
Posté le 17-06-2008 à 00:26:01  profilanswer
 
n°1747325
MainMa
Posté le 17-06-2008 à 00:30:24  profilanswer
 

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...

n°1747326
netcorsair
Posté le 17-06-2008 à 00:33:17  profilanswer
 

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
n°1747328
MainMa
Posté le 17-06-2008 à 00:36:28  profilanswer
 

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

n°1747329
netcorsair
Posté le 17-06-2008 à 00:38:15  profilanswer
 

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

n°1747332
MainMa
Posté le 17-06-2008 à 00:53:44  profilanswer
 

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.

n°1747333
netcorsair
Posté le 17-06-2008 à 00:54:42  profilanswer
 

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

n°1747334
netcorsair
Posté le 17-06-2008 à 01:01:03  profilanswer
 

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
n°1747336
MainMa
Posté le 17-06-2008 à 01:24:46  profilanswer
 

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

n°1747340
netcorsair
Posté le 17-06-2008 à 02:43:52  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
espace avant pied de page[ ASP ] Fonction include d'une page HTTP situé sur un autre serveur
Afficher du code en couleur dans une page HTMLafficher un pdf dans une page html/php
Recuperer données d'un fichier html et les stocker dans un .txt[ASP] Récupérer contenu HTML d'une url
[résolu] Random page promo[résolu] PHP : lire une page web et séparation paramètres
Infos resources pour débutant en phpblabla@php | faq et bonnes pratiques page 1
Plus de sujets relatifs à : récuperer infos d'une page web (parsing)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR