From b40a1a37b9f3639db052c9df7c42c5a4c602b4fe Mon Sep 17 00:00:00 2001 From: Karim shoair Date: Tue, 3 Mar 2026 21:17:13 +0200 Subject: [PATCH 1/2] docs: add a new special sponsor --- README.md | 6 ++++++ docs/README_AR.md | 5 +++++ docs/README_CN.md | 5 +++++ docs/README_DE.md | 5 +++++ docs/README_ES.md | 5 +++++ docs/README_JP.md | 5 +++++ docs/README_RU.md | 5 +++++ docs/overrides/main.html | 6 ++++++ docs/stylesheets/extra.css | 9 +++++++++ images/DataImpulse.png | Bin 0 -> 55403 bytes zensical.toml | 2 +- 11 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 images/DataImpulse.png diff --git a/README.md b/README.md index 7e90ece..4c22bac 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,12 @@ class MySpider(Spider): MySpider().start() ``` +

+ + At DataImpulse, we specialize in developing custom proxy services for your business. Make requests from anywhere, collect data, and enjoy fast connections with our premium proxies. + +

+ # Platinum Sponsors diff --git a/docs/README_AR.md b/docs/README_AR.md index fc9a2d4..5f4790a 100644 --- a/docs/README_AR.md +++ b/docs/README_AR.md @@ -72,6 +72,11 @@ class MySpider(Spider): MySpider().start() ``` +

+ + At DataImpulse, we specialize in developing custom proxy services for your business. Make requests from anywhere, collect data, and enjoy fast connections with our premium proxies. + +

# الرعاة البلاتينيون
diff --git a/docs/README_CN.md b/docs/README_CN.md index fce435e..81017e1 100644 --- a/docs/README_CN.md +++ b/docs/README_CN.md @@ -72,6 +72,11 @@ class MySpider(Spider): MySpider().start() ``` +

+ + At DataImpulse, we specialize in developing custom proxy services for your business. Make requests from anywhere, collect data, and enjoy fast connections with our premium proxies. + +

# 铂金赞助商
diff --git a/docs/README_DE.md b/docs/README_DE.md index 6392e20..ca37660 100644 --- a/docs/README_DE.md +++ b/docs/README_DE.md @@ -72,6 +72,11 @@ class MySpider(Spider): MySpider().start() ``` +

+ + At DataImpulse, we specialize in developing custom proxy services for your business. Make requests from anywhere, collect data, and enjoy fast connections with our premium proxies. + +

# Platin-Sponsoren
diff --git a/docs/README_ES.md b/docs/README_ES.md index 93ff7de..83a6cbc 100644 --- a/docs/README_ES.md +++ b/docs/README_ES.md @@ -72,6 +72,11 @@ class MySpider(Spider): MySpider().start() ``` +

+ + At DataImpulse, we specialize in developing custom proxy services for your business. Make requests from anywhere, collect data, and enjoy fast connections with our premium proxies. + +

# Patrocinadores Platino
diff --git a/docs/README_JP.md b/docs/README_JP.md index 24c055c..e39f37f 100644 --- a/docs/README_JP.md +++ b/docs/README_JP.md @@ -72,6 +72,11 @@ class MySpider(Spider): MySpider().start() ``` +

+ + At DataImpulse, we specialize in developing custom proxy services for your business. Make requests from anywhere, collect data, and enjoy fast connections with our premium proxies. + +

# プラチナスポンサー
diff --git a/docs/README_RU.md b/docs/README_RU.md index 7ff5415..3611f24 100644 --- a/docs/README_RU.md +++ b/docs/README_RU.md @@ -72,6 +72,11 @@ class MySpider(Spider): MySpider().start() ``` +

+ + At DataImpulse, we specialize in developing custom proxy services for your business. Make requests from anywhere, collect data, and enjoy fast connections with our premium proxies. + +

# Платиновые спонсоры
diff --git a/docs/overrides/main.html b/docs/overrides/main.html index 2c3c512..64bbf2f 100644 --- a/docs/overrides/main.html +++ b/docs/overrides/main.html @@ -1,5 +1,11 @@ {% extends "base.html" %} +{% block announce %} + + At DataImpulse, we specialize in developing custom proxy services for your business. Make requests from anywhere, collect data, and enjoy fast connections with our premium proxies. + +{% endblock %} + {% block extrahead %} diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index b174997..1e85760 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -17,4 +17,13 @@ font-family: 'Maple Mono'; font-style: italic; font-weight: 800; +} + +/* Announcement banner background */ +[data-md-color-scheme="default"] .md-banner { + background-color: #232946; +} + +[data-md-color-scheme="slate"] .md-banner { + background-color: #141428; } \ No newline at end of file diff --git a/images/DataImpulse.png b/images/DataImpulse.png new file mode 100644 index 0000000000000000000000000000000000000000..0c62c3b48c50936e0fc5b12ce42bdc1b221e553f GIT binary patch literal 55403 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

ogh*Y@90ZG{F6s`MhvGRgO;>r(=51OI4-L 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 literal 0 HcmV?d00001 diff --git a/zensical.toml b/zensical.toml index 0b52de7..e00bb32 100644 --- a/zensical.toml +++ b/zensical.toml @@ -77,7 +77,7 @@ logo = "assets/logo.png" favicon = "assets/favicon.ico" features = [ "navigation.path", - "announce.dismiss", +# "announce.dismiss", "navigation.top", "navigation.footer", "navigation.indexes", From bcdfba4d0747ad81e0b9c3263dbbd64b9a413843 Mon Sep 17 00:00:00 2001 From: Karim shoair Date: Tue, 3 Mar 2026 21:26:05 +0200 Subject: [PATCH 2/2] docs: add French language to the translated README files --- README.md | 2 +- docs/README_FR.md | 474 +++++++++++++++++++++++++++++++++++++++ docs/overrides/main.html | 2 +- 3 files changed, 476 insertions(+), 2 deletions(-) create mode 100644 docs/README_FR.md diff --git a/README.md b/README.md index 4c22bac..119d714 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@

D4Vinci%2FScrapling | Trendshift
- العربيه | Español | Deutsch | 简体中文 | 日本語 | Русский + العربيه | Español | Français | Deutsch | 简体中文 | 日本語 | Русский
Tests diff --git a/docs/README_FR.md b/docs/README_FR.md new file mode 100644 index 0000000..7b967f7 --- /dev/null +++ b/docs/README_FR.md @@ -0,0 +1,474 @@ + + +

+ + + + Scrapling Poster + + +
+ Effortless Web Scraping for the Modern Web +

+ +

+ + Tests + + PyPI version + + PyPI Downloads +
+ + Discord + + + X (formerly Twitter) Follow + +
+ + Supported Python versions +

+ +

+ Méthodes de sélection + · + Fetchers + · + Spiders + · + Rotation de proxy + · + CLI + · + MCP +

+ +Scrapling est un framework de Web Scraping adaptatif qui gère tout, d'une simple requête à un crawl à grande échelle. + +Son parser apprend des modifications de sites web et relocalise automatiquement vos éléments lorsque les pages sont mises à jour. Ses fetchers contournent les systèmes anti-bot comme Cloudflare Turnstile nativement. Et son framework Spider vous permet de monter en charge vers des crawls concurrents multi-sessions avec pause/reprise et rotation automatique de proxy — le tout en quelques lignes de Python. Une seule bibliothèque, zéro compromis. + +Des crawls ultra-rapides avec des statistiques en temps réel et du streaming. Conçu par des Web Scrapers pour des Web Scrapers et des utilisateurs réguliers, il y en a pour tout le monde. + +```python +from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher +StealthyFetcher.adaptive = True +p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # Récupérer un site web en toute discrétion ! +products = p.css('.product', auto_save=True) # Scraper des données qui survivent aux changements de design ! +products = p.css('.product', adaptive=True) # Plus tard, si la structure du site change, passez `adaptive=True` pour les retrouver ! +``` +Ou montez en charge vers des crawls complets +```python +from scrapling.spiders import Spider, Response + +class MySpider(Spider): + name = "demo" + start_urls = ["https://example.com/"] + + async def parse(self, response: Response): + for item in response.css('.product'): + yield {"title": item.css('h2::text').get()} + +MySpider().start() +``` + +

+ + At DataImpulse, we specialize in developing custom proxy services for your business. Make requests from anywhere, collect data, and enjoy fast connections with our premium proxies. + +

+ +# Sponsors Platine +
+ + + + + + + + +
+ + +
+
🚀 + S'abonner + | 💬 + Discord + +
Les fetchers de Scrapling gèrent Cloudflare Turnstile, mais pour une protection de niveau entreprise, Hyper Solutions fournit des points d'accès API qui génèrent des tokens antibot valides pour : AkamaiDataDomeKasadaIncapsula +
Pas d'automatisation de navigateur. De simples appels API retournant exactement les cookies et headers requis par ces systèmes. +
+ + +
+
+
Nous avons créé BirdProxies parce que les proxies ne devraient pas être compliqués ni trop chers. Des proxies résidentiels et ISP rapides dans plus de 195 localisations, des prix équitables et un vrai support.
+ Essayez notre jeu FlappyBird sur la page d'accueil pour des données gratuites ! +
🚀 + Essayer maintenant + | 💬 + Discord + +
+ +Vous souhaitez afficher votre publicité ici ? Cliquez [ici](https://github.com/sponsors/D4Vinci/sponsorships?tier_id=586646) +# Sponsors + + + + + + + + + + + + + + + + + + +Vous souhaitez afficher votre publicité ici ? Cliquez [ici](https://github.com/sponsors/D4Vinci) et choisissez le niveau qui vous convient ! + +--- + +## Fonctionnalités principales + +### Spiders — Un framework de crawling complet +- 🕷️ **API Spider à la Scrapy** : Définissez des spiders avec `start_urls`, des callbacks async `parse` et des objets `Request`/`Response`. +- ⚡ **Crawling concurrent** : Limites de concurrence configurables, throttling par domaine et délais de téléchargement. +- 🔄 **Support multi-sessions** : Interface unifiée pour les requêtes HTTP et les navigateurs headless furtifs dans un seul spider — routez les requêtes vers différentes sessions par ID. +- 💾 **Pause & Reprise** : Persistance du crawl basée sur des checkpoints. Appuyez sur Ctrl+C pour un arrêt gracieux ; redémarrez pour reprendre là où vous vous étiez arrêté. +- 📡 **Mode streaming** : Diffusez les éléments scrapés en temps réel via `async for item in spider.stream()` avec des statistiques en temps réel — idéal pour les UI, pipelines et crawls de longue durée. +- 🛡️ **Détection des requêtes bloquées** : Détection automatique et réessai des requêtes bloquées avec une logique personnalisable. +- 📦 **Export intégré** : Exportez les résultats via des hooks et votre propre pipeline ou l'export JSON/JSONL intégré avec `result.items.to_json()` / `result.items.to_jsonl()` respectivement. + +### Récupération avancée de sites web avec support de sessions +- **Requêtes HTTP** : Requêtes HTTP rapides et furtives avec la classe `Fetcher`. Peut imiter l'empreinte TLS des navigateurs, les headers et utiliser HTTP/3. +- **Chargement dynamique** : Récupérez des sites web dynamiques avec une automatisation complète du navigateur via la classe `DynamicFetcher` supportant Chromium de Playwright et Google Chrome. +- **Contournement anti-bot** : Capacités de furtivité avancées avec `StealthyFetcher` et usurpation d'empreinte. Peut facilement contourner tous les types de Turnstile/Interstitial de Cloudflare avec l'automatisation. +- **Gestion de sessions** : Support de sessions persistantes avec les classes `FetcherSession`, `StealthySession` et `DynamicSession` pour la gestion des cookies et de l'état entre les requêtes. +- **Rotation de proxy** : `ProxyRotator` intégré avec des stratégies de rotation cycliques ou personnalisées sur tous les types de sessions, plus des surcharges de proxy par requête. +- **Blocage de domaines** : Bloquez les requêtes vers des domaines spécifiques (et leurs sous-domaines) dans les fetchers basés sur navigateur. +- **Support async** : Support async complet sur tous les fetchers et classes de sessions async dédiées. + +### Scraping adaptatif & Intégration IA +- 🔄 **Suivi intelligent des éléments** : Relocalisez les éléments après des modifications de site web en utilisant des algorithmes de similarité intelligents. +- 🎯 **Sélection flexible intelligente** : Sélecteurs CSS, sélecteurs XPath, recherche par filtres, recherche textuelle, recherche regex et plus encore. +- 🔍 **Trouver des éléments similaires** : Localisez automatiquement des éléments similaires aux éléments trouvés. +- 🤖 **Serveur MCP pour utilisation avec l'IA** : Serveur MCP intégré pour le Web Scraping et l'extraction de données assistés par IA. Le serveur MCP dispose de capacités puissantes et personnalisées qui exploitent Scrapling pour extraire du contenu ciblé avant de le transmettre à l'IA (Claude/Cursor/etc.), accélérant ainsi les opérations et réduisant les coûts en minimisant l'utilisation de tokens. ([vidéo de démonstration](https://www.youtube.com/watch?v=qyFk3ZNwOxE)) + +### Architecture haute performance et éprouvée +- 🚀 **Ultra rapide** : Performance optimisée surpassant la plupart des bibliothèques de scraping Python. +- 🔋 **Économe en mémoire** : Structures de données optimisées et chargement paresseux pour une empreinte mémoire minimale. +- ⚡ **Sérialisation JSON rapide** : 10x plus rapide que la bibliothèque standard. +- 🏗️ **Éprouvé en conditions réelles** : Non seulement Scrapling dispose d'une couverture de tests de 92% et d'une couverture complète des type hints, mais il est utilisé quotidiennement par des centaines de Web Scrapers depuis l'année dernière. + +### Expérience conviviale pour développeurs/Web Scrapers +- 🎯 **Shell interactif de Web Scraping** : Shell IPython intégré optionnel avec intégration Scrapling, raccourcis et nouveaux outils pour accélérer le développement de scripts de Web Scraping, comme la conversion de requêtes curl en requêtes Scrapling et l'affichage des résultats dans votre navigateur. +- 🚀 **Utilisez-le directement depuis le terminal** : Optionnellement, vous pouvez utiliser Scrapling pour scraper une URL sans écrire une seule ligne de code ! +- 🛠️ **API de navigation riche** : Traversée avancée du DOM avec des méthodes de navigation parent, frère et enfant. +- 🧬 **Traitement de texte amélioré** : Regex intégrées, méthodes de nettoyage et opérations sur les chaînes optimisées. +- 📝 **Génération automatique de sélecteurs** : Générez des sélecteurs CSS/XPath robustes pour n'importe quel élément. +- 🔌 **API familière** : Similaire à Scrapy/BeautifulSoup avec les mêmes pseudo-éléments utilisés dans Scrapy/Parsel. +- 📘 **Couverture de types complète** : Type hints complets pour un excellent support IDE et la complétion de code. L'ensemble de la base de code est automatiquement analysé avec **PyRight** et **MyPy** à chaque modification. +- 🔋 **Image Docker prête à l'emploi** : À chaque version, une image Docker contenant tous les navigateurs est automatiquement construite et publiée. + +## Pour commencer + +Voici un aperçu rapide de ce que Scrapling peut faire sans entrer dans les détails. + +### Utilisation de base +Requêtes HTTP avec support de sessions +```python +from scrapling.fetchers import Fetcher, FetcherSession + +with FetcherSession(impersonate='chrome') as session: # Utiliser la dernière version de l'empreinte TLS de Chrome + page = session.get('https://quotes.toscrape.com/', stealthy_headers=True) + quotes = page.css('.quote .text::text').getall() + +# Ou utiliser des requêtes ponctuelles +page = Fetcher.get('https://quotes.toscrape.com/') +quotes = page.css('.quote .text::text').getall() +``` +Mode furtif avancé +```python +from scrapling.fetchers import StealthyFetcher, StealthySession + +with StealthySession(headless=True, solve_cloudflare=True) as session: # Garder le navigateur ouvert jusqu'à ce que vous ayez terminé + page = session.fetch('https://nopecha.com/demo/cloudflare', google_search=False) + data = page.css('#padded_content a').getall() + +# Ou utiliser le style requête ponctuelle : ouvre le navigateur pour cette requête, puis le ferme après +page = StealthyFetcher.fetch('https://nopecha.com/demo/cloudflare') +data = page.css('#padded_content a').getall() +``` +Automatisation complète du navigateur +```python +from scrapling.fetchers import DynamicFetcher, DynamicSession + +with DynamicSession(headless=True, disable_resources=False, network_idle=True) as session: # Garder le navigateur ouvert jusqu'à ce que vous ayez terminé + page = session.fetch('https://quotes.toscrape.com/', load_dom=False) + data = page.xpath('//span[@class="text"]/text()').getall() # Sélecteur XPath si vous le préférez + +# Ou utiliser le style requête ponctuelle : ouvre le navigateur pour cette requête, puis le ferme après +page = DynamicFetcher.fetch('https://quotes.toscrape.com/') +data = page.css('.quote .text::text').getall() +``` + +### Spiders +Construisez des crawlers complets avec des requêtes concurrentes, plusieurs types de sessions et pause/reprise : +```python +from scrapling.spiders import Spider, Request, Response + +class QuotesSpider(Spider): + name = "quotes" + start_urls = ["https://quotes.toscrape.com/"] + concurrent_requests = 10 + + async def parse(self, response: Response): + for quote in response.css('.quote'): + yield { + "text": quote.css('.text::text').get(), + "author": quote.css('.author::text').get(), + } + + next_page = response.css('.next a') + if next_page: + yield response.follow(next_page[0].attrib['href']) + +result = QuotesSpider().start() +print(f"{len(result.items)} citations scrapées") +result.items.to_json("quotes.json") +``` +Utilisez plusieurs types de sessions dans un seul spider : +```python +from scrapling.spiders import Spider, Request, Response +from scrapling.fetchers import FetcherSession, AsyncStealthySession + +class MultiSessionSpider(Spider): + name = "multi" + start_urls = ["https://example.com/"] + + def configure_sessions(self, manager): + manager.add("fast", FetcherSession(impersonate="chrome")) + manager.add("stealth", AsyncStealthySession(headless=True), lazy=True) + + async def parse(self, response: Response): + for link in response.css('a::attr(href)').getall(): + # Router les pages protégées via la session furtive + if "protected" in link: + yield Request(link, sid="stealth") + else: + yield Request(link, sid="fast", callback=self.parse) # Callback explicite +``` +Mettez en pause et reprenez les longs crawls avec des checkpoints en lançant le spider ainsi : +```python +QuotesSpider(crawldir="./crawl_data").start() +``` +Appuyez sur Ctrl+C pour mettre en pause gracieusement — la progression est sauvegardée automatiquement. Plus tard, lorsque vous relancez le spider, passez le même `crawldir`, et il reprendra là où il s'était arrêté. + +### Parsing avancé & Navigation +```python +from scrapling.fetchers import Fetcher + +# Sélection riche d'éléments et navigation +page = Fetcher.get('https://quotes.toscrape.com/') + +# Obtenir des citations avec plusieurs méthodes de sélection +quotes = page.css('.quote') # Sélecteur CSS +quotes = page.xpath('//div[@class="quote"]') # XPath +quotes = page.find_all('div', {'class': 'quote'}) # Style BeautifulSoup +# Identique à +quotes = page.find_all('div', class_='quote') +quotes = page.find_all(['div'], class_='quote') +quotes = page.find_all(class_='quote') # et ainsi de suite... +# Trouver un élément par contenu textuel +quotes = page.find_by_text('quote', tag='div') + +# Navigation avancée +quote_text = page.css('.quote')[0].css('.text::text').get() +quote_text = page.css('.quote').css('.text::text').getall() # Sélecteurs chaînés +first_quote = page.css('.quote')[0] +author = first_quote.next_sibling.css('.author::text') +parent_container = first_quote.parent + +# Relations et similarité entre éléments +similar_elements = first_quote.find_similar() +below_elements = first_quote.below_elements() +``` +Vous pouvez utiliser le parser directement si vous ne souhaitez pas récupérer de sites web, comme ci-dessous : +```python +from scrapling.parser import Selector + +page = Selector("...") +``` +Et cela fonctionne exactement de la même manière ! + +### Exemples de gestion de sessions async +```python +import asyncio +from scrapling.fetchers import FetcherSession, AsyncStealthySession, AsyncDynamicSession + +async with FetcherSession(http3=True) as session: # `FetcherSession` est sensible au contexte et peut fonctionner en mode sync comme async + page1 = session.get('https://quotes.toscrape.com/') + page2 = session.get('https://quotes.toscrape.com/', impersonate='firefox135') + +# Utilisation de session async +async with AsyncStealthySession(max_pages=2) as session: + tasks = [] + urls = ['https://example.com/page1', 'https://example.com/page2'] + + for url in urls: + task = session.fetch(url) + tasks.append(task) + + print(session.get_pool_stats()) # Optionnel - Le statut du pool d'onglets du navigateur (occupé/libre/erreur) + results = await asyncio.gather(*tasks) + print(session.get_pool_stats()) +``` + +## CLI & Shell interactif + +Scrapling inclut une interface en ligne de commande puissante : + +[![asciicast](https://asciinema.org/a/736339.svg)](https://asciinema.org/a/736339) + +Lancer le shell interactif de Web Scraping +```bash +scrapling shell +``` +Extraire des pages directement dans un fichier sans programmation (extrait par défaut le contenu de la balise `body`). Si le fichier de sortie se termine par `.txt`, le contenu textuel de la cible sera extrait. S'il se termine par `.md`, ce sera une représentation Markdown du contenu HTML ; s'il se termine par `.html`, ce sera le contenu HTML lui-même. +```bash +scrapling extract get 'https://example.com' content.md +scrapling extract get 'https://example.com' content.txt --css-selector '#fromSkipToProducts' --impersonate 'chrome' # Tous les éléments correspondant au sélecteur CSS '#fromSkipToProducts' +scrapling extract fetch 'https://example.com' content.md --css-selector '#fromSkipToProducts' --no-headless +scrapling extract stealthy-fetch 'https://nopecha.com/demo/cloudflare' captchas.html --css-selector '#padded_content a' --solve-cloudflare +``` + +> [!NOTE] +> Il existe de nombreuses fonctionnalités supplémentaires, mais nous souhaitons garder cette page concise, y compris le serveur MCP et le shell interactif de Web Scraping. Consultez la documentation complète [ici](https://scrapling.readthedocs.io/en/latest/) + +## Benchmarks de performance + +Scrapling n'est pas seulement puissant — il est aussi ultra rapide. Les benchmarks suivants comparent le parser de Scrapling avec les dernières versions d'autres bibliothèques populaires. + +### Test de vitesse d'extraction de texte (5000 éléments imbriqués) + +| # | Bibliothèque | Temps (ms) | vs Scrapling | +|---|:-----------------:|:----------:|:------------:| +| 1 | Scrapling | 2.02 | 1.0x | +| 2 | Parsel/Scrapy | 2.04 | 1.01 | +| 3 | Raw Lxml | 2.54 | 1.257 | +| 4 | PyQuery | 24.17 | ~12x | +| 5 | Selectolax | 82.63 | ~41x | +| 6 | MechanicalSoup | 1549.71 | ~767.1x | +| 7 | BS4 with Lxml | 1584.31 | ~784.3x | +| 8 | BS4 with html5lib | 3391.91 | ~1679.1x | + + +### Performance de similarité d'éléments & recherche textuelle + +Les capacités adaptatives de recherche d'éléments de Scrapling surpassent significativement les alternatives : + +| Bibliothèque | Temps (ms) | vs Scrapling | +|--------------|:----------:|:------------:| +| Scrapling | 2.39 | 1.0x | +| AutoScraper | 12.45 | 5.209x | + + +> Tous les benchmarks représentent des moyennes de plus de 100 exécutions. Voir [benchmarks.py](https://github.com/D4Vinci/Scrapling/blob/main/benchmarks.py) pour la méthodologie. + +## Installation + +Scrapling nécessite Python 3.10 ou supérieur : + +```bash +pip install scrapling +``` + +Cette installation n'inclut que le moteur de parsing et ses dépendances, sans aucun fetcher ni dépendance en ligne de commande. + +### Dépendances optionnelles + +1. Si vous allez utiliser l'une des fonctionnalités supplémentaires ci-dessous, les fetchers ou leurs classes, vous devrez installer les dépendances des fetchers et leurs dépendances navigateur comme suit : + ```bash + pip install "scrapling[fetchers]" + + scrapling install # installation normale + scrapling install --force # réinstallation forcée + ``` + + Cela télécharge tous les navigateurs, ainsi que leurs dépendances système et les dépendances de manipulation d'empreintes. + + Ou vous pouvez les installer depuis le code au lieu d'exécuter une commande : + ```python + from scrapling.cli import install + + install([], standalone_mode=False) # installation normale + install(["--force"], standalone_mode=False) # réinstallation forcée + ``` + +2. Fonctionnalités supplémentaires : + - Installer la fonctionnalité serveur MCP : + ```bash + pip install "scrapling[ai]" + ``` + - Installer les fonctionnalités shell (shell de Web Scraping et la commande `extract`) : + ```bash + pip install "scrapling[shell]" + ``` + - Tout installer : + ```bash + pip install "scrapling[all]" + ``` + N'oubliez pas que vous devez installer les dépendances navigateur avec `scrapling install` après l'un de ces extras (si vous ne l'avez pas déjà fait) + +### Docker +Vous pouvez également installer une image Docker avec tous les extras et navigateurs avec la commande suivante depuis DockerHub : +```bash +docker pull pyd4vinci/scrapling +``` +Ou téléchargez-la depuis le registre GitHub : +```bash +docker pull ghcr.io/d4vinci/scrapling:latest +``` +Cette image est automatiquement construite et publiée en utilisant GitHub Actions et la branche principale du dépôt. + +## Contribuer + +Les contributions sont les bienvenues ! Veuillez lire nos [directives de contribution](https://github.com/D4Vinci/Scrapling/blob/main/CONTRIBUTING.md) avant de commencer. + +## Avertissement + +> [!CAUTION] +> Cette bibliothèque est fournie uniquement à des fins éducatives et de recherche. En utilisant cette bibliothèque, vous acceptez de vous conformer aux lois locales et internationales sur le scraping de données et la confidentialité. Les auteurs et contributeurs ne sont pas responsables de toute utilisation abusive de ce logiciel. Respectez toujours les conditions d'utilisation des sites web et les fichiers robots.txt. + +## 🎓 Citations +Si vous avez utilisé notre bibliothèque à des fins de recherche, veuillez nous citer avec la référence suivante : +```text + @misc{scrapling, + author = {Karim Shoair}, + title = {Scrapling}, + year = {2024}, + url = {https://github.com/D4Vinci/Scrapling}, + note = {An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!} + } +``` + +## Licence + +Ce travail est sous licence BSD-3-Clause. + +## Remerciements + +Ce projet inclut du code adapté de : +- Parsel (Licence BSD) — Utilisé pour le sous-module [translator](https://github.com/D4Vinci/Scrapling/blob/main/scrapling/core/translator.py) + +--- +
Conçu et développé avec ❤️ par Karim Shoair.

diff --git a/docs/overrides/main.html b/docs/overrides/main.html index 64bbf2f..153f667 100644 --- a/docs/overrides/main.html +++ b/docs/overrides/main.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block announce %} - + At DataImpulse, we specialize in developing custom proxy services for your business. Make requests from anywhere, collect data, and enjoy fast connections with our premium proxies. {% endblock %}