IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Extraction de données sur un site internet

V L'application Php - code partie 1

Extraction des données : la liste des films

fonctionnement de l'application
Les chapitres V et VI présentent le fonctionnement détaillé de l'application avec des exemples de code en Php. Le chapitre V aborde l'extraction de la liste des films (extraction1.php), le chapitre VI celle de la fiche film.


1) liste des films à rechercher [extraction1.php]

La liste des films à rechercher est contenue dans un fichier texte liste_films.txt qui sera ouvert par Php. On utilisera le signe "#" en début de ligne pour la placer en commentaire. Cette convention permet d'assouplir la phase de test et d'éviter de jongler entre différents fichiers d'entrée.

Exemple de fichier :
  # (c) Olivier Népomiachty, Février 2004
  # olivier.nepomiachty@developpez.com
  ed tv
  jackie brown
  # anastasia
  pulp fiction
  chicken run
  shining

Voici le code Php de lecture du fichier texte :
  <?php
  $handle = fopen ("liste_films.txt", "r");
  while (!feof ($handle)) {
    $titre_recherche = trim(fgets($handle, 4096));
    if (!(ereg("^#", $titre_recherche)) && ($titre_recherche!='')) {
      ... TRAITEMENT ...
    }
  fclose ($handle);
  ?>


La liste sera ensuite soumise au site de Allo Ciné. L'url sera appelée par cURL ou en socket Php. L'url sera de la forme http://www.allocine.fr/recherche/default.html?motcle=titredufilm
Cependant, pour que l'url soit valide, il faut l'encoder :
  <?php
  $titre_recherche_url = urlencode($titre_recherche);
  $url="http://www.allocine.fr/recherche/default.html?motcle=$titre_recherche_url";
  ?>

Cette manipulation permet de convertir les caractères spéciaux dans leur valeur hexa pour un envoi en GET sur Url. Par exemple, le caractère espace est converti en %20. 20 en hexa correspond à 32 en décimal, qui correspond au code ASCII de l'espacement.


2) extraction des données : la liste des réponses [extraction1.php]

Recommençons une recherche sur le film "shining". Voici la liste des réponses :

Il y a 4 propositions. L'étude du code html de la page permettra de définir une méthode d'extraction de données. Celle-ci doit être la plus simple
et intuitive possible, de façon qu'une petite modification du template utilisé sur le site permette toujours que l'extraction soit possible. D'une façon évidente, une refonte graphique importante du site impliquera la ré-écriture des règles d'extraction.

  2-1) Voici le dump du code html concerné. Lorsque l'on regarde le source complet de la page, c'est le morceau commençant par : "dans les titres de films déjà sortis" et finissant par "</TABLE>". Nous conviendrons d'appeler ce morceau "bloc de réponse".

   
<TR><TD><FONT class=size2 color=#AA0000><B>4 réponses dans les titres de films déjà sortis :</B></FONT></TD></TR>

<TR><TD><IMG Border=0 Src='http://a69.g.akamai.net/7/69/10688/v1/img5.allocine.fr/acmedia/skin/AlloCineV4/image/habillage/empty.gif' Width=1 Height=1></TD></TR>

<TR><TD><LI><A HREF="/film/fichefilm_gen_cfilm=863.html"><FONT color=#003399><B>Shining</B></FONT></A> (The <B>Shining</B>) de Stanley Kubrick avec Jack Nicholson, Shelley Duvall (1980)</TD></TR>

<TR><TD><LI><A HREF="/film/fichefilm_gen_cfilm=28224.html"><FONT color=#003399>Une lueur dans la nuit</FONT></A> (<B>Shining</B> through) de David Seltzer avec Michael Douglas, Melanie Griffith (1992)</TD></TR>

<TR><TD><LI><A HREF="/film/fichefilm_gen_cfilm=934.html"><FONT color=#003399>L' Ensorceleuse</FONT></A> (The <B>Shining</B> Hour) de Frank Borzage (1938)</TD></TR>

<TR><TD><LI><A HREF="rubrique.html?typerecherche=3&motcle=shining" class=size2><B>Plus...</B></A></TD></TR></TABLE>

2-2) Chaque ligne de réponse est contenue dans une ligne de tableau, suivant la structure :
  <TR>
    <TD>
      <LI> ligne de réponse
    </TD>
  </TR>
(ici le code est indenté pour une meilleure lisibilité)

Pour récupérer une ligne, on repère le texte contenu entre "<TR><TD><LI>" et "</TD></TR>"
La ligne est de la forme :
<TR><TD><LI><A HREF="/film/fichefilm_gen_cfilm=863.html"><FONT color=#003399><B>Shining</B></FONT></A> (The <B>Shining</B>) de Stanley Kubrick avec Jack Nicholson, Shelley Duvall (1980)</TD></TR>

2-3) Le titre du film s'obtient en appliquant un strip_tags à la ligne.

2-4) L'url de la fiche du film est celle contenue dans la balise <A HREF>. On la récupère en prenant le texte compris entre "<A HREF="" et "">". Pour obtenir une url absolue, on lui rajoute http://www.allocine.fr/, ce qui donne :
http://www.allocine.fr/film/fichefilm_gen_cfilm=863.html

2-5) Ensuite, on affiche sur la sortie html une liste de boutons radios, chacun correspondant à une des possibilités :


<input type="radio" name="film_1" value="http://www.allocine.fr/film/fichefilm_gen_cfilm=28224.html" > <a href="http://www.allocine.fr/film/fichefilm_gen_cfilm=28224.html" target="_new">Une lueur dans la nuit (Shining through) de David Seltzer avec Michael Douglas, Melanie Griffith (1992)</a>

Le dernier bouton permet d'annuler l'extraction de données pour ce film. Un lien HREF mis sur le titre permet d'afficher dans une nouvelle fenêtre la fiche dans son contexte. Cette option permet d'aider l'opérateur dans sa décision lorsqu'il hésite entre plusieurs titres.

Une fois le groupe de boutons radio affiché, on flush la sortie html et le processus repart en 2-2)


3) le flush sur la sortie html [extraction1.php]

Faisons tomber le mythe autour de ce procédé. Cette technique permet de forcer l'affichage sur le navigateur du contenu de la page avant la fin de son chargement. Ceci permet de traiter de longues opérations et d'afficher un résultat intermédiaire sans déclencher le timeout Php. Ce dernier se déclenchera uniquement si le temps écoulé entre deux flushs est trop long.

Conditions de fonctionnement de flush :
1) Le code html envoyé sur le navigateur doit être correctement balisé. Toutes les balises doivent être fermées à l'exception de '</body>' et '</html>'. Si vous avez ouvert un tableau pour améliorer la présentation de la page, le navigateur ne saura pas terminer votre tableau et par conséquent gèlera l'affichage jusqu'au prochain flush (modulo que le tableau soit fermé à ce moment).

2) Le flush ne fonctionne que si un minimum de caractères a été envoyé. Pour le forcer, on remplit le tampon de sortie avec des espaces.
Code à placer à la fin du bloc de lecture du fichier texte "while (!feof ($handle)) {" :
  <?php
  echo str_pad(" ",300);
  echo "\n";
  ob_flush();
  flush();
  ?>

L'opérateur choisit le type de données en sortie (html, xml, insertion MySQL).
Le traitement se poursuit dans le script extraction2.php