Retour au blog
Guides
Mihai Maxim30 janvier 20236 min de lecture

Comment exécuter du JavaScript avec Scrapy

Comment exécuter du JavaScript avec Scrapy

Introduction

Bienvenue dans le monde passionnant du scraping de sites web dynamiques ! Comme vous le savez peut-être grâce à nos articles précédents, ce type de sites web peut s'avérer un peu délicat à explorer avec les outils de scraping traditionnels. Mais n'ayez crainte ! Scrapy, votre fidèle assistant de scraping, est là pour vous aider grâce à une multitude de plugins et de bibliothèques qui facilitent grandement le scraping de sites web dynamiques.

Dans cet article, nous allons nous pencher sur certaines des options les plus populaires pour extraire les données de ces sites web basés sur JavaScript avec Scrapy. Et pour vous faciliter encore plus la tâche, nous vous fournirons des exemples d'utilisation de chacune d'entre elles afin que vous puissiez vous attaquer en toute confiance à n'importe quel site web qui se présente à vous.

Si vous débutez avec Scrapy, ne vous inquiétez pas. Vous pouvez consulter notre guide pour une introduction au web scraping avec Scrapy

Les navigateurs sans interface graphique ?

Si vous ne connaissez pas les navigateurs sans interface, laissez-moi vous expliquer. Il s'agit essentiellement de navigateurs web qui fonctionnent sans interface visible. Oui, je sais que cela peut paraître étrange de ne pas voir la fenêtre du navigateur lorsque vous l'utilisez. Mais croyez-moi, les navigateurs sans interface peuvent vraiment changer la donne en matière de scraping web.

Voici pourquoi : contrairement aux navigateurs classiques qui se contentent d'afficher des pages web, les navigateurs sans interface peuvent exécuter du JavaScript. Cela signifie que si vous essayez de scraper un site web qui utilise JavaScript pour générer son contenu, un navigateur sans interface peut vous aider en exécutant le JavaScript et en vous permettant de scraper le code HTML résultant.

Explorer différentes solutions

La meilleure stratégie pour le rendu JavaScript avec Scrapy dépend de vos besoins et de vos ressources spécifiques. Si votre budget est serré, vous devrez choisir une solution économique. L'utilisation d'un navigateur sans interface graphique ou d'une bibliothèque de rendu JavaScript pourrait être l'option la moins coûteuse, mais vous devrez tout de même composer avec le risque de blocage d'IP et le coût de maintenance et d'exploitation de la solution.

Il est toujours préférable d'essayer plusieurs options différentes pour voir laquelle fonctionne le mieux pour votre cas d'utilisation.

Comment exécuter du JavaScript avec Scrapy à l'aide de Splash

Splash est un navigateur léger et sans interface graphique spécialement conçu pour le web scraping. Il est basé sur le moteur WebKit, le même que celui qui équipe le navigateur Safari. L'avantage de Splash est qu'il est facile à configurer, en particulier si vous utilisez Docker. Il est également intégré à Scrapy via le middleware scrapy-splash.

Pour utiliser ce middleware, vous devez d'abord installer ce paquet avec pip :

$ pip install scrapy-splash

La configuration de Splash avec Docker est simple. Il vous suffit de lancer une instance de Splash sur votre machine locale à l'aide de Docker (https://docs.docker.com/get-docker/).

$ docker run -p 8050:8050 scrapinghub/splash

Vous devriez ensuite pouvoir accéder à l'instance locale de Splash à l'adresse http://localhost:8050/

Splash web interface describing a JavaScript rendering service, with a code editor panel and a Render me button

Splash dispose d'une API REST qui facilite son utilisation avec Scrapy ou tout autre outil de web scraping. Vous pouvez tester le serveur en effectuant une requête fetch dans le shell Scrapy :

fetch('http://localhost:8050/render.html?url=<target_url>')

Pour configurer le middleware, ajoutez les lignes suivantes à votre fichier settings.py.

SPLASH_URL = 'http://localhost:8050'

DOWNLOADER_MIDDLEWARES = {

    'scrapy_splash.SplashCookiesMiddleware': 723,

    'scrapy_splash.SplashMiddleware': 725,

    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,

}

SPIDER_MIDDLEWARES = {

    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,

}

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

Rendez-vous sur https://github.com/scrapy-plugins/scrapy-splash pour en savoir plus sur chaque paramètre.

La manière la plus simple de traiter les requêtes avec Splash est d'utiliser scrapy_splash.SplashRequest dans votre spider :

import scrapy

from scrapy_splash import SplashRequest

class RandomSpider(scrapy.Spider):

    name = 'random_spider'

    def start_requests(self):

        start_urls = [

        '<first_url',

        '<second_url>'

       ]

        for url in start_urls:

           yield SplashRequest(url=url, callback=self.parse, args={'wait': 5})

    def parse(self, response):

       

            result = response.css("h3::text").extract()

         

            yield result

Vous pouvez ajouter un paramètre « wait » pour spécifier le temps d'attente souhaité avant que Splash ne renvoie votre requête.

L'un des inconvénients potentiels de l'utilisation de Splash est qu'il nécessite l'utilisation du langage de script Lua pour effectuer des actions telles que cliquer sur des boutons, remplir des formulaires et naviguer vers des pages.

Comment exécuter du JavaScript avec Scrapy à l&#x27;aide de Selenium

Vous pouvez utiliser Scrapy avec le pilote Web Selenium. Le middleware scrapy-selenium fonctionne en injectant le pilote Web Selenium dans le processus de requête, de sorte que le code HTML résultant soit renvoyé à l'araignée pour analyse.

Avant de mettre en œuvre cette solution, il est important de noter que vous devrez installer un pilote Web pour interagir avec un navigateur. Par exemple, vous devrez installer geckodriver pour utiliser Firefox avec Selenium. Une fois le pilote Web installé, vous pouvez configurer Selenium dans les paramètres de votre projet Scrapy :

SELENIUM_DRIVER_NAME = 'firefox'

SELENIUM_DRIVER_EXECUTABLE_PATH = which('geckodriver')

SELENIUM_DRIVER_ARGUMENTS=['-headless']  # '--headless' if using chrome instead of firefox

DOWNLOADER_MIDDLEWARES = {

    'scrapy_selenium.SeleniumMiddleware': 800

}

ITEM_PIPELINES = {

    'myproject.pipelines.SanitizePipeline': 1,

}

Vous pouvez ensuite configurer votre spider :

import scrapy

from scrapy_selenium import SeleniumRequest

class RandomSpider(scrapy.Spider):

    name = 'random_spider'

    def start_requests(self):

        start_urls = [

        '<first_url',

        '<second_url>'

       ]

        for url in start_urls:

            yield SeleniumRequest(url=url, callback=self.parse)

    def parse(self, response):

            print(response.request.meta['driver'].title)

            #The request will be handled by selenium, and the request will have an additional meta key, named driver containing the selenium driver with the request processed.

       

            result = response.selector.css("#result::text").extract()

            #The selector response attribute work as usual (but contains the  html processed by the selenium driver).

         

            yield result

Pour plus d'informations sur les méthodes et attributs disponibles pour les pilotes, consultez la documentation Python de Selenium :

http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webdriver

Selenium nécessite qu'un navigateur web soit installé sur la machine où il s'exécute, car il ne s'agit pas d'un navigateur headless autonome. Cela rend son déploiement et son exécution sur plusieurs machines ou dans un environnement cloud plus difficiles.

Comment exécuter du JavaScript avec Scrapy à l&#x27;aide de WebScrapingApi

WebScrapingAPI fournit une API qui se charge de tout le travail fastidieux à votre place. Elle peut exécuter du JavaScript, faire tourner les proxys et même gérer les CAPTCHA, vous garantissant ainsi de pouvoir scraper des sites web en toute simplicité. De plus, vous n'aurez jamais à craindre que votre adresse IP soit bannie pour avoir envoyé trop de requêtes. Afin de configurer Scrapy pour qu'il fonctionne avec WebScrapingAPI, nous allons configurer un middleware proxy qui acheminera toutes les requêtes de récupération via WSA.

Pour ce faire, nous allons configurer Scrapy pour qu'il se connecte au serveur proxy WSA :

import base64

# add this to your middlewares.py file

class WSAProxyMiddleware:

    def process_request(self, request, spider):

        # Set the proxy for the request

        request.meta['proxy'] = "http://proxy.webscrapingapi.com:80"

        request.meta['verify'] = False

        # Set the proxy authentication for the request

        proxy_user_pass = "webscrapingapi.render_js=1:<API_KEY>"

        encoded_user_pass = base64.b64encode(proxy_user_pass.encode()).decode()

        request.headers['Proxy-Authorization'] = f'Basic {encoded_user_pass}'

Et activer le middleware :

DOWNLOADER_MIDDLEWARES = {

    'myproject.middlewares.WSAProxyMiddleware': 1,

}

webscrapingapi.render_js=1 correspond au nom d'utilisateur d'authentification du proxy, <API_KEY> au mot de passe.

Vous pouvez obtenir une API_KEY gratuite en créant un nouveau compte sur https://www.webscrapingapi.com/

En spécifiant le paramètre render_js=1, vous activez la capacité de WebScrapingAPI à accéder à la page Web ciblée à l'aide d'un navigateur sans interface graphique, ce qui permet aux éléments JavaScript de la page de s'afficher avant de vous renvoyer le résultat final du scraping.

Vous pouvez également demander à WSA d'effectuer une action spécifique lors du traitement de votre URL. Pour ce faire, spécifiez le paramètre js_instructions :

js_instructions=[

{"action":"click","selector":"button#log-in-button"}

]

// cette séquence peut être utilisée pour cliquer sur un bouton

Et voilà, WSA va désormais effectuer automatiquement toutes les requêtes pour vous.

Conclusion

Le scraping de sites web dynamiques peut être une tâche ardue, mais avec les bons outils, cela devient beaucoup plus facile à gérer. Dans cet article, nous avons examiné trois options différentes pour le scraping de sites web dynamiques avec Scrapy. Les navigateurs sans interface utilisateur comme Splash et Selenium vous permettent d'exécuter du JavaScript et d'afficher des pages web exactement comme un navigateur classique. Cependant, si vous souhaitez opter pour la solution la plus simple, l'utilisation d'une API telle que WebScrapingApi peut également être une excellente solution. Elle se charge de toutes les tâches complexes à votre place et vous permet d'extraire facilement des données, même à partir des sites web les plus difficiles. Quelle que soit l'option que vous choisissez, il est important de tenir compte de vos besoins spécifiques et de choisir la solution la mieux adaptée à votre projet. Merci de votre lecture, et bon scraping !

À propos de l'auteur
Mihai Maxim, Développeur Full Stack @ WebScrapingAPI
Mihai MaximDéveloppeur Full Stack

Mihai Maxim est développeur Full Stack chez WebScrapingAPI ; il participe à l'ensemble du produit et contribue à la création d'outils et de fonctionnalités fiables pour la plateforme.

Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.