Rechercher : dans
Par :

Un prog pour lire la source d'une page web ?

Dernière réponse le 9 nov 2008 à 00:25:31 EL barto ! , le 25 oct 2008 à 16:43:01 
 Signaler ce message aux modérateurs

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 .

Configuration: Windows XP
Firefox 3.0.3

Meilleures réponses pour « Un prog pour lire la source d'une page web ? » dans :
[mythes] On peut protéger une page web/une image contre la copie VoirMythe On peut empêcher la copie d'une page web ou d'une image. On peut empêcher de voir le source d'une page HTML. On peut empêcher la copie d'une vidéo, d'une musique. Réalité FAUX Explications Quelle que soit la nature d'un document (page...
Télécharger le contenu d'une page WEB distante VoirIntroduction Installation sous Linux (Ubuntu / Debian) Installation sous Windows Dev C++ Microsoft Visual C++ Petite exploration des fonctions de libcurl Un exemple: télécharger la page d'accueil de CCM Notre fichier source Compilation...
[Webmaster] Publier facilement une vidéo dans une page web VoirPublier une vidéo dans une page web n'est pas toujours évident: Selon le format (AVI, MPG, MOV...) tout le monde ne possède pas forcément le bon plugin et le bon codec. En revanche, la quasi-totalité des navigateurs possèdent le plugin Flash (SWF)....

1

kilian, le 25 oct 2008 à 17:03:41
Répondre à kilian

2

EL barto ! , le 25 oct 2008 à 17:20:53

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

Répondre à EL barto !

3

kilian, le 25 oct 2008 à 17:30:58

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. Le gâteau est un mensonge!

Répondre à kilian

4

EL barto ! , le 25 oct 2008 à 17:35:53

Merci à toi, et bonne journée.

Répondre à EL barto !

5

EL barto ! , le 26 oct 2008 à 18:28:38

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.

Répondre à EL barto !

6

kilian, le 26 oct 2008 à 19:11:22

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.
Le gâteau est un mensonge!

Répondre à kilian

7

EL barto ! , le 26 oct 2008 à 22:27:22

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;
}

Répondre à EL barto !

8

EL barto ! , le 26 oct 2008 à 23:33:14

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;
}

Répondre à EL barto !

9

kilian, le 27 oct 2008 à 00:13:30

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. Le gâteau est un mensonge!

Répondre à kilian

10

EL barto ! , le 27 oct 2008 à 11:59:33

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.

Répondre à EL barto !

11

kilian, le 27 oct 2008 à 13:20:25

scanf ("%s", url)


Si il attend que tu écrives quelque chose. Le gâteau est un mensonge!

Répondre à kilian

12

EL barto ! , le 27 oct 2008 à 13:36:25

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

Répondre à EL barto !

13

kilian, le 27 oct 2008 à 15:01:37

Avec le code que je t'ai donné, qu'est ce qui se passe lors de l'execution, qu'est ce que tu vois? Le gâteau est un mensonge!

Répondre à kilian

14

EL barto ! , le 27 oct 2008 à 15:08:38

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.

Répondre à EL barto !

15

kilian, le 27 oct 2008 à 15:12:03

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? Le gâteau est un mensonge!

Répondre à kilian

16

EL barto ! , le 27 oct 2008 à 15:19:35

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.

Répondre à EL barto !

17

pyschopathe, le 27 oct 2008 à 15:32:21

Repasse en pas résolu, sinon personne ne viendra t'aider... Je vais réfléchir à ton problème sur ce topic...

Répondre à pyschopathe

19

EL barto ! , le 27 oct 2008 à 15:45:40

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;
}


Répondre à EL barto !

21

kilian, le 27 oct 2008 à 15:52:47

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. Le gâteau est un mensonge!

Répondre à kilian

18

kilian, le 27 oct 2008 à 15:39:01

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;
}
Le gâteau est un mensonge!

Répondre à kilian

20

EL barto ! , le 27 oct 2008 à 15:49:38

Il y a un bloquage sur la première accolade de la version que j'ai publié dans ma dernière réponse.

Répondre à EL barto !

22

kilian, le 27 oct 2008 à 15:53:14

Teste avec la dernière version que je viens de poster.
=> http://www.commentcamarche.net/forum/affich 9060910 un prog pour lire la source d une page web?#21 Le gâteau est un mensonge!

Répondre à kilian

23

EL barto ! , le 27 oct 2008 à 15:55:00

Non, ça ne s'execute pas, ça bloque à

return 0 dernière ligne

Répondre à EL barto !

24

kilian, le 27 oct 2008 à 15:56:20

J'ai oublié un point virgule après le getchar(). Le gâteau est un mensonge!

Répondre à kilian

25

EL barto ! , le 27 oct 2008 à 16:02:49

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.

Répondre à EL barto !

26

kilian, le 27 oct 2008 à 16:05:03

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. Le gâteau est un mensonge!

Répondre à kilian

27

EL barto ! , le 27 oct 2008 à 16:05:40

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 ?

Répondre à EL barto !

28

EL barto ! , le 27 oct 2008 à 16:17:55

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 ?

Répondre à EL barto !

29

pyschopathe, le 27 oct 2008 à 16:29:23

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.

Répondre à pyschopathe

61

 EL barto ! , le 9 nov 2008 à 00:25:31

Salut !

Quoi de neuf ?

Répondre à EL barto !

30

EL barto ! , le 27 oct 2008 à 16:35:25

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.

Répondre à EL barto !

31

kilian, le 27 oct 2008 à 16:39:11

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. Le gâteau est un mensonge!

Répondre à kilian

33

pyschopathe, le 27 oct 2008 à 16:42:10

Essaie Code::Blocks, ça m'a pris 5 minutes...

Répondre à pyschopathe

34

pyschopathe, le 27 oct 2008 à 16:43:48

A quoi sont sensés correspondre les différents paramètres de la fonction ?

Répondre à pyschopathe

37

EL barto ! , le 27 oct 2008 à 16:49:43

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

je sais pas trop.

Répondre à EL barto !

32

EL barto ! , le 27 oct 2008 à 16:41:54

(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 ?

:)

Répondre à EL barto !

35

kilian, le 27 oct 2008 à 16:44:44

A cette heure ci, 16hxx :-)
Je pense qu'il y a un soucis avec des serveurs... Le gâteau est un mensonge!

Répondre à kilian