Lancer Scrapy dans un script Python

Dans ce tutoriel, nous allons voir comment exécuter un scraper basé sur la librairie Scrapy dans un script Python.

Scrapy est une librairie très utile pour récupérer automatiquement des données sur des pages web. Vous ne la connaissez pas encore ? Je vous invite à regarder mes articles sur ce sujet.

Lorsqu’un scraper est lancé de manière standard avec la commande shell scrapy runspider , il est encapsulé dans un processus asynchrone géré par le réacteur Twisted. Si vous souhaitez lancer un scraper dans un script Python, il va donc falloir lancer un réacteur Twisted.

Heureusement pour nous, Scrapy est bien fait et dispose d’une classe permettant d’atteindre ce but : scrapy.crawler.CrawlerProcess. Une instance de cette classe va lancer un réacteur Twisted, le configurer (logging, paramètres,…) et gérer les signaux.

Modifions le scraper créé dans cet article :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
A simple spider made with Scrapy that scraps data from a list of pages,
and launched inside a Python script via CrawlerProcess.
"""

import sys
import scrapy
from scrapy.crawler import CrawlerProcess

class BasicSpider(scrapy.Spider):
    name = 'basicspider'
    start_urls = []

    def parse(self, response):
        yield {
            "url": response.url,
            "title": response.css('title::text').extract_first(),
            "description": response.css("meta[name=description]::attr(content)").extract_first()
        }

if __name__ == "__main__" :
    args = sys.argv
    if len(args) < 2 :
        print("Not enought arguments, need a list of urls to scrap !")
    process = CrawlerProcess()
    process.crawl(BasicSpider, start_urls = sys.argv[1:])
    process.start() # the script will block here until the crawling is finished

Insérez ce bout de code dans un fichier nommé inscriptspider.py, et lancez le avec la commande suivante :

python inscriptspider.py url1 url2 url3... urlx

Le scraper créé dans ce tutoriel est disponible dans mon dépôt github.

Développeur Full-Stack en Freelance, je me donne pour mission d'aider les entreprises et les particuliers pour tous leurs projets et toutes leurs problématiques en informatique. N'hésitez pas à me contacter !