Comment exécuter un script Java avec Scrapy
Mihai Maxim le 30 janvier 2023

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, ces types de sites web peuvent être un peu difficiles à naviguer avec les outils de web scraping traditionnels. Mais n'ayez crainte ! Scrapy, le fidèle assistant de web scraping, vous soutient avec une variété de plugins et de bibliothèques qui font du web scraping dynamique un jeu d'enfant.
Dans cet article, nous allons nous pencher sur quelques-unes des options les plus populaires pour récupérer ces sites Web alimentés par JavaScript avec Scrapy. Et pour rendre les choses encore plus faciles, nous 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 ne connaissez pas Scrapy, ne vous inquiétez pas. Vous pouvez vous référer à notre guide pour une introduction au scraping web avec Scrapy.
Navigateurs sans tête ?
Si vous ne connaissez pas les navigateurs sans tête, laissez-moi vous expliquer. Il s'agit essentiellement de navigateurs web qui fonctionnent sans interface visible. Oui, je sais que cela semble bizarre de ne pas pouvoir 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 web scraping.
Voici pourquoi : contrairement aux navigateurs classiques qui se contentent d'afficher des pages web, les navigateurs "headless" peuvent exécuter du JavaScript. Cela signifie que si vous essayez de récupérer un site web dont le contenu est généré par JavaScript, un navigateur headless peut vous aider en exécutant le JavaScript et en vous permettant de récupérer le code HTML qui en résulte.
Explorer différentes solutions
La meilleure stratégie pour rendre JavaScript avec Scrapy dépend de vos besoins spécifiques et de vos ressources. Si votre budget est serré, vous devrez choisir une solution rentable. L'utilisation d'un navigateur sans tête ou d'une bibliothèque de rendu JavaScript peut être l'option la moins coûteuse, mais vous devrez toujours faire face à la possibilité de blocages IP et au coût de la maintenance et de l'exploitation de la solution.
Il est toujours préférable d'essayer plusieurs options différentes et de voir laquelle convient le mieux à votre cas d'utilisation.
Comment exécuter du Javascript avec Scrapy en utilisant Splash
Splash est un navigateur léger, sans tête, conçu spécifiquement pour le web scraping. Il est basé sur le moteur WebKit, qui est le même moteur que le navigateur Safari. L'avantage de Splash est qu'il est facile à configurer, surtout si vous utilisez Docker. Il est également intégré à Scrapy grâce à l'intergiciel scrapy-splash.
Pour utiliser l'intergiciel, vous devez d'abord installer ce paquet avec pip :
pip install scrapy-splash
La mise en place de Splash avec Docker est facile. Tout ce que vous avez à faire est de lancer une instance de Splash sur votre machine locale en utilisant Docker (https://docs.docker.com/get-docker/).
$ docker run -p 8050:8050 scrapinghub/splash
Après cela, vous devriez pouvoir accéder à l'instance locale de Splash à l'adresse http://localhost:8050/.

Splash dispose d'une API REST qui facilite son utilisation avec Scrapy ou tout autre outil de scraping web. 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 l'intergiciel, 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'
Visitez le site https://github.com/scrapy-plugins/scrapy-splash pour en savoir plus sur les différents sites.
La façon la plus simple de rendre 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 que Splash doit attendre avant de renvoyer votre demande.
L'un des inconvénients potentiels 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 sur des pages.
Comment exécuter du Javascript avec Scrapy en utilisant Selenium
Vous pouvez utiliser Scrapy avec le pilote web Selenium. L'intergiciel scrapy-selenium fonctionne en injectant le pilote web Selenium dans le processus de requête, de sorte que le HTML résultant est renvoyé au spider pour être analysé.
Avant de mettre en œuvre cette solution, il est important de noter que vous devrez installer un pilote web afin d'interagir avec un navigateur. Par exemple, vous devrez installer geckodriver afin d'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, reportez-vous à la documentation python de Selenium :
http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webdriver
Selenium nécessite l'installation d'un navigateur web sur la machine où il est exécuté, car il ne s'agit pas d'un navigateur autonome sans tête. Il est donc plus difficile de le déployer et de l'exécuter sur plusieurs machines ou dans un environnement en nuage.
Comment exécuter du Javascript avec Scrapy en utilisant WebScrapingApi
WebScrapingAPI fournit une API qui se chargera de toutes les tâches lourdes à votre place. Elle peut exécuter du JavaScript, faire pivoter des proxies et même gérer des CAPTCHA, ce qui vous permet de récupérer des sites web en toute simplicité. De plus, vous n'aurez jamais à vous inquiéter de voir votre IP bannie pour avoir envoyé trop de requêtes. Afin de configurer Scrappy pour qu'il fonctionne avec WebScrapingAPI, nous allons configurer un middleware proxy qui fera passer toutes les requêtes fetch par 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 l'intergiciel :
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.WSAProxyMiddleware': 1,
}
webscrapingapi.render_js=1 is the proxy authentication username, <API_KEY> the password.
Vous pouvez obtenir une clé API gratuite en créant un nouveau compte à l'adresse 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 tête qui permet aux éléments JavaScript de la page d'être rendus 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. Vous pouvez le faire en spécifiant le paramètre js_instructions :
js_instructions=[
{"action":"click","selector":"button#log-in-button"}
]
// this sequence could be used to click on a button
Et c'est tout, l'ASM va maintenant faire automatiquement toutes les demandes pour vous.
Conclusion
Le scraping de sites web dynamiques peut être une tâche difficile, mais avec les bons outils, elle devient beaucoup plus facile à gérer. Dans cet article, nous avons examiné trois options différentes pour récupérer des sites web dynamiques avec Scrapy. Les navigateurs sans tête comme Splash et Selenium vous permettent d'exécuter du JavaScript et de rendre des pages web comme dans un navigateur normal. Cependant, si vous souhaitez emprunter la voie la plus simple, l'utilisation d'une API comme WebScrapingApi peut également être une excellente solution. Elle prend en charge toutes les tâches complexes à votre place et vous permet d'extraire facilement des données des sites web les plus complexes. Quelle que soit l'option choisie, il est important de prendre en compte vos besoins spécifiques et de choisir la solution la mieux adaptée à votre projet. Merci de votre lecture et bon scraping !
Nouvelles et mises à jour
Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

Explorez la comparaison approfondie entre Scrapy et Selenium pour le web scraping. De l'acquisition de données à grande échelle à la gestion de contenus dynamiques, découvrez les avantages, les inconvénients et les caractéristiques uniques de chacun. Apprenez à choisir le meilleur framework en fonction des besoins et de l'échelle de votre projet.


Apprenez à récupérer des sites web dynamiques en JavaScript à l'aide de Scrapy et de Splash. De l'installation à l'écriture d'un spider, en passant par la gestion de la pagination et des réponses Splash, ce guide complet propose des instructions pas à pas pour les débutants comme pour les experts.


Découvrez une comparaison détaillée entre Scrapy et Beautiful Soup, deux outils de scraping web de premier plan. Comprenez leurs caractéristiques, leurs avantages et leurs inconvénients, et découvrez comment ils peuvent être utilisés ensemble pour répondre aux besoins de différents projets.
