Stack Labs Blog moves to Dev.to | Le Blog Stack Labs déménage sur Dev.to 🚀
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é.