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
|
|