Le Projet en C
La démarche de travail
Malheureusement le script en C est toujours en cours. L'installation des bibliothèques et une bonne compréhension de leur fonctionnement nécessitent plus de temps, qui va au-delà de notre date limite. Ceci reste, par contre, un projet en cours, à compléter !
Malgré les problèmes rencontrés dans l'écriture du projet, un programme en C qui fait le même traitement du texte est très intéressant, surtout pour l'efficacité du programme, qui pourrait éventuellement traiter un très grand nombre d'URLs et plus rapidement qu'en Bash ou Python. Certes, le langage est plus exigeant et les bibliothèques standards sont a priori moins adaptées à la tâche, mais les résultats seraient peut-être meilleurs.
-
Pour la création du tableau et la manipulation des fichiers, veuillez consulter l'article sur le blog !
-
Pour l'aspiration des pages, nous avons utilisé la bibliothèque libcurl. Son utilisation est plus compliquée que la simple commande « curl » utilisée en Bash, et plusieurs étapes sont nécessaires :
-
initialisation des options : curl_easy_setopt(curl, CURLOPT_URL, "http://www.bbc.co.uk");
-
exécution de la commande : res = curl_easy_perform(curl);
-
cleanup : curl_easy_cleanup(curl);
-
Pour le dump text, nous allons regarder la bibliothèque libxml2, qui est un analyseur html.
Le script (jusqu'à présent) :
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <dir.h>
5 #include <dirent.h>
6 #include <curl.h>
7 #include <easy.h>
8 #include <sys/types.h>
9 #include <sys/stat.h>
10
11 int main()
12 {
13
14 //1) initialiser les variables
15 char nomdossier[50],fullpathdossier[100], nomfichierin[50], fullpathfichier[200], cwd[100],m, fullpageaspiree[100], fullpageaspiree2[100]={0};
16 int i,j=1, k=1;
17 char url[200]={0};
18 CURL *curl;
19 CURLcode res;
20 chdir("..");
21
22 //2) définir l'endroit où se trouvent les fichiers contenant les url
23 printf("Donnez le nom du dossier contenant les fichiers url : ");
24 gets(nomdossier); /*a) demander à l’utilisateur de taper le nom du dossier*/
25
26
27 getcwd(cwd, sizeof(cwd));/*get current working directory - le chemin absolu du '.' */
28 strcpy(fullpathdossier,cwd);
29 strcat(fullpathdossier,"\\");
30 strcat(fullpathdossier,nomdossier);/*b) changer nom en chemin en ajoutant le chemin complet*/
31
32 //3) définir l'endroit où se trouvera le fichier html qui contiendra les tableaux
33 printf("Donnez le nom du fichier html ou stocker ces liens : ");
34 gets(nomfichierin);
35
36 //4) ouvrir le fichierin pour écrire les tableaux
37 FILE *fichierin =fopen(nomfichierin, "w");
38
39 //5) commencer à écrire dans le fichierin en ouvrant les balises html
40 fputs("<html><head><meta charset=\"utf-8\" /><title>Americanisation</title></head><body>", fichierin);
41
42 //6) ouvrir le dossier contenant les fichiers des url
43
44 DIR *dossier=NULL; /*déclaration du variable dossier qui prend le chemin du dossier*/
45 struct dirent *liste=NULL;
46 dossier=opendir(fullpathdossier);
47
48 if (dossier!=NULL) /*a) succès d'ouverture du dossier*/
49 {
50 k=1;
51 /*i) tandis qu'il existe quelque chose à lire dans le contenu du dossier*/
52 while ((liste = readdir(dossier)) != NULL)
53 {
54 /*ii) et ce n'est pas '.' ou '..'*/
55 if ((strcmp(liste->d_name, ".") == 1)&&(strcmp(liste->d_name, "..") == 1))
56 {
57 /*iii) changer nomfichier en chemin en ajoutant le chemin complet*/
58 strcpy(fullpathfichier,"\0");/*reintiialiser le fullpathfichier pour chaque fichier*/
59 strcat(fullpathdossier,"\\");
60 strcat(fullpathfichier,fullpathdossier);
61 strcat(fullpathfichier,liste->d_name);
62
63 FILE *fichierout =fopen(fullpathfichier, "r");
64
65 if (fichierout!=NULL)/*iv) succès d'ouverture du fichierout*/
66 {
67
68 /*1er commencer le tableau numero j*/
69 fprintf(fichierin,"<table border=\"1\"><tr><th colspan=\"2\">Tableau numero %d, %s :</th></tr>",j, liste->d_name);
70 j++;
71
72 /*2e récupérer chaque ligne(url) dans le fichier*/
73 for (i=0;fgets(url,200,fichierout)!=NULL;i++)
74 {
75
76
77 /*3e écrire une ligne dans le tableau numero j*/
78 fprintf(fichierin,"<tr><td>%d</td><td><a href=%s>Lien %d</a></td>",i+1,url, i+1);
79
80 strcpy(fullpageaspiree2, fullpageaspiree);
81 strcat(fullpageaspiree2, k);
82 strcat(fullpageaspiree2,".html");
83
84 //aspiration de l'URL
85 curl = curl_easy_init();
86 if(curl)
87 {
88 //initialiser les options pour curl
89 curl_easy_setopt(curl, CURLOPT_URL, url);
90
91 FILE * fichier = fopen(fullpageaspiree2, "w");
92 curl_easy_setopt(curl, CURLOPT_WRITEDATA, fichier);
93
94 // exécuter la commande :
95 res = curl_easy_perform(curl);
96
97 //si la commande a echoué :
98 if(res != CURLE_OK)
99 fprintf(stderr, "Erreur en executant curl: %s\n", curl_easy_strerror(res));
100
101 fclose(fichier);
102 //cleanup
103 curl_easy_cleanup(curl);
104 }
105
106 fprintf(fichierin,"<td><a href=%s>Lien %d</a></td></tr>",url, i+1);
107 k++;
108 }
109
110 /*4e fermer le tableau numero j*/
111 fprintf(fichierin, "</table><br><br>");
112
113 /*5e fermer le fichierout*/
114 fclose(fichierout);
115
116 }
117
118 else /*v) échec ouverture du fichierout*/
119 {
120 perror("Erreur d'ouverture du fichier");
121 return EXIT_FAILURE;
122 }
123
124 }
125 }
126
127 closedir(dossier);/*vi) fermer dossier contenant les fichiers d'urls*/
128 }
129
130 else /*b) échec ouverture du dossier*/
131 {
132 perror("Erreur d'ouverture du dossier");
133 return EXIT_FAILURE;
134 }
135
136
137 fprintf(fichierin, "</body></html>"); /*fermer les balises*/
138
139 fclose(fichierin);/*fermer le fichierin contenant les tableaux*/
140
141 return 0;
142
143 }
144