Qu'est-ce que Scrapling ?
Scrapling est un cadre de scraping web complet pour Python qui se positionne comme une solution "adaptative" aux défis modernes du scraping web. Créé par Karim Shoair et publié pour la première fois en octobre 2024, Scrapling a rapidement gagné en popularité dans la communauté des développeurs avec plus de 33 000 étoiles sur GitHub. Le cadre aborde l'un des problèmes les plus persistants du scraping web : maintenir les scrapers lorsque les sites web changent leur structure.
Ce qui distingue Scrapling, c'est son moteur de parsing adaptatif qui apprend des changements de site web et relocalise automatiquement les éléments lorsque les pages sont mises à jour. Cela signifie que vos scrapers peuvent continuer à fonctionner même après une refonte du site web, réduisant ainsi considérablement les frais de maintenance. Le cadre inclut également des capacités de furtivité intégrées pour contourner les systèmes anti-bot comme Cloudflare Turnstile, ce qui le rend particulièrement précieux pour le scraping de sites protégés.
Commencer
L'installation de Scrapling est simple avec pip. Le cadre nécessite Python 3.8 ou supérieur et fonctionne sur toutes les principales plateformes.
pip install scraplingPour le développement ou les dernières fonctionnalités, vous pouvez installer directement depuis GitHub :
pip install git+https://github.com/D4Vinci/Scrapling.gitUne fois installé, vous pouvez commencer avec un exemple de scraping simple :
from scrapling.fetchers import StealthyFetcher
# Activer le mode adaptatif pour la relocalisation automatique des éléments
StealthyFetcher.adaptive = True
# Récupérer une page web avec des capacités de furtivité
page = StealthyFetcher.fetch('https://example.com', headless=True)
# Extraire des données en utilisant des sélecteurs CSS
products = page.css('.product')
for product in products:
title = product.css('h2::text').get()
price = product.css('.price::text').get()
print(f"{title}: {price}")Utilisation et exemples pratiques
La force de Scrapling réside dans sa flexibilité et son adaptabilité. Voici trois scénarios pratiques qui démontrent ses capacités :
Scraping web basique avec furtivité
Pour des tâches de scraping simples qui doivent éviter la détection :
from scrapling.fetchers import StealthyFetcher
# Scraper un site d'actualités
page = StealthyFetcher.fetch('https://news-site.com',
headless=True,
network_idle=True)
# Extraire des articles avec sauvegarde automatique pour une adaptabilité future
articles = page.css('article.news-item', auto_save=True)
for article in articles:
headline = article.css('h2.headline::text').get()
summary = article.css('p.summary::text').get()
link = article.css('a.read-more::attr(href)').get()
print(f"Headline: {headline}")
print(f"Summary: {summary}")
print(f"Link: {link}\n")Crawling à grande échelle avec Spiders
Pour des projets de scraping plus importants nécessitant le crawling de plusieurs pages :
from scrapling.spiders import Spider, Response
import asyncio
class EcommerceSpider(Spider):
name = "ecommerce_scraper"
start_urls = ["https://shop.example.com/products"]
async def parse(self, response: Response):
# Extraire les liens des produits
product_links = response.css('.product-card a::attr(href)').getall()
for link in product_links:
yield response.follow(link, self.parse_product)
# Suivre la pagination
next_page = response.css('.pagination .next::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
async def parse_product(self, response: Response):
yield {
'name': response.css('h1.product-title::text').get(),
'price': response.css('.price::text').get(),
'description': response.css('.description::text').get(),
'rating': response.css('.rating::attr(data-rating)').get(),
'url': response.url
}
# Lancer le spider
spider = EcommerceSpider()
spider.start()Scraping adaptatif pour les sites web changeants
Lorsque les sites web changent fréquemment leur structure, les fonctionnalités adaptatives de Scrapling brillent :
from scrapling.fetchers import StealthyFetcher
# Scraping initial avec apprentissage des éléments
page = StealthyFetcher.fetch('https://dynamic-site.com')
products = page.css('.product-item', auto_save=True) # Apprendre la structure des éléments
# Plus tard, lorsque le site web change ses classes CSS
# Le mode adaptatif essaiera de trouver les éléments en utilisant les modèles appris
page_updated = StealthyFetcher.fetch('https://dynamic-site.com')
products_adaptive = page_updated.css('.product-item', adaptive=True)
# Scrapling tentera de localiser les produits même si les classes CSS ont changé


