Un prog pour lire la source d'une page web ? [Résolu/Fermé]

Signaler
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
-
 TRANOX -
Bonjour,

je voudrais savoir si c'est possible de programmer en C , pour que le programme lise une page web en ligne , et selectionne certaine ligne de caractère .

33 réponses

Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
super merci, mais

on est vraiment obligé de telecharger la page, on ne peut pas tout simplement la lire ( il n'existe pas une fonction / programme / commande qui permette de faire uniquement cela .

Autre question, d'aprés ce que je lis sur la description de l'utilisation de la fonction curl, il faut entrer manuellement la fonction à utiliser pour le telechargement, c'est donc qu'on pourrait peut être en mettre une autre qui serve à la lecture de la page source non ??
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
T'as tout compris. Si tu veux uniquement la lire, il faut que te fasses ta propre fonction fwrite qui ajoute le contenu dans un buffer plutôt que dans un fichier.
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
merci à toi, et bonne journée.
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
Salut killian,

je reviens sur notre échange parce que je n'arrive pas à utiliser la fonction fwrite. je ne sais pas comment on fait, j'ai beau chercher dans les bibliothèques... bref.

Est ce que tu pourrais, toi, m'indiquer comment faire pour lire le code source d'une page web, afin d'en selectionner certain passage.

(l'aspect "selection" de mon projet est déjà réalisé, mais si je ne lis pas cette foutu page, je n'y arriverai jamais .

merci à toi, en tout cas encore une fois.
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
Ok, voici une petite fonction fwrite qui, au lieu d'enregistrer dans un fichier, enregistre dans un buffer.
Je n'ai pas testé mais tu me diras ce que ça donne:
char *buffer = NULL;
int offset = 0;

size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    int i;
    buffer = (char *) realloc(buffer, size * nmemb);

    for (i=0; i < size * nmemb; i++)
   {
        buffer[i + offset] = ptr[i];
        offset++;
   }
   return size * nmemb;
}

Note que realloc se comporte comme malloc si buffer = NULL.
C'est pas très optimisé d'utiliser realloc mais bon j'avais pas envie de me prendre la tête.
A la fin dans offset, tu as la taille de ton buffer.
N'oublie pas de faire un free dessus quand tu n'en as plus besoin.
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
salut, encore,

ben j'ais pas faire, j'y arrive pas.

je comprends pas.

Je comprend pas comment on peut faire appel à une fonction en tant qu'argument d'un autre fonction).

Ou est ce que je defini la fonction à quel niveau ?
et puis où exactement je fait appel à elle ?

ensuite, pour être certain qu'il l'a lu, faudrait que j'affiche le résultat dans la fenêtre d'exectution, mais quel est alors la variable qu'il faut appelé.

bon ben je t'envoie ça. parce que ... là je suis à bout.

#include <windows.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    /*********************Quest ce que je dois enlever et modifier ?***********************/
    char *buffer = NULL;
    int offset = 0;
	
    CURL *session = curl_easy_init(); /*Initialisation de la session */

	curl_easy_setopt(session, size_t buffer_write, "sfgate.com"); /*On précise l'url qui nous interesse */

	curl_easy_setopt(session,  CURLOPT_WRITEDATA, fp); /*On balance notre pointeur de fichier comme destination */
	
    curl_easy_setopt(session,  CURLOPT_WRITEFUNCTION, fwrite);/*On précise la fonction qui gèrera l'écriture dans notre fichier. 
    Peut être n'êtes vous pas habitués à celà, il faut mettre un pointeur de fonction en paramètre de curl_easy_setopt.
     Comme ça curl_easy_setopt utilisera cette fonction pointée pour écrire dans le fichier. 
    La fonction en question doit respecter la même en-tête que la fonction standard fwrite:*/
    
    curl_easy_perform(session);
	
    fclose(fp);
	
    curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */

	return 0;

/*********************où est ce que ça se met ?***********************/

size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    int i;
    buffer = (char *) realloc(buffer, size * nmemb);

    for (i=0; i < size * nmemb; i++)
   {
        buffer[i + offset] = ptr[i];
        offset++;
   }
   return size * nmemb;
}
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
tiens, je pense que j'ai viré deux ou trois trucs qui servaient pas ( autant dire que j'ai arraché des trucs sans savoir ce que c'est sous le capot d'une voiture !! :)
j'ai parsemé d'indice 1 2 3 4 ... le programme. et résultat même pas le 1 s'affiche. Ensuite y'a cette fontion :

curl_easy_setopt(session,  CURLOPT_WRITEFUNCTION, fwrite);


que je comprend pas. quest ce que c'est CURLOPT_WRITEFUNCTION ? la description raconte que c'est pour résoudre un problème de language, mais elle dit aussi que c'est pour spécifier la façon dont le ficheir sera écrit.
mais je ne veux pas de fichier, je veux juste que en tapant une url, ça mécrivent le contenu de la page source en dessous. est ce que cette fonction est utile ?

#include <windows.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    char url;
    scanf ("%c", &url)
    printf ("1");
    size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream)
    {
    int i;
    buffer = (char *) realloc(buffer, size * nmemb);
    for (i=0; i < size * nmemb; i++)
    {
    buffer[i + offset] = ptr[i];
    offset++;
    }
    return size * nmemb;
    }
  /*********************Quest ce que je dois enlever et modifier ?***********************/
    char *buffer = NULL;
    int offset = 0;
	
    printf("2");
    CURL *session = curl_easy_init(); /*Initialisation de la session */
    curl_easy_setopt(session, size_t buffer_write, &url); /*On précise l'url qui nous interesse,
    mais j'essai de la mettre au travers de la variable &url, est ce la bonne méthode ?*/
	curl_easy_setopt(session,  CURLOPT_WRITEFUNCTION, fwrite);
    
    printf ("3");	
    fclose(fp);
	curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */
    
    printf ("4");
    return 0;
}

Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
Mouais, évite de déclarer des fonctions dans des fonctions:
#include <windows.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <stdio.h>

char *buffer = NULL;
int offset = 0;

size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    int i;
    buffer = (char *) realloc(buffer, size * nmemb);
    for (i=0; i < size * nmemb; i++)
    {
        buffer[i + offset] = ptr[i];
        offset++;
    }
    return size * nmemb;
}

int main(int argc, char **argv)
{
    char url[1024];
    scanf ("%s", url)
    	
    CURL *session = curl_easy_init(); /*Initialisation de la session */
    curl_easy_setopt(session, CURLOPT_URL, url);
    curl_easy_setopt(session,  CURLOPT_WRITEDATA, NULL);  //On fait semblant d'avoir un fichier
    curl_easy_setopt(session,  CURLOPT_WRITEFUNCTION, buffer_write); //On passe notre fonction
    curl_easy_perform(session);
    curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */
    
    return 0;
}


CURLOPT_WRITEFUNCTION est la fonction que curl doit utiliser pour enregistrer les données. Donc au lieu de fwrite, on met la nôtre.
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
non, toujours pas, je crois pas qu'il marche je suis cessé ecrire une url lors du déroulement du programme, et il ne le demande pas. je crois qu'il n'execute que la moitierdu programme, ou alors rien du tout.
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
scanf ("%s", url)


Si il attend que tu écrives quelque chose.
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
Hum,

non, cette fonction est déjà dans le code. c'est pour ça que pense pluôt que ça ne marche pas ailleurs.
merci
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
Avec le code que je t'ai donné, qu'est ce qui se passe lors de l'execution, qu'est ce que tu vois?
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
la fenêtre d'execution s'ouvre, puis le curseur clignote ( une seule fois), et ça se ferme.
un doublon?

un doublon? c'est une discussion, de toute manière des question j'en ai plein, et pas qu'a ce sujet, mais comme je vois une connaissance , il est normal que lui demande aussi non ?

... même pour des commande simple comme (printf "1") que je met dés le départ ça n'affiche rien. La fontion que tu m'as filé, fonctionne peut être, mais ça n'arrive pas jusqu'à ce niveau.
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
Voui mais ici on a pour philosophie de ne pas ouvrir plusieurs sujets pour un même problème d'une même personne.
Si quelqu'un d'autre veut venir aider, qu'il vienne dans cette discussion, tout le monde est le bienvenu.

Quand le curseur clignote, est que tu as rentré une donnée?
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
Ok j'ai pigé, alors je passe cette discussion en mode résolu et tu nous rejoins la nouvelle discussion ? ( parce que là la page commence à être longue).

J'ai recopié texto ton programme, et il semble que le compilateur bloque à ce niveau :


buffer[i + offset] = ptr[i];



Il décrit : 'in function buffer_write'

Et je ne peux rien entrer ( j'ai retiré scanf pamerce qu'au font pour l'instant il vaut mieux vérifier si d'une manière globale ça marche avant de pouvoir entrer manuellement un URL lors de l'execution, ça ça me parâit être de l'accessoire), mais comme je disais ce qu'il y a de surprenant c'est que si je parsème le programme de printf ("1, 2, 3") l'execution n'affiche rien, ce qui montre que c'est dès le départ qu'il y a un problème.
pyschopathe
Messages postés
1965
Date d'inscription
dimanche 2 mars 2008
Statut
Membre
Dernière intervention
22 mars 2010
116
Repasse en pas résolu, sinon personne ne viendra t'aider... Je vais réfléchir à ton problème sur ce topic...
EL barto !
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6 > pyschopathe
Messages postés
1965
Date d'inscription
dimanche 2 mars 2008
Statut
Membre
Dernière intervention
22 mars 2010

Pour bien comprendre ce qui s'est passé, c'est que au départ mon problème était d'ouvrir une séssion pour capter une page web.

Kilian m'a montré le topo sur la fonction curl.

http://www.commentcamarche.net/faq/sujet 8241 telecharger le contenu d une page web distante

L'ennui, c'est que dans ce topo, on utilise curl pour télécharger la page.

Or moi, je ne dois pas la télécharger je ne dois me contenter que de la lire, et eventuellement , pour montrer que j'arrive à la lire, la faire afficher le code source dans la fenêtre d'execution, mais rien de plus. je vous passe la fonction telle qu'elle est dans l'état actuel et à la l'heure de la dernière modification .

la voici :

#include <windows.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <stdio.h>
int main(int argc, char **argv)

/*là c'est la définition de la fontion buffer_write pour allouer la bonne taille au buffer*/
size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    char *buffer = NULL;
    int offset = 0;
    
    int i;
    char *myptr = (char *) ptr;
    buffer = (char *) realloc(buffer, size * nmemb);
    for (i=0; i < size * nmemb; i++)
    {
        buffer[i + offset] = myptr[i];
        offset++;
    }
    return size * nmemb;
}

 /*là c'est l'ouverture de la séssion vers l'url, et la lecture grâce à la fonction
 buffer_write*/
{
    CURL *session = curl_easy_init(); /*Initialisation de la session */
    curl_easy_setopt(session, CURLOPT_URL, "www.sfgate.com"); /*Ici on précise l'url */
    curl_easy_setopt(session,  CURLOPT_WRITEDATA, NULL);  //On fait semblant d'avoir un fichier
    curl_easy_setopt(session,  CURLOPT_WRITEFUNCTION, buffer_write); //On passe notre fonction
    curl_easy_perform(session);
    curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */
    
    return 0;
}


kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408 > EL barto !
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009

Tu ne m'as pas dis si ça changeait quelque chose avec les derniers changements.
Je me demande au final si tu jne considère pas le fait que la fenêtre se ferme à la fin de l'application comme si c'était un bug.

Mets voir ceci juste avant le return 0 du main:
getchar();

Et dit moi ce que ça donne. La fenêtre devrait rester en place tant que tu n'as pas tapé un caractère à la fin + entrée.
Autre chose: je ne sais pas ce que tu as fait avec le code, mais la fonction main a volé.

Forcément ça risque pas de marcher.....
#include <windows.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <stdio.h>


/*là c'est la définition de la fontion buffer_write pour allouer la bonne taille au buffer*/
size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    char *buffer = NULL;
    int offset = 0;
    
    int i;
    char *myptr = (char *) ptr;
    buffer = (char *) realloc(buffer, size * nmemb);
    for (i=0; i < size * nmemb; i++)
    {
        buffer[i + offset] = myptr[i];
        offset++;
    }
    return size * nmemb;
}

 /*là c'est l'ouverture de la séssion vers l'url, et la lecture grâce à la fonction
 buffer_write*/
int main(int argc, char **argv)
{
    CURL *session = curl_easy_init(); /*Initialisation de la session */
    curl_easy_setopt(session, CURLOPT_URL, "www.sfgate.com"); /*Ici on précise l'url */
    curl_easy_setopt(session,  CURLOPT_WRITEDATA, NULL);  //On fait semblant d'avoir un fichier
    curl_easy_setopt(session,  CURLOPT_WRITEFUNCTION, buffer_write); //On passe notre fonction
    curl_easy_perform(session);
    curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */
    
    getchar()
    return 0;
}

Teste ça et dis moi ce que ça donne.
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
Remplace ma fonction par ça:
size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    int i;
    char *myptr = (char *) ptr;
    buffer = (char *) realloc(buffer, size * nmemb);
    for (i=0; i < size * nmemb; i++)
    {
        buffer[i + offset] = myptr[i];
        offset++;
    }
    return size * nmemb;
}
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
Il y a un bloquage sur la première accolade de la version que j'ai publié dans ma dernière réponse.
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
non, ça ne s'execute pas, ça bloque à

return 0 dernière ligne
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
J'ai oublié un point virgule après le getchar().
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
alors ça s'est executé ( ouverture fermeture de la fenêtre d'execution).

ce que je peux dire, c'est que jusqu'à


    return size * nmemb;
} 


.. ça marche. mais ensuite ça ne marche plus. ( j'ai inséré printf ("2") juste avant getchar(), et il n'est pas apparut.
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
Ah zut, t'as raison, j'ai fait n'importe quoi...
Bon bouge pas, je vais faire une version que je vais tester cette fois.
holla holla vous etes débutant les gas
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
voici les test que j'ai mis :

int main(int argc, char **argv)
{printf ("1");
    CURL *session = curl_easy_init(); /*Initialisation de la session */
    printf ("2");
    curl_easy_setopt(session, CURLOPT_URL, "www.sfgate.com"); /*Ici on précise l'url */
    printf ("3");
    curl_easy_setopt(session,  CURLOPT_WRITEDATA, NULL);  //On fait semblant d'avoir un fichier
    printf ("4");
    curl_easy_setopt(session,  CURLOPT_WRITEFUNCTION, buffer_write); //On passe notre fonction
    printf ("5");
    curl_easy_perform(session);
    printf ("6");
    curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */
    
    printf ("7");
    getchar();
    return 0;
}


C'a s'arrête au N°5, c'est donc curl_easy_perform qui ne fonctionne pas. Quest ce que ça peut vouloir dire ?
printf ("2");
curl_easy_setopt(session, CURLOPT_URL, "www.sfgate.com"); /*Ici on précise l'url */
printf ("3");
curl_easy_setopt(session, CURLOPT_WRITEDATA, NULL); //On fait semblant d'avoir un fichier
printf ("4");
curl_easy_setopt(session, CURLOPTiuh_WRITEFUNCTION, buffer_write); //On passe notre fonction
printf ("5");
curl_easy_perform(session);
printf ("6");
curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */

printf ("7");
getchar();
return 0;
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
Non, attends ! je crois queje sais

curl easy perform sert à lancer le téléchargement !
Or comme je ne veux aps télécharger c'est tout à fait logique ! ( je n'ai rien défini, ni fichier destination, ni ecriture), donc au lieu de curl easy perform, ce qu'il faut c'est un truc qui affiche le code source de la page lui même !

quelque chose comme printf ("%u", &code_source)

non ?
pyschopathe
Messages postés
1965
Date d'inscription
dimanche 2 mars 2008
Statut
Membre
Dernière intervention
22 mars 2010
116
Pour avoir le contenu de la page, il faut la télécharger... La seule différence est que tu ne veux pas l'enregistrer dans un fichier mais l'afficher.
EL barto !
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6 > pyschopathe
Messages postés
1965
Date d'inscription
dimanche 2 mars 2008
Statut
Membre
Dernière intervention
22 mars 2010

Salut !

Quoi de neuf ?
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
oui, et une fois que je ferme le programme, je ne veux plus aucune trace , aucun fichier sur le disque,

un peu comme un copier coller qu'on perd parce qu'on ne le sauvegarde pas.
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
Oui mais mon fwrite_buffer est faux. Il réécrase tout à chaque itération.
Donc faut que je corrige.
Le soucis c'est que le téléchargement des librairie sous Dev-C++ a quelques soucis à cette heure ci.
pyschopathe
Messages postés
1965
Date d'inscription
dimanche 2 mars 2008
Statut
Membre
Dernière intervention
22 mars 2010
116 > kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016

Essaie Code::Blocks, ça m'a pris 5 minutes...
pyschopathe
Messages postés
1965
Date d'inscription
dimanche 2 mars 2008
Statut
Membre
Dernière intervention
22 mars 2010
116 > kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016

A quoi sont sensés correspondre les différents paramètres de la fonction ?
EL barto !
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6 > pyschopathe
Messages postés
1965
Date d'inscription
dimanche 2 mars 2008
Statut
Membre
Dernière intervention
22 mars 2010

la fonction size_t buffer_write ?
c'est la fonction de kilian.

je sais pas trop.
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
(Moi aussi j'utilise dev++), qu'estce que tu veux dir epar à cette heure -ci ?
tu veux dire à 16h41, ou plutôt à cette époque ? cette semaine ? ce moi ci ?

:)
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 408
A cette heure ci, 16hxx :-)
Je pense qu'il y a un soucis avec des serveurs...
Messages postés
121
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 août 2009
6
la fonction size_t buffer_write ?
C'est la fonction de kilian.

je sais pas trop.
1 2