J’ai présenté il y a peu un petit programme que j’ai créé (Skyblog Photos Downloader) et pour lequel je dois récupérer le code source d’une page web.
Après avoir un petit peu cherché, j’ai trouvé une solution très simple qui permet de récupérer soit le code source d’une page en entier, soit ce code html mais ligne par ligne …
Pour enregistrer le code source d’un page, il faut utiliser à peine 3 classes différentes comme ceci :
Tout d’abord, nous utilisons la classe URL, du package java.net, pour établir une connexion avec le site. Ensuite, l’objet InputStreamReader est utilisé afin de récupérer le contenu de la page web. Dans l’API Java de Sun, on peut lire qu’il est fortement conseillé d’utiliser un BufferedReader lorsqu’on utilise un InputStreamReader et ce pour éviter une perte d’informations (lors de la conversion d’octets – bytes en anglais – en caractères). Les explications à ce propos venant de l’API :
Each invocation of one of an InputStreamReader’s read() methods may cause one or more bytes to be read from the underlying byte-input stream. To enable the efficient conversion of bytes to characters, more bytes may be read ahead from the underlying stream than are necessary to satisfy the current read operation.
For top efficiency, consider wrapping an InputStreamReader within a BufferedReader
Ainsi, on va utiliser un BufferedReader pour réceptionner les informations reçues. Et ensuite, c’est tout ! Notre bufferedReader contiendra notre code. Il suffit de le lire ligne par ligne et d’ajouter chaque ligne dans notre String final.
Et maintenant, le code complet.
Dans ce cas-ci, la méthode renvoie un gros string contenant tout le code. Il est bien entendu possible de travailler chaque ligne à la fois afin de ne pas être trop gourmand en mémoire vive !
[codesyntax lang= »java »]
public static String getCode(String url) { String code = ""; if(urlExists(url)) { BufferedReader in = null; try { URL site = new URL(url); in = new BufferedReader(new InputStreamReader(site.openStream())); String inputLine; while ((inputLine = in.readLine()) != null) { code = code + "\n" + (inputLine); } in.close(); } catch (IOException ex) { System.out.println("Erreur dans l'ouverture de l'URL : " + ex); } finally { try { in.close(); } catch (IOException ex) { System.out.println("Erreur dans la fermeture du buffer : " + ex); } } } else { System.out.println("Le site n'existe pas !"); } return code; }
[/codesyntax]
Comme vous pouvez le voir, la première condition vérifie si un site existe ou non. Voici comment j’ai implémenté cette petite méthode :
[codesyntax lang= »java »]
public static boolean urlExists(String url) { try { URL site = new URL(url); try { site.openStream(); return true; } catch (IOException ex) { return false; } } catch (MalformedURLException ex) { return false; } }
[/codesyntax]
Vous voilà donc maintenant apte à récupérer le code source d’une page internet. Si vous désirez y récupérer des informations, je vous invite à regarder du coté des méthodes indexOf et substring de la classe String ou bien alors, au niveau des expressions régulières en Java (Regex).
Si vous avez une meilleure implémentation d’un tel code, n’hésitez pas à laisser un commentaire !
Comme il a été signalé dans un commentaire, l’utilisation d’une méthode externe (urlExists) pour la vérification est superflue. Vous pouvez tout à fait intégrer ce test dans la méthode principale.
Bien joué pour le code 😉
Mais si je peux me permettre une petite remarque.
Je pense que ta fonction urlExist est inutile. dans le sens où a cause de celle ci tu fait appel 2 fois à new URL et 2 fois a openstream(). ce qui prend donc beaucoup plus de temps.
Alors que le but principale (il me semble) de cette fonction est de tester si l’url est du bon format et si le site existe. ces deux try{}catch{} peuvent judicieusement etre integré au code principale afin d’appeler qu’une seule fois new URL et openStream() 😉
Et aussi il y a dans ton code un truc du genre { { (instructions) } } il me semble que tu peux en enlever une paire 😉
Merci pour ton commentaire.
En effet, il y a moyen de coupler la vérification d’url dans le code. La raison de ma méthode externe urlExists est bête : j’ai fait ce code pour mon application « Skyblog Photos Downloader » où je teste plusieurs fois si une URL existe.
D’où ce petit bout de code. Mais, je te l’accorde, il serait plus optimal de faire tout en un et inviter ainsi 2 instructions.
Pour les accolades, bien vu ! 😀 Je corrige ça tout de suite 😉
je veux un code qui dégage les mots clés a partir du code source en java
et merci
Et moi je veux une nouvelle voiture ! Merci ! 😉
Plus sérieusement, suffit de reprendre le code de la page puis d’effectuer quelques manipulations dessus pour en extraire ce que tu veux.
j’ai pas bien copris le role exact des fonction que vous avez utilise en + j’ai besoin d’un programme qui affiche le code source d’une page web avec le nom de la machine et le lien comme des parametres asq vous pouvez me aide envoye noi un sms sur mon email