> Tech > Extraire les informations d’une page Web

Extraire les informations d’une page Web

Tech - Par Alex K. Angelopoulos - Publié le 24 juin 2010
email

Les administrateurs Windows doivent parfois extraire des informations spécifiques d’un document HTML. Ce peut être un fichier local, une page d’état sur un périphérique réseau du LAN, un rapport de base de données consultable sur le Web, ou une infinité d’autres types de pages. Dans tous les cas, l’utilisation des données provenant de ces sources pose deux problèmes.Le premier est de se connecter à la page Web et de lire les données qu’elle contient. Si une page n’est pas un fichier statique accessible par un share ou système de fichiers Windows situé quelque part sur le réseau géré, nous ne pouvons pas utiliser d’outils standard tels que l’objet Scripting.FileSystemObject pour le lire. Nous serons même parfois amenés à fournir un nom et un mot de passe utilisateur à l’unité servant la page Web.
Une fois ce problème résolu, vient le second encore plus ardu : comment extraire fiablement le petit bout d’information dont nous avons besoin à partir d’un HTML brut virtuellement illisible ? Ces deux problèmes peuvent être résolus grâce aux composantes standard présentes sur toute station de travail de type WSH (Windows Script Host) et un peu de réflexion. Je vais démontrer le processus général en analysant un script de démo qui contient une page Web d’un routeur DSL et extrait l’adresse IP publique du routeur.
Ensuite, je distillerai le processus en trois fonctions génériques permettant d’extraire des informations spécifiques d’une grande variété de pages. Dans mon propos, les mots informations et données ont chacun une signification particulière. Par informations, j’entends la chose particulière que nous voulons trouver – dans ce cas, l’adresse IP publique du routeur. Par données, j’entends le matériau de page brut qui contient les informations ainsi que les éléments sans intérêt qu’il convient de supprimer.

D’emblée, Windows 2000 et les OS plus récents possèdent de multiples composantes capables d’extraire des données Web. Les versions 32- bit antérieures de Windows font en général aussi bien si elles ont reçu des patches et des packs de fonctions depuis 1999. La composante la plus évidente permettant d’extraire des données d’une page Web, et d’ailleurs celle que je n’utilise pas personnellement, est Microsoft IE (Internet Explorer). Bien que IE ait de nombreux usages dans les scripts, il est conçu pour un affichage interactif. IE pose des problèmes quand on l’utilise dans des sessions non graphiques, il risque de déclencher des erreurs qui bloquent la progression, et il peut avoir des effets secondaires quand on l’applique à un contenu distant arbitraire. De plus, IE est lent parce qu’il extrait et affiche automatiquement le contenu supplémentaire du genre images.

Pour extraire des données sur une connexion HTTP, j’utilise généralement la composante suivante : XMLHTTP requester de Microsoft dans msxml.dll. Nous commençons par créer une référence vers le requester, comme celle-ci :

Dim xml Set xml = CreateObject _ ("Microsoft.XMLHTTP")

L’utilisation de XMLHTTP requester se fait en trois étapes : ouvrir une connexion, envoyer la requête, et extraire la réponse. Ici, ouvrir la connexion signifie également préciser ses détails. La forme complète de la méthode open pour Microsoft.XMLHTTP se présente ainsi, avec les arguments facultatifs mis entre crochets :

open(method, url, [async], [user], [pass])

L’argument method est une chaîne spécifiant le type de la requête. Pour les connexions HTTP, c’est généralement « GET ».

L’argument url est lui aussi une chaîne et devrait être une URL légale complète si notre requête porte sur un contenu distant.

L’argument url fonctionne aussi avec le contenu des fichiers locaux et, dans ces cas, le chemin complet vers le fichier suffira : nul besoin d’ajouter un préfixe file:// au chemin du fichier.

Ici, nous utilisons simplement l’URL que nous voyons dans le navigateur en examinant la page de configuration distante que nous voulons. Le routeur particulier que j’utilise, un routeur DSL HomePortal 1800HG utilisé par beaucoup de particuliers et de petits bureaux pour l’accès Internet, montre son adresse IP publique sur la page http://10.1.1.1/ ?PAGE=B01, donc c’est cette URL que nous spécifierons.

L’argument async facultatif indique au requester s’il doit attendre la réponse (comportement synchrone – une valeur False) ou continuer par la ligne suivante de code immédiatement après l’envoi de la requête (comportement asynchrone – une valeur True). Par défaut, c’est-à-dire si elle n’est pas spécifiée, la valeur est True et ce n’est pas ce que nous voulons. Quand nous envoyons notre requête, nous voulons que notre script attende une réponse parce que la tâche suivante traitera les résultats. Donc nous devons spécifier False.

Les deux arguments suivants sont extrêmement utiles pour qui doit accéder à des ressources restreintes. Il faut simplement veiller à les coder en dur dans un script. S’il faut fournir un nom et un mot de passe utilisateur pour accéder à une ressource, vous pouvez les spécifier comme arguments user et pass afin que votre requête ne provoque pas une erreur d’authentification. Inutile de les spécifier si la ressource n’a pas besoin d’authentification. Et on peut aussi spécifier une chaîne vierge pour les arguments en utilisant vbNullString ou un jeu de guillemets doubles vides ("").

Puisque nous disposons de toutes les informations nécessaires pour ouvrir la connexion, nous pouvons ajouter la ligne de script suivante à notre code :

xml.open "GET", _ "http://10.1.1.1/?PAGE=B01", _ False

A ce stade, nous avons configuré et ouvert la connexion, mais pas encore effectué une requête. Pour cela, nous appelons la méthode send :

xml.send

Après quoi nous pouvons obtenir les données de page en retour, en lisant la propriété responseText du demandeur :

data = xml.responseText

Toute la page est maintenant disponible sous forme de données dans notre script. Si mon explication est longue, sachez que le code réel n’est que de quatre lignes. Comme vous le verrez quand j’envelopperai le code dans une fonction à la fin de l’article, nous pouvons l’appeler par une seule ligne de code pour une utilisation répétitive. Nous avons nos données, mais il reste du pain sur la planche. Nous sommes en quête d’une adresse IP. Quand nous regardons la page de configuration de routage dans un navigateur, nous voyons une bonne dizaine de lignes de texte contenant environ cinq bits réels de données en dur, dont l’adresse IP présentée de la façon suivante :

Internet Address: www.xxx.yyy.zzz

Cependant, les données que notre requête renvoie comportent beaucoup de « bruit », c’est-à-dire des éléments parasites, qu’il faut supprimer pour obtenir ce que nous voulons. Il y a plus de 200 lignes de texte et 1250 mots environ, et il nous faut trouver dans cette masse un mot unique.

Téléchargez gratuitement cette ressource

DaaS : Le Guide ultime des Professionnels IT

DaaS : Le Guide ultime des Professionnels IT

Cloud-In-One est une solution de transformation numérique et de basculement des postes dans le Cloud, pensée par des équipes IT pour des équipes IT, afin de simplifier leur quotidien et offrir une agilité maximale aux entreprises. Voici comment en 5 points.

Tech - Par Alex K. Angelopoulos - Publié le 24 juin 2010