En matière de Scraping web, Python offre un large choix d’outils. Selenium, MechanicalSoup, Scrapy, Requests, Beautiful Soup et lxml sont souvent utilisés dans ce contexte. Cependant, ces outils ne sont pas tous égaux, car chacun d’entre eux a ses propres cas d’utilisation dans lesquels il excelle. Certains d’entre eux sont même complémentaires, comme le démontrera cet article.
Dans cet article, vous découvrirez plus en détail Scrapy et Beautiful Soup, deux choix populaires pour le Scraping web.
Beautiful Soup est une bibliothèque d’analyse syntaxique. Elle permet de naviguer dans les documents à l’aide de sélecteurs XPath et CSS. Cela facilite la transformation des données issues de langages de balisage (tels que HTML et XML) en données structurées. En revanche, Scrapy est un framework complet de Scraping web qui charge un document et (éventuellement) le stocke.
Apprenez-en davantage sur le Scraping web avec Beautiful Soup.
Dans cette comparaison, vous examinerez les aspects suivants : facilité d’utilisation du crawling, facilité d’utilisation du scraping, vitesse, exécution en plusieurs étapes, Proxy rotatif et Résolution de CAPTCHA.
Scrapy vs Beautiful Soup : comparaison rapide
Si vous êtes pressé, voici une comparaison rapide entre Scrapy et Beautiful Soup pour le Scraping web avec Python.
Scrapy est un framework complet de Scraping web, parfait pour les projets d’extraction de données à grande échelle et offrant une prise en charge intégrée du crawling, tandis que Beautiful Soup est une bibliothèque d’analyse syntaxique qui convient mieux aux tâches de scraping plus petites et plus simples, sans capacités de crawling intégrées.
Scrapy excelle en termes de vitesse et d’efficacité pour les opérations de scraping étendues, tandis que Beautiful Soup brille par sa simplicité et sa facilité d’utilisation pour les tâches rapides. Choisissez Scrapy pour les projets complexes ou Beautiful Soup pour les besoins d’analyse simples et directs.
Scrapy
Scrapy est une suite tout-en-un permettant de crawler le web, de télécharger des documents, de les traiter et de stocker les données obtenues dans un format accessible. L’installation de Scrapy s’effectue facilement avec pip ou conda:
pip install scrapy
conda install -c conda-forge scrapy
Exploration du Web avec Scrapy
Scrapy vous aide à explorer des ensembles de pages et de sites web afin de collecter des URL à extraire ou de découvrir si une page contient les informations spécifiques que vous recherchez. Scrapy fonctionne avec des araignées, qui sont des classes Python dans lesquelles on peut définir comment naviguer sur un site web, à quelle profondeur il faut aller dans la structure du site, quelles données il faut extraire et comment elles doivent être stockées. Pour assembler une liste d’URL, Scrapy peut naviguer dans des documents HTML, XML et CSV et même charger des plans de site.
En outre, Scrapy propose le shell Scrapy, un shell interactif permettant de tester et de déboguer des expressions XPath et CSS sur des pages spécifiques. L’utilisation du shell peut vous faire gagner du temps lors de l’exploration et du scraping, car il n’est plus nécessaire de redémarrer le spider à chaque fois que vous apportez des modifications.
Scraping web avec Scrapy
En matière de scraping, vous avez généralement besoin d’une grande flexibilité. Scrapy propose deux méthodes pour sélectionner des éléments dans un document : via des expressions XPath et CSS. La première est principalement utilisée pour les documents XML, tandis que la seconde est exclusivement réservée aux documents HTML.
Une fonctionnalité unique de Scrapy est la possibilité de définir des pipelines. Lorsqu’un élément est scrapé, il peut être envoyé vers un pipeline dans lequel une séquence d’actions est effectuée : nettoyage, validation, hachage, déduplication et enrichissement.
Vitesse
Un autre aspect important du scraping web est le temps qu’il prend. Il n’est pas facile d’évaluer la vitesse de Scrapy, car il comporte beaucoup de frais généraux qui doivent être traités. C’est pourquoi les frais généraux ne sont chargés qu’une seule fois, tandis que l’exploration et l’extraction ont lieu dix fois.
Dans l’exemple suivant, le h2 d’une page web simple (c’est-à-dire non dynamique) est extrait. Tout le code s’exécute dans un notebook Jupyter.
Commencez par charger les bibliothèques Scrapy requises :
import scrapy
from scrapy.crawler import CrawlerProcess
Ensuite, créez la classe MySpider qui décrit la tâche de scraping :
class MySpider(scrapy.Spider):
name = "myspider"
start_urls = [
'https://edition.cnn.com' # Ou répétez cette opération 10 fois pour calculer le temps marginal
]
def parse(self, response):
yield {'output': response.css('h2.container_lead-package__title_url-text::text').extract()}
process = CrawlerProcess(
settings={
"FEEDS": {
"scrapy_output.json": {"format": "json", "overwrite": True}
}
})
process.crawl(MySpider)
Troisièmement, exécutez le script et chronométrez-le :
%%timeit -n 1 -r 1
process.start()
La séquence consistant à explorer, extraire et stocker un seul document web a pris environ 400 millisecondes. Cependant, répéter le même processus dix fois a pris 1 200 millisecondes. Cela signifie qu’une seule séquence prend environ 80 millisecondes, ce qui est impressionnant. Compte tenu de la surcharge, Scrapy devrait être votre premier choix pour les tâches intensives.
Scraping en plusieurs étapes avec Scrapy
De nombreux sites web, à l’exception peut-être des plus populaires tels que X/Twitter, Substack et LinkedIn, sont dynamiques. Cela signifie que de grandes quantités d’informations sont cachées derrière des écrans de connexion, des requêtes de recherche, des pop-ups, des défilements ou des survols de souris. Par conséquent, il ne suffit souvent pas que votre spider visite simplement une page pour en extraire des données.
Scrapy propose différentes approches pour traiter ces tâches en tant qu’outil autonome. Il est possible de produire les requêtes HTTP nécessaires ou d’exécuter les extraits JavaScript pertinents. Cependant, l’utilisation d’un navigateur sans interface offre la plus grande flexibilité. Par exemple, il existe des intégrations Playwright et Selenium pour Scrapy qui peuvent être utilisées pour interagir avec des éléments dynamiques.
Proxy rotatif et prévention des CAPTCHA avec Scrapy
L’arrivée des grands modèles linguistiques a incité de nombreuses entreprises à affiner leurs modèles, mais cela nécessite des données spécifiques (souvent récupérées par scraping). De plus, de nombreuses organisations ne veulent pas que les robots sollicitent les serveurs de leur site web et n’ont aucun intérêt commercial à partager leurs données. C’est pourquoi de nombreux sites web sont non seulement configurés de manière dynamique, mais introduisent également des technologies anti-scraping, telles que le blocage automatique des adresses IP et le CAPTCHA.
Pour éviter d’être bloqué, Scrapy ne propose pas d’outils prêts à l’emploi pour les Proxies rotatifs (et des adresses IP). Cependant, Scrapy peut être étendu grâce au framework Middleware, un ensemble de hooks permettant de modifier le processus de requête et de réponse de Scrapy. Pour faire tourner les Proxies rotatives, il est possible d’ajouter un module Python, tel que scrapy-rotating-proxies, spécialement conçu à cet effet. Grâce au même mécanisme, il est possible d’ajouter le module DeCAPTCHA.
Beautiful Soup
Contrairement à Scrapy, Beautiful Soup n’offre pas de solution complète pour l’extraction et le traitement des données à partir de documents web ; il ne propose que la partie scraping. Il suffit de lui fournir un document téléchargé et Beautiful Soup le transforme en données structurées grâce à des sélecteurs CSS et XPath.
L’installation de Beautiful Soup peut se faire via pip et conda :
pip install BeautifulSoup4
conda install -c anaconda beautifulsoup4
Exploration du Web avec Beautiful Soup
Alors que Scrapy déploie des araignées pour naviguer sur un site web, Beautiful Soup n’offre pas cette fonctionnalité. Cependant, avec un peu de créativité en Python, en utilisant à la fois Beautiful Soup et la bibliothèque Requests, il est possible d’écrire un script pour naviguer sur un site web jusqu’à une certaine profondeur. Néanmoins, ce n’est certainement pas aussi facile qu’avec Scrapy.
Scraping web avec Beautiful Soup
Le scraping web est ce qui fait la force de Beautiful Soup 4. Non seulement il offre des sélecteurs CSS et XPath, mais il est également doté d’une multitude de méthodes pour parcourir les documents. Lorsque les documents ont une structure complexe, des méthodes telles que .parent et .next_sibling permettent d’extraire des éléments qui seraient autrement difficiles à atteindre. De plus, grâce à find_all() et à des méthodes similaires, vous pouvez spécifier des filtres de texte, des expressions régulières et même des fonctions personnalisées pour trouver les éléments requis.
Enfin, Beautiful Soup dispose de divers formateurs de sortie pour mettre en forme la sortie, l’encoder, supprimer les guillemets typographiques de Microsoft et même analyser et valider le HTML.
Vitesse
Contrairement à Scrapy, Requests et Beautiful Soup n’ont pas de surcharge et peuvent simplement être exécutés dix fois pour évaluer leur vitesse.
Commencez par charger les bibliothèques requises :
import requests, json
from bs4 import BeautifulSoup
Ensuite, chronométrez le code en l’enveloppant dans une commande magiquetimeit:
%%timeit -n 10 -r 1
page = requests.get('https://edition.cnn.com')
page_html = BeautifulSoup(page.text, 'html.parser')
page_html = page_html.select_one('h2.container_lead-package__title_url-text').text
json_object = json.dumps({'output': page_html})
with open("bs4_output.json", "w") as output_file:
output_file.write(json_object)
Une seule exécution prend environ 300 millisecondes. Dix exécutions prennent 3 000 millisecondes, ce qui est considérablement plus lent que Scrapy. Cependant, cela nécessite beaucoup moins de configuration et relativement peu de connaissances d’un framework particulier.
Récupération en plusieurs étapes avec Beautiful Soup
Comme Beautiful Soup n’a pas de capacités de crawling, il ne peut certainement pas gérer les pages web dynamiques. Cependant, comme Scrapy, il fonctionne parfaitement avec des outils d’automatisation tels que Playwright, Puppeteer et Selenium. L’association d’outils d’automatisation avec Beautiful Soup fonctionne toujours de la même manière : les navigateurs headless gèrent les éléments dynamiques, tandis que Beautiful Soup extrait les données rendues dans ces navigateurs.
Rotation des proxys et prévention des CAPTCHA avec Beautiful Soup
Comme Beautiful Soup est un outil de scraping et non un outil de crawling, il ne propose aucun outil permettant d’éviter d’être bloqué par les serveurs d’un site web. Si vous avez besoin de cette fonctionnalité, elle doit faire partie de l’outil de crawling que vous choisissez.
Conclusion
Cet article a décrit les différences entre Beautiful Soup et Scrapy en termes d’utilisation pour le crawling et le Scraping web en termes de vitesse, de gestion des documents web dynamiques et de contournement des mesures anti-scraping.
En tant qu’outil de bout en bout, Scrapy est clairement le favori pour les tâches quotidiennes de scraping. Cependant, il nécessite certains middlewares pour scraper des sites web dynamiques et s’assurer de ne pas être bloqué.
Bien que Beautiful Soup (associé au package request) soit assez lent, il offre une méthode très familière et simple pour les tâches de scraping ponctuelles. Tout comme Scrapy, il nécessite des outils supplémentaires pour le scraping de sites web dynamiques et la prévention des blocages.
Si vous recherchez une solution unique pour le Scraping web, pensez à Bright Data. Bright Data propose de nombreux produits, tels que des services de Proxy et Web Unlocker, pour répondre à tous vos besoins en matière de Scraping web, quelle que soit l’option que vous choisissez.
Vous souhaitez savoir comment intégrer les Proxys Bright Data ? Lisez notre guide sur l’intégration des Proxys Scrapy et BeautifulSoup.