Les robots d'exploration Web, ou web crawlers, sont des outils puissants pour extraire des données de sites internet. Ils servent à collecter des cours boursiers, des résultats sportifs, des tweets ou des prix de produits en ligne. Écriture d'un tel programme est plus simple que vous ne le pensez grâce à Python et sa bibliothèque Scrapy.
Dans ce tutoriel détaillé, découvrez comment créer votre premier robot d'exploration Web avec Scrapy, une solution rapide et efficace pour naviguer sur plusieurs pages.
Scrapy est une bibliothèque Python spécialisée dans le web scraping et la création de crawlers. Elle est performante, intuitive et gère facilement la navigation multi-pages.
Installez-la via pip après avoir créé un environnement virtuel Python, recommandé pour isoler les dépendances.
Créez un dossier et activez l'environnement virtuel :
mkdir mon_robot
cd mon_robot
python -m venv venv
# Linux/Mac :
source venv/bin/activate
# Windows :
venv\Scripts\activateInstallez Scrapy :
pip install scrapyVérifiez l'installation :
scrapy version
# Affiche : Scrapy 2.x.xPréparons l'environnement pour extraire des données de la page Wikipédia sur les batteries : https://fr.wikipedia.org/wiki/Batterie_électrique.
Créez un fichier spider1.py avec une classe héritant de scrapy.Spider :
import scrapy
class Spider1(scrapy.Spider):
name = 'wikipedia'
start_urls = ['https://fr.wikipedia.org/wiki/Batterie_%C3%A9lectrique']
def parse(self, response):
passTestez :
scrapy runspider spider1.pyAjoutez au début du fichier pour réduire les logs :
import logging
logging.getLogger('scrapy').setLevel(logging.WARNING)Les pages Web sont structurées en HTML via le DOM. Utilisez les outils DevTools de Chrome pour inspecter :
Cela révèle les sélecteurs CSS pour extraire les données.
Modifiez parse() :
def parse(self, response):
print(response.css('h1#firstHeading::text').get())
Exécutez : affiche 'Batterie électrique'. La méthode css() sélectionne via sélecteurs CSS, ::text extrait le texte, get() retourne la valeur.
Extrayez le premier paragraphe :
def parse(self, response):
desc = response.css('div#mw-content-text > div > p')[0].css('::text').get()
print(''.join(desc).strip() if desc else '')
Résultat : le texte du premier paragraphe.
Utilisez yield pour exporter en JSON. Extrayez tous les paragraphes :
def parse(self, response):
for p in response.css('div#mw-content-text > div > p'):
yield {'para': ''.join(p.css('::text').getall()).strip()}
Exécutez avec sortie JSON :
scrapy runspider spider1.py -o output.jsonExemple : top box-office IMDb (https://www.imdb.com/chart/boxoffice/). Adaptez les sélecteurs si nécessaire.
def parse(self, response):
for row in response.css('div#boxoffice table tbody tr'):
yield {
'title': ''.join(row.css('td.titleColumn a::text').getall()).strip(),
'weekend': ''.join(row.css('td.ratingColumn')[0].css('::text').getall()).strip(),
'gross': ''.join(row.css('td.ratingColumn')[1].css('span.secondaryInfo::text').getall()).strip(),
'weeks': ''.join(row.css('td.weeksColumn::text').getall()).strip(),
'image': row.css('td.posterColumn img::attr(src)').get(),
}
Scrapy excelle dans tout type de scraping. Explorez bots Twitter/Instagram avec Python pour aller plus loin. Respectez les robots.txt et CGU des sites pour une pratique éthique.
[]