[PHP][TUTO] Récupérer et filtrer des éléments d'un site web

1 message   •   Page 1 sur 1
HD
Mammouth du PHP | 1181 Messages

24 févr. 2006, 22:12

Difficulté : Facile

Bonjour,

Un ami avait besoin d'un script afin de récupérer des éléments d'une page web ( ici une liste d'entreprises d'un technopark ) alors autant le partager avec tout le monde :!:
Évidemment, quand on récupère des éléments tirés d'une page web, il faut toujours citer la source ! :wink:

Objectif : Récupérer des informations sur toutes les entreprises du listingsous la forme :
Nom
Tel :
Fax :
Email :
Site Web :
Première étape : A propos de l'adresse de la page
Pour accéder à la fiche d'une entreprise, on clique sur le lien correspondant. Une nouvelle fenêtre s'affiche et donne toutes les informations souhaitées sur l'entreprise en question.
Mais comment connaître l'adresse de cette page ? En utilisant l'historique du navigateur tout simplement...
Une première constatation est que la fiche de chaque entreprise est obtenue grâce à une adresse qui a cette forme :
On crée donc une page php de test :
<?php 
$adresse = "http://www.casablanca-technopark.ma/showets.asp?ID=56"; // adresse de la page à exploiter
echo "$adresse <br>"; // afficher l'adresse
$page = file_get_contents ($adresse); // récupérer le contenu de la page
echo $page ; // afficher la page
?>
Néanmoins, le résultat est loin d'être satisfaisant :
La page est introuvable
Ce n'est donc pas la bonne adresse à utiliser. En cliquant sur Affichage > Source du navigateur, on peut constater l'existence d'iframes et on retiendra surtout la ligne suivante :
<iframe name="liste" src="detail_ese.asp?ID=56" width="340" height="260" frameborder="0">
Bingo ! On essaye donc avec une nouvelle adresse :
$adresse = "http://www.casablanca-technopark.ma/detail_ese.asp?ID=56
Et ça marche bien :
http://www.casablanca-technopark.ma/det ... .asp?ID=56
ABNET
Télécommunication
Internet, Réseaux, et télécommunications

Tel : 022 21 77 18
Fax : 022 21 77 18
Email : [email protected]
Site Web : www.abnet.ma
Deuxième étape : Récupération des données
Maintenant qu'on sait comment accéder aux données, il est temps de les récupérer :!:
Pour cela, le principe est simple :
ID représente l'identifiant de la société. Un webmaster logique devrait l'affecter dans l'ordre aux entreprises (de 0 ou 1 jusqu'à N). Reste à savoir combien exactement.
Pour cela on essaiera successivement dans le navigateur les adresses :
Conclusion : Les ID des entreprises vont - actuellement - de 1 à 140.
Il s'agira maintenant de récupérer les données correspondants à chaque ID. Pour cela, on créera la boucle suivante (qui parcoure les fiches de ID=1 jusqu'à ID=140) :
<?php
$id = 1 ;
while ($id < 141) {
	$adresse = "http://www.casablanca-technopark.ma/detail_ese.asp?ID=$id" ; // adresse de la page à exploiter
    $page = @file_get_contents ($adresse); // récupérer le contenu de la page
	echo "$page <br>"; // affiche la page
                $id++ ; // $id = $id + 1
}
?>
Toutefois, le temps d'exécution étant trop long, et pour les besoins du tutoriel, on se limitera aux 5 dernières entreprises :
<?php
$id = 135 ;
while ($id < 141) {
	$adresse = "http://www.casablanca-technopark.ma/detail_ese.asp?ID=$id" ; // adresse de la page à exploiter
    $page = @file_get_contents ($adresse); // récupérer le contenu de la page
	echo "$page <br>"; // affiche la page
                $id++ ; // $id = $id + 1
}
?>
Reste maintenant à sélectionner les éléments les plus intéressants des pages en question :
Nom
Tel :
Fax :
Email :
Site Web :
Pour cela, on utilisera la fonction enregi pour sélectionner les parties voulues de $page et les stocker dans $nom.
Ainsi, on cherche d'abord à récupérer le nom de la société :
On tape dans le navigateur par exemple de la page http://www.casablanca-technopark.ma/det ... asp?ID=140
Puis on affiche la source de la page.
On remarque que la ligne qui contient le nom de la société est :
<td width="100%" bgcolor="#FFFFFF"><font size="-1"><b><img border="0" src="logos/" align="right" width="118" height="64">Rekrute.com</b></font></td>
Ainsi, la syntaxe d'enregi sera :
eregi('height="64">(.*)</b></font></td>',$page,$nom); // récupère ce qu'il y a entre [b]height="64">[/b] et [b]</b></font></td>[/b]  
Pour ce qui est des autres éléments (tel, fax...) on les récupérera en un bloc (merci au webmaster qui s'est déjà occupé de la mise en page !)
Notre code ressemblera donc à :
<?php
$id = 135 ;
while ($id < 141) {
	$adresse = "http://www.casablanca-technopark.ma/detail_ese.asp?ID=$id" ; // adresse de la page à exploiter
    $page = @file_get_contents ($adresse); // récupérér le contenu de la page
	$titre = @eregi('height="64">(.*)</b></font></td>',$page,$nom); // récupère le nom de la société
	echo "$nom[1] <BR>" ;
	$titre = @eregi('<b>Tel :</b>(.*)</td>',$page,$tel); // récupère le tél et les autres infos
	echo "<b>Tel :</b> $tel[1] <BR><BR>" ;
	$id++ ;
}
?>
Vous remarquerez que j'ai ajouté des @ apres m'etre assuré que le code fonctionnait bien. Je n'utilise pas cette astuce d'habitude, mais comme certains ID n'existent pas, cela évite l'affichage de l'erreur :
Warning: file_get_contents(http://www.casablanca-technopark.ma/det ... asp?ID=116): failed to open stream: HTTP request failed! HTTP/1.1 500 Internal
Ainsi, le resultat final ressemlera à ceci :
PROMACT
Tel : +212 (0) 22 87 4000
Fax : +212 (0) 22 87 4000
Email : **[email protected]
Site Web : www.promact.ma

INDUSAC
Tel :
Fax :
Email :
Site Web :

Rekrute.com
Tel : 065917502
Fax :
Email : **[email protected]
Site Web : www.ReKrute.com
Il est possible de stocker ces elements dans une base de données, un fichier ou autres. Ce n'est pas difficile si vous avez les bonnes bases de travail (notmmant www.commentcamarche.com et www.phpdebutant.org )

Voilà, je suis conscient que ce n'est pas l'exemple le plus simple pour aborder les récupérations d'éléments de pages web ; mais cela permet au moins de présenter certaines astuces notamment au niveau des adresses des pages !

A bientôt peut être,

HD
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

1 message   •   Page 1 sur 1