Mirari ² | mOnocle | yAronet | Ti-Fr

Rémi Caput

Mises à jour

18.11.2011

Refonte des pages "informatique" du site.

Plus d'informations...

14.08.2011

Ajout d'un moteur de template dans les projets Web.

Plus d'informations...

Parcours

Profil

Vous pouvez télécharger mon CV en suivant [javascript requis].

Webbot

Présentation

Webbot est une bibliothèque PHP5 permettant de réaliser rapidement des scripts simulant un comportement utilisateur sur un site web, c'est à dire une série de requêtes HTTP ou HTTPS exécutées comme si elles avaient été générées par un navigateur web.

Le fonctionnement de Webbot est simple : il s'agit d'une surcouche à la bibliothèque cURL, qui intercepte les requêtes et traite les réponses reçues de manière à y intégrer les actions normalement gérées de façon automatique par un navigateur web. Ainsi, il est possible de réaliser un script allant se connecter sur un site web en spécifiant son identifiant et son mot de passe, puis récupérant la liste des derniers messages reçus par l'utilisateur. Les redirections automatiques ou encore le traitement des cookies sont gérés par Webbot de façon transparente, comme l'aurait fait un navigateur.

Il est possible d'utiliser le contenu de chaque page parcourue par Webbot de deux manières :

  • Soit en récupérant le contenu texte brut, tel qu'envoyé par le serveur (après une éventuelle opération de décodage), sous la forme d'une chaine de caractères ;
  • Soit en parcourant l'arbre DOM de la page HTML, obtenu grâce à la bibliothèque PHP Simple HTML DOM Parser intégrée à Webbot.

Les pages explorées par Webbot peuvent ainsi être analysées par un script afin de capturer les informations qui y sont affichées.

Utilisation

Pour utiliser Webbot, vous aurez besoin des fichiers mis à disposition via SVN à l'aide de la commande suivante :

svn co http://svn.mirari.fr/svn/webbot/

Vous pouvez également télécharger manuellement ces fichiers en cliquant sur le lien ci-dessus, si vous n'avez pas de client SVN.

Pour inclure la bibliothèque à votre script PHP, placez-la dans le dossier de votre projet ou l'un de ses sous-dossiers, en respectant l'arborescence d'origine, puis utilisez la directive "include" ou "require" de PHP pour inclure le fichier "webbot.php". Vous pouvez alors créer un objet Webbot et commencer à utiliser les méthodes proposées par la bibliothèque :

<?php

require ('webbot.php');

$wb = new Webbot ();

?>

L'objet "$wb" est alors prêt à être utilisé, vous pouvez commencer à parcourir des pages web à l'aide de la méthode "browse". À titre d'exemple, voici comment réaliser un script allant chercher sur IMDb la liste des films dans lesquels joue Christian Bale. Une fois l'objet "$wb" créé comme indiqué ci-dessus, il faut accéder à la page de recherche d'IMDb en spécifiant les critères de recherche, qui sont attendus sous la forme de paramètres GET :

<?php

require ('webbot.php');

$wb = new Webbot ();

$wb->browse ('http://www.imdb.com/find', array
(
    's' => 'all',
    'q' => 'christian bale'
));

?>

Ce script exécute bien la requête, mais n'affiche pour l'instant rien à l'écran. Le résultat de l'exécution est disponible dans l'objet "$wb", il est donc possible d'y faire référence. Notez que les paramètres GET peuvent être également spécifiés sous la forme classique, en ajoutant la chaine "?s=all&q=christian+bale" à la fin de l'URL, auquel cas le deuxième paramètres de la méthode "browse" n'est plus nécessaire. En revanche, il sera dans ce cas indispensable d'encoder vous-même les paramètres de façon à générer une URL valide, à l'aide de la fonction PHP "rawurlencode".

L'appel à la méthode "browse" peut échouer pour de multiples raisons (site indisponible, nom de domaine inexistant, etc.). Pour cette raison, la méthode retourne "true" en cas de succès, et "false" en cas d'échec. Il est possible de demander à Webbot d'afficher un message d'erreur en cas d'échec de façon à identifier l'origine du problème. Pour conserver un script d'exemple aussi simple que possible, nous allons simplement activer l'affichage des erreurs et arrêter l'exécution du script en cas de problème :

<?php

require ('webbot.php');

$wb = new Webbot ();
$wb->set_option ('verbose', WEBBOT_VERBOSE_ERROR);

$wb->browse ('http://www.imdb.com/find', array
(
    's' => 'all',
    'q' => 'christian bale'
)) or die;

?>

Pour récupérer le résultat de cette requête, il est possible d'utiliser l'une des méthodes "get_response_document" ou "get_response_contents" pour obtenir le contenu de la page respectivement sous forme d'arbre DOM ou de texte brut. Dans le cas d'une récupération sous forme d'arbre DOM, la bibliothèque Simple HTML DOM Parser est utilisée ; vous pouvez vous référer à sa documentation pour plus de précisions sur son utilisation.

Dans notre exemple, nous voulons récupérer la liste des titres de film, qui sont représentés sur IMDb par des liens (balise HTML <a>). Pour éviter de récupérer l'intégralité des liens de la page, nous pouvons remarquer que ceux qui conduisent à un descriptif de film ont un attribut "href" commençant par "/title/". Nous utiliserons donc ce critère pour filtrer les résultats. Enfin, pour éviter de récupérer les liens ne comportant pas de texte (par exemple ceux qui ne contiennent qu'une image), un test sur le contenu de la balise sera ajouté. Le script final est donc le suivant :

<?php

require ('webbot.php');

$wb = new Webbot ();
$wb->set_option ('verbose', WEBBOT_VERBOSE_ERROR);

$wb->browse ('http://www.imdb.com/find', array
(
    's' => 'all',
    'q' => 'christian bale'
)) or die;

foreach ($wb->get_response_document ()->find ('a[href^=/title/]') as $a)
    if ($a->plaintext)
        echo "$a->plaintext<br />";

?>

Des explications plus détaillées sur chacune des méthodes de Webbot se trouvent au paragraphe suivant.

Référence

Voici la liste des méthodes disponibles dans Webbot, et la description de leurs effets :

  • browse ($target, $get = array (), $post = array ())
    • Description :
      • Exécute une requête HTTP sur une page web, en spécifiant éventuellement des paramètres GET et/ou POST.
      • La méthode "browse" initialise un contexte requête/réponse indispensable avant de travailler sur les résultats d'une requête.
    • Arguments :
      • $target : adresse (URL) cible sous la forme "http://domaine.ext/chemin". Il est également possible de spécifier ses paramètres GET, sous la forme "http://domaine.ext/chemin?nom1=valeur1&nom2=valeur2".
      • $get : tableau associatif contenant les paramètres GET à envoyer avec la requête, sous la forme (nom => valeur). Cet argument permet d'éviter d'encoder soi-même les paramètres à la suite de l'adresse. Il est donc possible de spécifier les paramètres GET à la fin de l'adresse dans l'argument "$target", ou dans l'argument "$get", ou les deux à la fois (les paramètres spécifiés dans "$get" seront alors ajoutés à ceux déjà précisés dans "$target").
      • $post : tableau associatif contenant les paramètres POST à envoyer avec la requête, sous la même forme que ceux du paramètre "$get".
    • Retour :
      • Retourne "true" si la requête a pu être exécutée avec succès (les méthodes "get_response_*" peuvent alors être invoquées), ou "false" si une erreur a été rencontrée.
  • get_option ($option)
    • Description :
      • Récupère la valeur actuelle d'une des options de configuration de Webbot.
    • Arguments :
      • $option : nom de l'option souhaitée (voir la méthode "set_option" pour la liste des noms valides).
    • Retour :
      • Valeur de l'option indiquée, ou "null" si aucune option n'existe avec ce nom.
  • get_request_cookies ()
    • Description :
      • Récupère la liste des cookies actuellement mémorisés par Webbot.
    • Retour :
      • Tableau associatif contenant les cookies sous la forme "champ => valeur".
  • get_request_headers ()
    • Description :
      • Permet d'obtenir la liste des en-têtes HTTP envoyés par Webbot à chaque requête.
    • Retour :
      • Tableau associatif contenant les en-têtes sous la forme "champ => valeur".
  • get_response_contents ()
    • Description :
      • Récupère le corps de la réponse obtenue suite à la dernière requête exécutée (via la méthode "browse"), sous forme d'une chaine de caractères.
    • Retour :
      • Chaine de caractère contenant le corps de la réponse.
  • get_response_document ()
    • Description :
      • Récupère le corps de la réponse obtenue suite à la dernière requête exécutée (via la méthode "browse"), sous la forme d'un arbre DOM.
    • Retour :
      • Racine de l'arbre DOM du document, au format utilisé par la bibliothèque PHP Simple HTML DOM Parser (suivre le lien pour une documentation complète).
  • get_response_headers ()
    • Description :
      • Récupère les en-têtes HTTP spécifiés dans la réponse à la dernière requête exécutée (via la méthode "browse").
    • Retour :
      • Tableau associatif contenant les en-têtes sous la forme "champ => valeur".
  • set_option ($option, $value)
    • Description :
      • Change la valeur d'une des options de configuration de Webbot.
    • Arguments :
      • $option : nom de l'option à changer. Les valeurs possibles pour le nom de l'option sont les suivantes :
        • 'cookie' : active ou désactive la gestion automatique des cookies par Webbot (valeurs possibles : true pour activer, false pour désactiver).
        • 'location' : active ou désactive la redirection automatique quand une réponse contenant un en-tête 'Location' est obtenu d'un serveur (valeurs possibles : true pour activer, false pour désactiver).
        • 'proxy' : permet de spécifier un proxy HTTP que Webbot doit utiliser pour toute connexion (valeurs possibles : null pour désactiver, nom d'hôte et port sous la forme d'une chaine de caractère au format cURL pour activer).
        • 'timeout' : durée maximale en secondes pendant laquelle Webbot attend une réponse suite à un appel à la méthode "browse" (valeurs possibles : nombre de secondes sous forme d'un entier positif).
        • 'verbose' : quantité de messages informatifs affichés par Webbot lors de l'exécution (valeurs possibles : WEBBOT_VERBOSE_DEBUG, WEBBOT_VERBOSE_NOTICE, WEBBOT_VERBOSE_ERROR, WEBBOT_VERBOSE_DISABLE)
      • $value : valeur souhaitée pour l'option spécifiée (voir les valeurs possibles de l'option correspondante).
  • set_request_cookies ($cookies)
    • Description :
      • Modifie la liste des cookies envoyés par Webbot à chaque requête.
    • Arguments :
      • $cookies : tableau associatif contenant les cookies sous la forme "champ => valeur".
  • set_request_headers ($headers)
    • Description :
      • Modifie la liste des en-têtes envoyés par Webbot à chaque requête.
    • Arguments :
      • $headers : tableau associatif contenant les en-têtes sous la forme "champ => valeur".