Stack Labs Blog moves to Dev.to | Le Blog Stack Labs déménage sur Dev.to 🚀

16 octobre 2018 | Big Data | Nicolas Tiraboschi

Initiation au web scraping avec Scrapy

Temps de lecture estimé : 4 minutes

Le web scraping… Kézako ? Vous en avez sûrement déjà entendu parler (et peut-être fait ?), il s’agit de parcourir des pages web pour récupérer de la data et l’utiliser dans un autre contexte.

Les cas d’usages peuvent être nombreux : faire un historique sur les prix de composants informatiques, réaliser un aggrégateur de petites annonces, effectuer du référencement de sites web, etc.

Pour ce faire, nous allons utiliser le langage Python ainsi qu’un framework appelé Scrapy.

Mise en place de l’environnement

Commençons par mettre en place notre environnement de travail. Vous devez avoir Python installé sur votre machine (Si ce n’est pas le cas, faites donc un tour ici).

La commande python -V vous renseignera sur la version utilisée par défaut.

NB: vous pouvez avoir plusieurs versions de Python installées en même temps sur votre machine

La bonne pratique en Python veut que l’on utilise un virtual environnement.

Pourquoi ?

Imaginons que vous ayez un projet qui utilise Django 1.9 et un autre Django 2.1.1. Utiliser les virtual environnements vous permettra d’utiliser les deux versions sans avoir à upgrader la plus ancienne. Très pratique car on connaît tous ce moment où parfois mettre à jour quelque chose dans un projet vient créer des bugs ou des conflits.

Pour chacun de vos projets, créez un virtual environnement avec :

python -m venv /path/vers/projet/env_nom_de_votre_projet

…si vous aviez déjà la librairie, sinon installez la puis tapez :

virtualenv /path/vers/projet/env_nom_de_votre_projet

Vous pouvez spécifier une version de Python à utiliser (si vous avez une préférence) en rajoutant -p /usr/bin/python3.6 à la fin de la ligne (ici Python 3.6 par exemple).

Activons votre virtualenv avec :

source /path/vers/projet/env_nom_de_votre_projet

Votre prompt de commande va changer pour vous indiquer que vous êtes dans un environnement virtuel :

(env_nom_de_votre_projet) User $

Pour le désactiver faites :

deactivate

Installation, mise en place d’un projet Scrapy et crawling

Maintenant, installez Scrapy

Si vous avez aussi besoin d’une petite piqûre de rappel pour pip, c’est par ici.

pip install scrapy

NB: Si vous avez bien suivi, Scrapy sera disponible dans votre environnement virtuel, mais pas en dehors. Vos scripts ne marcheront pas tant qu’il ne sera pas activé !

Une fois installé, nous allons démarrer un projet :

(venv) User$ scrapy startproject NOM_DE_VOTRE_PROJET_SCRAPY
New Scrapy project 'NOM_DE_VOTRE_PROJET_SCRAPY', using template directory '/Users/User/path/vers/votre/projet/venv/lib/python2.7/site-packages/scrapy/templates/project', created in:
    /Users/User/path/vers/votre/projet/

You can start your first spider with:
    cd NOM_DE_VOTRE_PROJET_SCRAPY
    scrapy genspider example example.com

Pour lancer les scripts de scrapping il faut se déplacer dans le dossier NOM_DE_VOTRE_PROJET_SCRAPY qui vient d’être créé. On notera que des fichiers sont déjà présents dans ce dossiers. Ils sont nécessaires pour que Scrapy puisse faire tourner vos crawlers.

Vos scripts de crawling iront ensuite se placer dans NOM_DE_VOTRE_PROJET_SCRAPY/spiders/.

Créons un script, par exemple crawling_data.py. Je fournis ici un exemple de code. Notez que le crawling ici se fera via une API.

# coding: utf-8
# La ligne ci-dessus s'appelle un shebang, en Python elle sert à indiquer l'encodage de votre fichier. Elle doit toujours être en premier.

# Import des librairies dont nous aurons besoin
import scrapy
import json


class TutoSpider(scrapy.Spider):
    # Donnons un nom à notre crawler
    name = "crawling_data"
    # L'url à crawler, vous pouvez en mettre plusieurs si besoin
    start_urls = ['https://api.coinmarketcap.com/v1/ticker/']

    def parse(self, response):
        # Pour scraper une réponse JSON, nous devons le parser
        jsonresponse = json.loads(response.body_as_unicode())

        # Pour chaque item contenu dans notre réponse
        for item in jsonresponse:
            # "Assemblage" et association d'une valeur à chaque champ
            yield {
                'id': item['id'],
                'Nom': item['name'],
                'Symbole': item['symbol'],
                'Prix_BTC': item['price_btc'],
                'Prix_USD': item['price_usd']
            }

Pour lancer votre crawler, il suffit de taper :

scrapy crawl crawling_data

Mais où sont stockées les données ?

Hé bien, actuellement… nul part !

Il faut rajouter -o test.csv à la fin de la ligne précédente pour stocker les données dans un fichier nommé test.csv !

Vous pouvez maintenant importer les données dans un fichier excel voir un gsheet. Voici un exemple de fichier CSV généré avec notre nouveau crawler :

Prix_USD,Nom,id,Symbole,Prix_BTC
6621.3161173,Bitcoin,bitcoin,BTC,1.0
230.336872018,Ethereum,ethereum,ETH,0.03493306
0.5781590182,XRP,ripple,XRP,0.00008756
532.821248503,Bitcoin Cash,bitcoin-cash,BCH,0.08080807
5.7032293354,EOS,eos,EOS,0.00086496
...

NB: vous pouvez tout aussi bien extraire les données en .json et .xml si vous le souhaitez, changez simplement l’extension et Scrapy s’occupera de faire ce qu’il faut.

And voilà ! Vous avez réalisé votre premier scraping !

Quelques recommandations

Nous avons ici scrappé une API mais vous pouvez tout aussi bien cibler une page web directement. Vous pouvez alors utiliser les sélecteurs css ou bien les XPath pour récupérer le contenu des balises HTML.

Aussi, n’oubliez pas que vous requêtez des serveurs pour récupérer vos données, ainsi pensez bien à d’abord vérifier s’il n’existe pas une API dédiée qui vous permette d’accomplir le même objectif que du scraping “sauvage”. Enfin, si vous faites du scraping directement sur les pages web, pensez à vérifier que vous avez bien le droit de crawler le(s) site(s) ciblé(s), mais aussi dans quelle mesure et pour quel usage le crawling est autorisé.