Ah, avant toute chose qu’est-ce que j’entends par le mot « scroller » ? On pourrait appeler ça « scrapper », « looter », voir même « pirater ». En fait l’idée est de créer un petit programme dont le but va être de récupérer des informations sur un site Web qui se trouve en ligne (ou pas). Exactement comme fait le GoogleBot ou les autres robots de moteurs de recherche. Et comme font aussi les robots qui cherchent des adresses e-mails pour faire du spam… Bref, on voit qu’il peut y avoir un petit problème éthique derrière le scrolling, mais c’est une discipline qui peut être tout à fait noble et utile autant pour le scrolleur que pour le scrollé. Mais je ne vais pas faire de débat philosophique, plutôt parler technique.%%% Durant le stage que j’effectue actuellement, j’ai pas mal l’occasion de scroller des sites Web, voici donc un résumé de fonctions ou de techniques qui peuvent être utiles. !!! Le scrolling en résumé L’idée principale est de faire automatiquement rapidement ce que l’on aurait dû faire à la main en mettant beaucoup de temps. Pour cela, on fait une petite étude des urls du site que l’on souhaite scroller. Par exemple, si c’est une liste d’article, les pages de chaque article auront peut-être un url avec quelque chose du genre : @@article.php?id=1452112@@. A partir de la : /// $url = ‘article.php?id={id}’; for($i=1; $i<=$nbArticle; $i++) { $urlAScroller = str_replace('{id}', $i, $url); $content = file_get_contents($urlAScroller); // Regex et explode sur $content pour récupérer les informations souhaitées } /// @@file_get_contents()@@ récupère sous forme d'une chaine de caractères le contenu de la page passée en paramètre. Donc en effectuant des expressions régulières sur la variable @@$content@@ on peut récupérer ce que l'on souhaite sur la page. Imaginons le code (généré, donc HTML) d'une page article.php : ///
Annuaire de la Bnbox company
Tout un tas de site pour une compagnie naissante (sic !)
La Bnbox
Indescriptiblement souriant
http://la-bnbox.fr
Bible Ipsum
Générateur de texte de remplissage
http://bibleipsum.free.fr
/// Voici un script pour scroller cette magnifique page (on va dire qu’elle a l’id n°1) : /// function parserS($str) { return trim(mysql_real_escape_string($str)); } $urlAScroller = ‘article.php?id=1′; $content = file_get_contents($urlAScroller); $content = utf8_decode($content); // j’imagine ici que l’encodage est en UTF-8 $items = explode(‘
‘, $content); $values = array(); foreach($items AS $k => $val) { $nom = parserS(preg_replace(‘!^(.+)
.*$!isU’, ‘$1′, $val)); $categorie = parserS(preg_replace(‘!^.*(.+).*$!isU’, ‘$1′, $val)); $url = parserS(preg_replace(‘!^.*(.+).*$!isU’, ‘$1′, $val)); $values[] = « (‘$nom’, ‘$categorie’, ‘$url’) »; } $qry = INSERT INTO annuaire (nom, categorie, url) VALUES ‘.implode(‘,’, $values); $insert = mysql_query($qry); if (!$insert) echo ‘Erreur insertion : ‘.mysql_error().’
‘; /// Bon bien sûr, dans la réalité, on a rarement une page aussi bien construite. Mais le principe reste le même. !!!Quelques fonctions utiles * Je viens d’en parler : [file_get_contents()|http://fr2.php.net/manual/fr/function.file-get-contents.php]. * Les regex en général, notamment : [preg_replace|http://fr2.php.net/manual/fr/function.preg-replace.php], [preg_match|http://fr2.php.net/manual/fr/function.preg-match.php], [preg_match_all|http://fr2.php.net/manual/fr/function.preg-match-all.php], [preg_split|http://fr2.php.net/manual/fr/function.preg-split.php]. (et [str_replace|http://fr2.php.net/manual/fr/function.str-replace.php] bien entendu) * Les fonctions [explode|http://fr2.php.net/manual/fr/function.explode.php] et [implode|http://fr2.php.net/manual/fr/function.implode.php] * Les fonctions d’encodage, décodage. Par exemple [utf8_decode()|http://fr2.php.net/manual/fr/function.utf8-decode.php]. En effet, selon l’encodage de la page à scroller, vous allez peut-être récupèrer une chaine de caractères en UTF-8 alors que vous travaillez en ISO. * Les fonctions de parsage et de mise en forme : [htmlentities|http://fr2.php.net/manual/fr/function.htmlentities.php], [html_entity_decode|http://fr2.php.net/manual/fr/function.html-entity-decode.php], [strip_tags|http://fr2.php.net/manual/fr/function.strip-tags.php], [trim|http://fr2.php.net/manual/fr/function.trim.php], [ucwords|http://fr2.php.net/manual/fr/function.ucwords.php], [ucfirst|http://fr2.php.net/manual/fr/function.ucfirst.php], [strotolower|http://fr2.php.net/manual/fr/function.strtolower.php], [strtoupper|http://fr2.php.net/manual/fr/function.strtoupper.php], [mysql_real_escape_string|http://fr2.php.net/manual/fr/function.mysql_real_escape_string.php] !!!Quelques techniques utiles * Pour avoir un programme un peu rapide, il peut être bon d’optimiser ses requêtes SQL (si vous enregistrez vos résultats dans une BDD bien entendu) Billet [Optimisation des requêtes SQL|/post/2009/Optimiser-ses-requetes-MySQL] à lire à ce sujet. * Parfois preg_match_all peut être très pratique. Billet [Une fonction bien utile : preg_match_all|http://30minparjour.la-bnbox.fr/post/2009/Une-fonction-regex-bien-utile-preg_match_all] à lire à ce sujet. * Il peut être utile d’avoir une variable que l’on incrémente à chaque scroll pour savoir où est-ce qu’on en est. On peut alors facilement mettre en place un @@continue@@ (pour sauter un scroll), un @@break@@ (pour arrêter une boucle) ou un @@exit@@ (pour arrêter le programme afin de voir ce qui se passe), ce qui peut être utile pour débugger ou gérer les effets de bord. (premier scroll, dernier scroll, par exemple. Ce sont en général des cas particuliers. Et puis « effet de bord, c’est la classe, non ?)