Tout ce qu’il faut savoir pour crawler tranquilement

Publié dans PHP | Marqué avec , , ,
Share

Ah, avant toute chose qu’est-ce que j’entends par le mot « crawler » ? 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 crawleur que pour le crawlé. 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 crawler des sites Web, voici donc un résumé de fonctions ou de techniques qui peuvent être utiles.

Le crawling 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 crawler. 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 :

 <html> <head>
	<title>Annuaire de la Bnbox company</title> </head> <body>
	<h1>Annuaire de la Bnbox company</h1>
	<p>Tout un tas de site pour une compagnie naissante (sic !)</p>
	<h2>La Bnbox</h2>
		<span class="cat">Indescriptiblement souriant</span><br />

		<span class="web">http://la-bnbox.fr</span><br />

		<h2>Bible Ipsum</h2>
		<span class="cat">Générateur de texte de remplissage</span><br />

		<span class="web">http://bibleipsum.free.fr</span><br />
 </body> </html>

Voici un script pour crawler 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('<h2>', $content); $values = array(); foreach($items AS $k => $val) {
	$nom = parserS(preg_replace('!^(.+)</h2>.*$!isU', '$1', $val));
	$categorie = parserS(preg_replace('!^.*<span class="cat">(.+)</span>.*$!isU', '$1', $val));
	$url = parserS(preg_replace('!^.*<span class="cat">(.+)</span>.*$!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().'<br />';

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

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 à lire à ce sujet.
  • Parfois preg_match_all peut être très pratique. Billet Une fonction 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 ?)

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*