Le Web Scraping, ou comment piller les sites “à la volée”
Dans Non classé
Utiliser les données d’un autre site sur le sien, cela est facile avec, notamment, les flux RSS : vous avez automatiquement les dernières news d’un site, et vous les parsez à l’aide d’un petit outil php (comme lastRSS que vous pimpez un peu par exemple). L’inconvénient, c’est qu’en l’état, un flux RSS est assez pauvre en informations, et l’autre énorme inconvénient c’est que c’est orgnisé et donc “consenti” par l’auteur.
A l’inverse, le Web scraping va consister à aller s’approvisionner en informations, en quelque sorte “pomper” un autre site, et ce de manière complètement automatisée. Le script que je donne est assez basique et ne permet pas d’aller bien loin, puisque cela va se contenter d’afficher en temps réel les données présentes sur un autre site. Cela ne va pas “stocker” l’information donc si l’info disparaît sur le site cible, elle disparaît sur le vôtre également (ce que vous pourriez faire à l’aider d’un outil de scraping basique, une base de données, et une tâche cron).
Tout d’abord, il faut que vous ayez une connaissance parfaite des regex, ou “expressions régulières”.
En gros, une regex va chercher des schémas, et va ainsi identifier des suites de texte ou de chiffre dans une chaîne donnée. Je ne vais pas m’attarder, vous avez tout sur internet pour comprendre les bases et vous pourrez également tester vos regex.
En tout état de cause, cette solution est très instable et absolument pas sécurisée puisqu’il suffit que votre site cible s’aperçoive du subterfuge et/ou décide de changer son code source de manière minime pour que tout votre outil s’effondre : vous êtes totalement tributaire du comportement de la cible. C’est pourquoi, pour éviter de surcharger et d’innonder de requêtes votre cible, vous mettrez en place un système de cache basique. Et arrangez-vous également pour appliquer un htmlentities, strip_tags et compagnie sur les strings (chaînes de texte) que vous récupérez.
La première étape, c’est d’aller chercher l’info croustillante sur le site cible. Vous ouvrez le code source, vous regardez grosso modo comment il est fichu. Vous isolez l’information qui vous intéresse. Ensuite vous faîtes votre regex, et vous affichez son contenu sur votre site.
Un exemple valant mieux que mille mots, en voici un que j’ai utilisé il y a quelques temps sur israel-stop pour avoir un site qui se met à jour tout seul, histoire qu’il bouge un minimum : j’ai ciblé une page de yahoo news mieux positionnée que moi dans les résultats et ai appliqué un script ridiculement simple, et très très sale.
<?php // on définit l'URL du fichier $urlfichier = "http://fr.news.yahoo.com/fc/israel-palestiniens.html"; // on définit ainsi le flux $flux = implode ('', file ($urlfichier)); // on repère une portion du code située au début de la chaine $indicateur_debut= '<ul id="ynw-mrst" class="bul" >'; // on supprime tout avant cette portion, $a = substr($flux, strpos($flux,$indicateur_debut)); //$a = substr($a,strlen($indicateur_debut)); // cette portion incluse (81 caractères) // on repère une portion du code située à la fin de la chaine $indicateur_fin= '</ul>'; // on supprime tout après cette portion $a = substr($a, 0,strpos($a,$indicateur_fin)); //on remplace par des liens en absolu $a = ereg_replace('<a href="','<a href="http://fr.news.yahoo.com',$a); $a = ereg_replace('<cite>','<br /><cite>',$a); echo utf8_encode($a); ?>
Autre exemple tout simple, je cherche à afficher la date du jour au format hégirien (format “islamique”). J’ai une première solution : je cherche une fonction qui va convertir une date grégorienne en date islamique. Le problème, c’est qu’il n’y a pas de fonction précise, puisque la détermination du mois islamique se fait à l’oeil nu, donc elle peut toujours varier d’un jours.
Autre solution, je me connecte sur al jazeera ou arabnews et je scrape la date pour l’afficher automatiquement chez moi, en faisant par exemple :
$flux = file_get_contents('http://www.arabnews.com/'); //format du code source de la date <span class="date1">Friday 8 May 2009 (13 Jumada al-Ula 1430)</span> preg_match_all('@<span class="date1">(.+)\((.+)\)</span>@', $flux, $matches); $date_hijri = $matches[2][0]; echo $date_hijri;
Plus dur, meilleur, plus fort, plus rapide : le webscraping de niveau 2
Alors là, vous allez faire en sorte de faire disparaître toute référence et tout lien vers le site de votre cible. C’est osé, mais ça peut en valoir la peine.
Par exemple, à l’époque, je vendais les terrains d’un lotisseur pour y construire des maisons dessus. Il était tellement bête qu’il ne proposait aucun outil de portabilité de sa base de données. J’ai donc créé ça et ça m’a permis de montrer aux clients que j’avais une base de données de terrains énorme.
En fait la structure était simple :
Il y avait une première page de type :
http://www.sitedulotisseur.com/afficher_terrains_par_departement.php?departement=73
Et une seconde page de type :
http://www.sitedulotisseur.com/afficher_terrain.php?id=45
J’ai donc affiché tous les liens vers tous les départements, et ai remplacé les liens absolus (http://www.sitedulotisseur.com/afficher_terrain.php?id=45) par des liens en absolu vers une page sur MON serveur reprenant la même structure de base de données.
Au final j’obtenais :
http://www.monsite.com/afficher_terrains_par_departement.php?departement=73
et tous les liens présents sur cette page redirigeaient vers des pages de type :
http://www.monsite.com/afficher_terrain.php?id=45
Et là est l’info est facile à récupérer.
Au final, ça m’a permis de vendre ses terrains donc il n’a pas eu à se plaindre (en plus il ne s’en est pas rendu compte).
Pour cette partie, pas de script, creusez-vous un peu les méninges ![]()
Autres billets liés
Comments
13 Responses to “Le Web Scraping, ou comment piller les sites “à la volée””
Laisser une réponse



Très intéressant comme article. Clair et précis.
Qu’utilise tu comme plug-in WP pour afficher le code source PHP avec de jolies couleurs ?
Sympa comme petite introduction au scrapping
Lemoussel : j’ai retrouvé ça dans mes plugins :
WP-Syntax 0.9.1
Syntax highlighting using GeSHi supporting a wide range of popular languages. Wrap code blocks with <pre lang=”LANGUAGE” line=”1″> and </pre> where LANGUAGE is a geshi supported language syntax. The line attribute is optional. Par Ryan McGeary.
merci pour le billet
Thank’s 512banque
Et pour ceux qui ne veulent pas se prendre la tête avec les expressions régulières vous avez simplehtmldom qui est une classe PHP permettant de parser du HTML
Du très très bon simplehtmldom, merci lemoussel !
Un peu de douleur de tête en lisant le scraping mais je crois que je suis arrivée à comprendre!!!!!
merci je vais essayer
C’est un article super intéressant, çca fait un bout que je veux essayer de scrapper du contenu… par contre je m’interroge sur un truc : au niveau légal, c’est risqué à quel point?
Merci, c’est sympa.
J’ai un peu essayé, mais c’est vraiment borderline le rendu.
oui, je confirme, le script est dégueulasse :d
Cela dit, j’attends des nouveaux articles de ta part, suis impatient
Hello
on ne pourrait pas faire la même chose avec Yahoo Pipes ?
Si, il y a matière à faire avec yahoo pipes, mais le problème des flux rss est qu’ils proposent souvent uniquement une petite partie du contenu et pas l’article entier.