Comment créer un web crawler ?

Share this post:

On a déjà vu ce qu'était le web scraping et ce que l'on pouvait faire avec. Cette fois on va rapidement voir, de façon théorique, les étapes pour la création d'un spider pour récupérer des données publiques sur un répertoire.

Tout d'abord, il faut savoir que chaque site internet a une logique pour l’ordonnancement des pages. Notre première étape consiste à comprendre cette logique utilisée et donc nous permettre d'automatiser le traitement des informations.

Structure des données

La structure des données est similaire sur la majorité de sites. Il y a une page Index qui liste toutes les pages Détails enfants. Les informations sont en générale sur les pages enfants (Detail). Du genre :

- Index
|--- Detail
|--- Detail

Dans d'autres cas les informations peuvent être classées dans des sous répertoires ou catégories :

- Index
|--- Category
|------- Detail
|------- Detail
|--- Category
|------- Detail

Une fois que vous avez capté cette logique, vous devez jeter un œil au contenu que vous souhaitez extraire.

Analyse des fichiers HTML

Plusieurs cas vont se présenter à vous en fonction des informations que vous voulez récupérer et suivant l'arborescence du site.

Si les informations au niveau de la liste principal (Index) vous conviennent il suffit d’analyser uniquement ce type de page et comment passer d'une page à l'autre. Pour la pagination c'est en général l'incrémentation d'un nombre entier dans l'url, du genre :

https://example.com/repertoire/?page=1

ou

https://example.com/repertoire/1/

Si en revanche les informations nécessaires sont sur la page Detail, vous devez également analyser la structure de ce type de page. Toutes les librairies scraping permettent d'encapsuler l'analyse de plusieurs structures de pages. Voici un exemple de la structure d'un spider fait avec Scrapy :

class Spider(scrapy.Spider)

    def parser_list(self, response):
        # Analyse du contenue et récupération du lien de la page enfant
        yield self.parser_category(url)

    def parser_category(self, response):
        # Analyse du contenue et récupération du lien de la page enfant
        yield self.parser_detail(url)

    def parser_detail(self, response):
        # Analyse du contenue et récupération des données
        yield data

Comme ceci, il est simple de parcourir n'importe quel type de site et d'en récupérer les informations.

Cas spécifiques

Certains sites utilisent Javascript pour afficher le contenu. Il est donc nécessaire de l'activer pour avoir accès aux textes ou images. Vous pouvez utiliser Selenium avec Scrapy comme ceci :

import scrapy
from selenium import webdriver

class ProductSpider(scrapy.Spider):

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self, response):
        self.driver.get(response.url)

        while True:
            next = self.driver.find_element_by_xpath('//td[@class="pagn-next"]/a')

            try:
                next.click()
            except:
                break

        self.driver.close()

Vous pouvez maintenant récupérer n'importe quelle information sur n'importe quel type de site. Pensez à utiliser des plateformes comme scrapinghub pour faire tourner vos spiders et ainsi vous concentrer uniquement sur le developpement.