Karim shoair commited on
Commit
456df81
·
1 Parent(s): 38cd335

docs: add French language to the translated README files

Browse files
Files changed (3) hide show
  1. README.md +1 -1
  2. docs/README_FR.md +474 -0
  3. docs/overrides/main.html +1 -1
README.md CHANGED
@@ -14,7 +14,7 @@
14
  <p align="center">
15
  <a href="https://trendshift.io/repositories/14244" target="_blank"><img src="https://trendshift.io/api/badge/repositories/14244" alt="D4Vinci%2FScrapling | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
16
  <br/>
17
- <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_AR.md">العربيه</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_ES.md">Español</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_DE.md">Deutsch</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_CN.md">简体中文</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_JP.md">日本語</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_RU.md">Русский</a>
18
  <br/>
19
  <a href="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml" alt="Tests">
20
  <img alt="Tests" src="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml/badge.svg"></a>
 
14
  <p align="center">
15
  <a href="https://trendshift.io/repositories/14244" target="_blank"><img src="https://trendshift.io/api/badge/repositories/14244" alt="D4Vinci%2FScrapling | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
16
  <br/>
17
+ <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_AR.md">العربيه</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_ES.md">Español</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_FR.md">Français</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_DE.md">Deutsch</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_CN.md">简体中文</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_JP.md">日本語</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_RU.md">Русский</a>
18
  <br/>
19
  <a href="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml" alt="Tests">
20
  <img alt="Tests" src="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml/badge.svg"></a>
docs/README_FR.md ADDED
@@ -0,0 +1,474 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- mcp-name: io.github.D4Vinci/Scrapling -->
2
+
3
+ <h1 align="center">
4
+ <a href="https://scrapling.readthedocs.io">
5
+ <picture>
6
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/docs/assets/cover_dark.svg?sanitize=true">
7
+ <img alt="Scrapling Poster" src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/docs/assets/cover_light.svg?sanitize=true">
8
+ </picture>
9
+ </a>
10
+ <br>
11
+ <small>Effortless Web Scraping for the Modern Web</small>
12
+ </h1>
13
+
14
+ <p align="center">
15
+ <a href="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml" alt="Tests">
16
+ <img alt="Tests" src="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml/badge.svg"></a>
17
+ <a href="https://badge.fury.io/py/Scrapling" alt="PyPI version">
18
+ <img alt="PyPI version" src="https://badge.fury.io/py/Scrapling.svg"></a>
19
+ <a href="https://pepy.tech/project/scrapling" alt="PyPI Downloads">
20
+ <img alt="PyPI Downloads" src="https://static.pepy.tech/personalized-badge/scrapling?period=total&units=INTERNATIONAL_SYSTEM&left_color=GREY&right_color=GREEN&left_text=Downloads"></a>
21
+ <br/>
22
+ <a href="https://discord.gg/EMgGbDceNQ" alt="Discord" target="_blank">
23
+ <img alt="Discord" src="https://img.shields.io/discord/1360786381042880532?style=social&logo=discord&link=https%3A%2F%2Fdiscord.gg%2FEMgGbDceNQ">
24
+ </a>
25
+ <a href="https://x.com/Scrapling_dev" alt="X (formerly Twitter)">
26
+ <img alt="X (formerly Twitter) Follow" src="https://img.shields.io/twitter/follow/Scrapling_dev?style=social&logo=x&link=https%3A%2F%2Fx.com%2FScrapling_dev">
27
+ </a>
28
+ <br/>
29
+ <a href="https://pypi.org/project/scrapling/" alt="Supported Python versions">
30
+ <img alt="Supported Python versions" src="https://img.shields.io/pypi/pyversions/scrapling.svg"></a>
31
+ </p>
32
+
33
+ <p align="center">
34
+ <a href="https://scrapling.readthedocs.io/en/latest/parsing/selection/"><strong>Méthodes de sélection</strong></a>
35
+ &middot;
36
+ <a href="https://scrapling.readthedocs.io/en/latest/fetching/choosing/"><strong>Fetchers</strong></a>
37
+ &middot;
38
+ <a href="https://scrapling.readthedocs.io/en/latest/spiders/architecture.html"><strong>Spiders</strong></a>
39
+ &middot;
40
+ <a href="https://scrapling.readthedocs.io/en/latest/spiders/proxy-blocking.html"><strong>Rotation de proxy</strong></a>
41
+ &middot;
42
+ <a href="https://scrapling.readthedocs.io/en/latest/cli/overview/"><strong>CLI</strong></a>
43
+ &middot;
44
+ <a href="https://scrapling.readthedocs.io/en/latest/ai/mcp-server/"><strong>MCP</strong></a>
45
+ </p>
46
+
47
+ Scrapling est un framework de Web Scraping adaptatif qui gère tout, d'une simple requête à un crawl à grande échelle.
48
+
49
+ 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.
50
+
51
+ 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.
52
+
53
+ ```python
54
+ from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
55
+ StealthyFetcher.adaptive = True
56
+ p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # Récupérer un site web en toute discrétion !
57
+ products = p.css('.product', auto_save=True) # Scraper des données qui survivent aux changements de design !
58
+ products = p.css('.product', adaptive=True) # Plus tard, si la structure du site change, passez `adaptive=True` pour les retrouver !
59
+ ```
60
+ Ou montez en charge vers des crawls complets
61
+ ```python
62
+ from scrapling.spiders import Spider, Response
63
+
64
+ class MySpider(Spider):
65
+ name = "demo"
66
+ start_urls = ["https://example.com/"]
67
+
68
+ async def parse(self, response: Response):
69
+ for item in response.css('.product'):
70
+ yield {"title": item.css('h2::text').get()}
71
+
72
+ MySpider().start()
73
+ ```
74
+
75
+ <p align="center">
76
+ <a href="https://dataimpulse.com/?utm_source=scrapling&utm_medium=banner&utm_campaign=scrapling" target="_blank" style="display:flex; justify-content:center; padding:4px 0;">
77
+ <img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/DataImpulse.png" alt="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." style="max-height:60px;">
78
+ </a>
79
+ </p>
80
+
81
+ # Sponsors Platine
82
+ <table>
83
+ <tr>
84
+ <td width="240">
85
+ <a href="https://hypersolutions.co/?utm_source=github&utm_medium=readme&utm_campaign=scrapling" target="_blank" title="Bot Protection Bypass API for Akamai, DataDome, Incapsula & Kasada">
86
+ <img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/HyperSolutions.png">
87
+ <br />
88
+ </a> 🚀 <a href="https://hypersolutions.co?utm_source=github&utm_medium=readme&utm_campaign=scrapling">
89
+ <b>S'abonner</b>
90
+ </a> | 💬 <a href="https://discord.gg/akamai">
91
+ <b>Discord</b>
92
+ </a>
93
+ </td>
94
+ <td> Les fetchers de Scrapling gèrent Cloudflare Turnstile, mais pour une protection de niveau entreprise, <a href="https://hypersolutions.co?utm_source=github&utm_medium=readme&utm_campaign=scrapling" title="Bot Protection Bypass API for Akamai, DataDome, Incapsula & Kasada">Hyper Solutions</a> fournit des points d'accès API qui génèrent des tokens antibot valides pour : <b>Akamai</b> • <b>DataDome</b> • <b>Kasada</b> • <b>Incapsula</b>
95
+ <br /> Pas d'automatisation de navigateur. De simples appels API retournant exactement les cookies et headers requis par ces systèmes.
96
+ </td>
97
+ </tr>
98
+ <tr>
99
+ <td width="240">
100
+ <a href="https://birdproxies.com/t/scrapling" target="_blank" title="At Bird Proxies, we eliminate your pains such as banned IPs, geo restriction, and high costs so you can focus on your work.">
101
+ <img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/BirdProxies.jpg">
102
+ <br />
103
+ </a>
104
+ </td>
105
+ <td>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. <br />
106
+ <b>Essayez notre jeu FlappyBird sur la page d'accueil pour des données gratuites !</b>
107
+ <br /> 🚀 <a href="https://birdproxies.com/t/scrapling">
108
+ <b>Essayer maintenant</b>
109
+ </a> | 💬 <a href="https://discord.com/invite/birdproxies">
110
+ <b>Discord</b>
111
+ </a>
112
+ </td>
113
+ </tr>
114
+ </table>
115
+
116
+ <i><sub>Vous souhaitez afficher votre publicité ici ? Cliquez [ici](https://github.com/sponsors/D4Vinci/sponsorships?tier_id=586646)</sub></i>
117
+ # Sponsors
118
+
119
+ <!-- sponsors -->
120
+
121
+ <a href="https://www.thordata.com/?ls=github&lk=github" target="_blank" title="Unblockable proxies and scraping infrastructure, delivering real-time, reliable web data to power AI models and workflows."><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/thordata.jpg"></a>
122
+ <a href="https://evomi.com?utm_source=github&utm_medium=banner&utm_campaign=d4vinci-scrapling" target="_blank" title="Evomi is your Swiss Quality Proxy Provider, starting at $0.49/GB"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/evomi.png"></a>
123
+ <a href="https://serpapi.com/?utm_source=scrapling" target="_blank" title="Scrape Google and other search engines with SerpApi"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/SerpApi.png"></a>
124
+ <a href="https://visit.decodo.com/Dy6W0b" target="_blank" title="Try the Most Efficient Residential Proxies for Free"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/decodo.png"></a>
125
+ <a href="https://petrosky.io/d4vinci" target="_blank" title="PetroSky delivers cutting-edge VPS hosting."><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/petrosky.png"></a>
126
+ <a href="https://hasdata.com/?utm_source=github&utm_medium=banner&utm_campaign=D4Vinci" target="_blank" title="The web scraping service that actually beats anti-bot systems!"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/hasdata.png"></a>
127
+ <a href="https://proxyempire.io/?ref=scrapling&utm_source=scrapling" target="_blank" title="Collect The Data Your Project Needs with the Best Residential Proxies"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/ProxyEmpire.png"></a>
128
+
129
+
130
+ <a href="https://www.swiftproxy.net/" target="_blank" title="Unlock Reliable Proxy Services with Swiftproxy!"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/swiftproxy.png"></a>
131
+ <a href="https://www.rapidproxy.io/?ref=d4v" target="_blank" title="Affordable Access to the Proxy World – bypass CAPTCHAs blocks, and avoid additional costs."><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/rapidproxy.jpg"></a>
132
+ <a href="https://browser.cash/?utm_source=D4Vinci&utm_medium=referral" target="_blank" title="Browser Automation & AI Browser Agent Platform"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/browserCash.png"></a>
133
+
134
+ <!-- /sponsors -->
135
+
136
+ <i><sub>Vous souhaitez afficher votre publicité ici ? Cliquez [ici](https://github.com/sponsors/D4Vinci) et choisissez le niveau qui vous convient !</sub></i>
137
+
138
+ ---
139
+
140
+ ## Fonctionnalités principales
141
+
142
+ ### Spiders — Un framework de crawling complet
143
+ - 🕷️ **API Spider à la Scrapy** : Définissez des spiders avec `start_urls`, des callbacks async `parse` et des objets `Request`/`Response`.
144
+ - ⚡ **Crawling concurrent** : Limites de concurrence configurables, throttling par domaine et délais de téléchargement.
145
+ - 🔄 **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.
146
+ - 💾 **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é.
147
+ - 📡 **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.
148
+ - 🛡️ **Détection des requêtes bloquées** : Détection automatique et réessai des requêtes bloquées avec une logique personnalisable.
149
+ - 📦 **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.
150
+
151
+ ### Récupération avancée de sites web avec support de sessions
152
+ - **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.
153
+ - **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.
154
+ - **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.
155
+ - **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.
156
+ - **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.
157
+ - **Blocage de domaines** : Bloquez les requêtes vers des domaines spécifiques (et leurs sous-domaines) dans les fetchers basés sur navigateur.
158
+ - **Support async** : Support async complet sur tous les fetchers et classes de sessions async dédiées.
159
+
160
+ ### Scraping adaptatif & Intégration IA
161
+ - 🔄 **Suivi intelligent des éléments** : Relocalisez les éléments après des modifications de site web en utilisant des algorithmes de similarité intelligents.
162
+ - 🎯 **Sélection flexible intelligente** : Sélecteurs CSS, sélecteurs XPath, recherche par filtres, recherche textuelle, recherche regex et plus encore.
163
+ - 🔍 **Trouver des éléments similaires** : Localisez automatiquement des éléments similaires aux éléments trouvés.
164
+ - 🤖 **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))
165
+
166
+ ### Architecture haute performance et éprouvée
167
+ - 🚀 **Ultra rapide** : Performance optimisée surpassant la plupart des bibliothèques de scraping Python.
168
+ - 🔋 **Économe en mémoire** : Structures de données optimisées et chargement paresseux pour une empreinte mémoire minimale.
169
+ - ⚡ **Sérialisation JSON rapide** : 10x plus rapide que la bibliothèque standard.
170
+ - 🏗️ **É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.
171
+
172
+ ### Expérience conviviale pour développeurs/Web Scrapers
173
+ - 🎯 **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.
174
+ - 🚀 **Utilisez-le directement depuis le terminal** : Optionnellement, vous pouvez utiliser Scrapling pour scraper une URL sans écrire une seule ligne de code !
175
+ - 🛠️ **API de navigation riche** : Traversée avancée du DOM avec des méthodes de navigation parent, frère et enfant.
176
+ - 🧬 **Traitement de texte amélioré** : Regex intégrées, méthodes de nettoyage et opérations sur les chaînes optimisées.
177
+ - 📝 **Génération automatique de sélecteurs** : Générez des sélecteurs CSS/XPath robustes pour n'importe quel élément.
178
+ - 🔌 **API familière** : Similaire à Scrapy/BeautifulSoup avec les mêmes pseudo-éléments utilisés dans Scrapy/Parsel.
179
+ - 📘 **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.
180
+ - 🔋 **Image Docker prête à l'emploi** : À chaque version, une image Docker contenant tous les navigateurs est automatiquement construite et publiée.
181
+
182
+ ## Pour commencer
183
+
184
+ Voici un aperçu rapide de ce que Scrapling peut faire sans entrer dans les détails.
185
+
186
+ ### Utilisation de base
187
+ Requêtes HTTP avec support de sessions
188
+ ```python
189
+ from scrapling.fetchers import Fetcher, FetcherSession
190
+
191
+ with FetcherSession(impersonate='chrome') as session: # Utiliser la dernière version de l'empreinte TLS de Chrome
192
+ page = session.get('https://quotes.toscrape.com/', stealthy_headers=True)
193
+ quotes = page.css('.quote .text::text').getall()
194
+
195
+ # Ou utiliser des requêtes ponctuelles
196
+ page = Fetcher.get('https://quotes.toscrape.com/')
197
+ quotes = page.css('.quote .text::text').getall()
198
+ ```
199
+ Mode furtif avancé
200
+ ```python
201
+ from scrapling.fetchers import StealthyFetcher, StealthySession
202
+
203
+ with StealthySession(headless=True, solve_cloudflare=True) as session: # Garder le navigateur ouvert jusqu'à ce que vous ayez terminé
204
+ page = session.fetch('https://nopecha.com/demo/cloudflare', google_search=False)
205
+ data = page.css('#padded_content a').getall()
206
+
207
+ # Ou utiliser le style requête ponctuelle : ouvre le navigateur pour cette requête, puis le ferme après
208
+ page = StealthyFetcher.fetch('https://nopecha.com/demo/cloudflare')
209
+ data = page.css('#padded_content a').getall()
210
+ ```
211
+ Automatisation complète du navigateur
212
+ ```python
213
+ from scrapling.fetchers import DynamicFetcher, DynamicSession
214
+
215
+ with DynamicSession(headless=True, disable_resources=False, network_idle=True) as session: # Garder le navigateur ouvert jusqu'à ce que vous ayez terminé
216
+ page = session.fetch('https://quotes.toscrape.com/', load_dom=False)
217
+ data = page.xpath('//span[@class="text"]/text()').getall() # Sélecteur XPath si vous le préférez
218
+
219
+ # Ou utiliser le style requête ponctuelle : ouvre le navigateur pour cette requête, puis le ferme après
220
+ page = DynamicFetcher.fetch('https://quotes.toscrape.com/')
221
+ data = page.css('.quote .text::text').getall()
222
+ ```
223
+
224
+ ### Spiders
225
+ Construisez des crawlers complets avec des requêtes concurrentes, plusieurs types de sessions et pause/reprise :
226
+ ```python
227
+ from scrapling.spiders import Spider, Request, Response
228
+
229
+ class QuotesSpider(Spider):
230
+ name = "quotes"
231
+ start_urls = ["https://quotes.toscrape.com/"]
232
+ concurrent_requests = 10
233
+
234
+ async def parse(self, response: Response):
235
+ for quote in response.css('.quote'):
236
+ yield {
237
+ "text": quote.css('.text::text').get(),
238
+ "author": quote.css('.author::text').get(),
239
+ }
240
+
241
+ next_page = response.css('.next a')
242
+ if next_page:
243
+ yield response.follow(next_page[0].attrib['href'])
244
+
245
+ result = QuotesSpider().start()
246
+ print(f"{len(result.items)} citations scrapées")
247
+ result.items.to_json("quotes.json")
248
+ ```
249
+ Utilisez plusieurs types de sessions dans un seul spider :
250
+ ```python
251
+ from scrapling.spiders import Spider, Request, Response
252
+ from scrapling.fetchers import FetcherSession, AsyncStealthySession
253
+
254
+ class MultiSessionSpider(Spider):
255
+ name = "multi"
256
+ start_urls = ["https://example.com/"]
257
+
258
+ def configure_sessions(self, manager):
259
+ manager.add("fast", FetcherSession(impersonate="chrome"))
260
+ manager.add("stealth", AsyncStealthySession(headless=True), lazy=True)
261
+
262
+ async def parse(self, response: Response):
263
+ for link in response.css('a::attr(href)').getall():
264
+ # Router les pages protégées via la session furtive
265
+ if "protected" in link:
266
+ yield Request(link, sid="stealth")
267
+ else:
268
+ yield Request(link, sid="fast", callback=self.parse) # Callback explicite
269
+ ```
270
+ Mettez en pause et reprenez les longs crawls avec des checkpoints en lançant le spider ainsi :
271
+ ```python
272
+ QuotesSpider(crawldir="./crawl_data").start()
273
+ ```
274
+ 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é.
275
+
276
+ ### Parsing avancé & Navigation
277
+ ```python
278
+ from scrapling.fetchers import Fetcher
279
+
280
+ # Sélection riche d'éléments et navigation
281
+ page = Fetcher.get('https://quotes.toscrape.com/')
282
+
283
+ # Obtenir des citations avec plusieurs méthodes de sélection
284
+ quotes = page.css('.quote') # Sélecteur CSS
285
+ quotes = page.xpath('//div[@class="quote"]') # XPath
286
+ quotes = page.find_all('div', {'class': 'quote'}) # Style BeautifulSoup
287
+ # Identique à
288
+ quotes = page.find_all('div', class_='quote')
289
+ quotes = page.find_all(['div'], class_='quote')
290
+ quotes = page.find_all(class_='quote') # et ainsi de suite...
291
+ # Trouver un élément par contenu textuel
292
+ quotes = page.find_by_text('quote', tag='div')
293
+
294
+ # Navigation avancée
295
+ quote_text = page.css('.quote')[0].css('.text::text').get()
296
+ quote_text = page.css('.quote').css('.text::text').getall() # Sélecteurs chaînés
297
+ first_quote = page.css('.quote')[0]
298
+ author = first_quote.next_sibling.css('.author::text')
299
+ parent_container = first_quote.parent
300
+
301
+ # Relations et similarité entre éléments
302
+ similar_elements = first_quote.find_similar()
303
+ below_elements = first_quote.below_elements()
304
+ ```
305
+ Vous pouvez utiliser le parser directement si vous ne souhaitez pas récupérer de sites web, comme ci-dessous :
306
+ ```python
307
+ from scrapling.parser import Selector
308
+
309
+ page = Selector("<html>...</html>")
310
+ ```
311
+ Et cela fonctionne exactement de la même manière !
312
+
313
+ ### Exemples de gestion de sessions async
314
+ ```python
315
+ import asyncio
316
+ from scrapling.fetchers import FetcherSession, AsyncStealthySession, AsyncDynamicSession
317
+
318
+ async with FetcherSession(http3=True) as session: # `FetcherSession` est sensible au contexte et peut fonctionner en mode sync comme async
319
+ page1 = session.get('https://quotes.toscrape.com/')
320
+ page2 = session.get('https://quotes.toscrape.com/', impersonate='firefox135')
321
+
322
+ # Utilisation de session async
323
+ async with AsyncStealthySession(max_pages=2) as session:
324
+ tasks = []
325
+ urls = ['https://example.com/page1', 'https://example.com/page2']
326
+
327
+ for url in urls:
328
+ task = session.fetch(url)
329
+ tasks.append(task)
330
+
331
+ print(session.get_pool_stats()) # Optionnel - Le statut du pool d'onglets du navigateur (occupé/libre/erreur)
332
+ results = await asyncio.gather(*tasks)
333
+ print(session.get_pool_stats())
334
+ ```
335
+
336
+ ## CLI & Shell interactif
337
+
338
+ Scrapling inclut une interface en ligne de commande puissante :
339
+
340
+ [![asciicast](https://asciinema.org/a/736339.svg)](https://asciinema.org/a/736339)
341
+
342
+ Lancer le shell interactif de Web Scraping
343
+ ```bash
344
+ scrapling shell
345
+ ```
346
+ 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.
347
+ ```bash
348
+ scrapling extract get 'https://example.com' content.md
349
+ scrapling extract get 'https://example.com' content.txt --css-selector '#fromSkipToProducts' --impersonate 'chrome' # Tous les éléments correspondant au sélecteur CSS '#fromSkipToProducts'
350
+ scrapling extract fetch 'https://example.com' content.md --css-selector '#fromSkipToProducts' --no-headless
351
+ scrapling extract stealthy-fetch 'https://nopecha.com/demo/cloudflare' captchas.html --css-selector '#padded_content a' --solve-cloudflare
352
+ ```
353
+
354
+ > [!NOTE]
355
+ > 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/)
356
+
357
+ ## Benchmarks de performance
358
+
359
+ 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.
360
+
361
+ ### Test de vitesse d'extraction de texte (5000 éléments imbriqués)
362
+
363
+ | # | Bibliothèque | Temps (ms) | vs Scrapling |
364
+ |---|:-----------------:|:----------:|:------------:|
365
+ | 1 | Scrapling | 2.02 | 1.0x |
366
+ | 2 | Parsel/Scrapy | 2.04 | 1.01 |
367
+ | 3 | Raw Lxml | 2.54 | 1.257 |
368
+ | 4 | PyQuery | 24.17 | ~12x |
369
+ | 5 | Selectolax | 82.63 | ~41x |
370
+ | 6 | MechanicalSoup | 1549.71 | ~767.1x |
371
+ | 7 | BS4 with Lxml | 1584.31 | ~784.3x |
372
+ | 8 | BS4 with html5lib | 3391.91 | ~1679.1x |
373
+
374
+
375
+ ### Performance de similarité d'éléments & recherche textuelle
376
+
377
+ Les capacités adaptatives de recherche d'éléments de Scrapling surpassent significativement les alternatives :
378
+
379
+ | Bibliothèque | Temps (ms) | vs Scrapling |
380
+ |--------------|:----------:|:------------:|
381
+ | Scrapling | 2.39 | 1.0x |
382
+ | AutoScraper | 12.45 | 5.209x |
383
+
384
+
385
+ > 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.
386
+
387
+ ## Installation
388
+
389
+ Scrapling nécessite Python 3.10 ou supérieur :
390
+
391
+ ```bash
392
+ pip install scrapling
393
+ ```
394
+
395
+ Cette installation n'inclut que le moteur de parsing et ses dépendances, sans aucun fetcher ni dépendance en ligne de commande.
396
+
397
+ ### Dépendances optionnelles
398
+
399
+ 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 :
400
+ ```bash
401
+ pip install "scrapling[fetchers]"
402
+
403
+ scrapling install # installation normale
404
+ scrapling install --force # réinstallation forcée
405
+ ```
406
+
407
+ Cela télécharge tous les navigateurs, ainsi que leurs dépendances système et les dépendances de manipulation d'empreintes.
408
+
409
+ Ou vous pouvez les installer depuis le code au lieu d'exécuter une commande :
410
+ ```python
411
+ from scrapling.cli import install
412
+
413
+ install([], standalone_mode=False) # installation normale
414
+ install(["--force"], standalone_mode=False) # réinstallation forcée
415
+ ```
416
+
417
+ 2. Fonctionnalités supplémentaires :
418
+ - Installer la fonctionnalité serveur MCP :
419
+ ```bash
420
+ pip install "scrapling[ai]"
421
+ ```
422
+ - Installer les fonctionnalités shell (shell de Web Scraping et la commande `extract`) :
423
+ ```bash
424
+ pip install "scrapling[shell]"
425
+ ```
426
+ - Tout installer :
427
+ ```bash
428
+ pip install "scrapling[all]"
429
+ ```
430
+ 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)
431
+
432
+ ### Docker
433
+ Vous pouvez également installer une image Docker avec tous les extras et navigateurs avec la commande suivante depuis DockerHub :
434
+ ```bash
435
+ docker pull pyd4vinci/scrapling
436
+ ```
437
+ Ou téléchargez-la depuis le registre GitHub :
438
+ ```bash
439
+ docker pull ghcr.io/d4vinci/scrapling:latest
440
+ ```
441
+ Cette image est automatiquement construite et publiée en utilisant GitHub Actions et la branche principale du dépôt.
442
+
443
+ ## Contribuer
444
+
445
+ Les contributions sont les bienvenues ! Veuillez lire nos [directives de contribution](https://github.com/D4Vinci/Scrapling/blob/main/CONTRIBUTING.md) avant de commencer.
446
+
447
+ ## Avertissement
448
+
449
+ > [!CAUTION]
450
+ > 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.
451
+
452
+ ## 🎓 Citations
453
+ Si vous avez utilisé notre bibliothèque à des fins de recherche, veuillez nous citer avec la référence suivante :
454
+ ```text
455
+ @misc{scrapling,
456
+ author = {Karim Shoair},
457
+ title = {Scrapling},
458
+ year = {2024},
459
+ url = {https://github.com/D4Vinci/Scrapling},
460
+ note = {An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!}
461
+ }
462
+ ```
463
+
464
+ ## Licence
465
+
466
+ Ce travail est sous licence BSD-3-Clause.
467
+
468
+ ## Remerciements
469
+
470
+ Ce projet inclut du code adapté de :
471
+ - Parsel (Licence BSD) — Utilisé pour le sous-module [translator](https://github.com/D4Vinci/Scrapling/blob/main/scrapling/core/translator.py)
472
+
473
+ ---
474
+ <div align="center"><small>Conçu et développé avec ❤️ par Karim Shoair.</small></div><br>
docs/overrides/main.html CHANGED
@@ -1,7 +1,7 @@
1
  {% extends "base.html" %}
2
 
3
  {% block announce %}
4
- <a href="https://dataimpulse.com/?utm_source=scrapling&utm_medium=banner&utm_campaign=scrapling" target="_blank" style="display:flex; justify-content:center; padding:4px 0;">
5
  <img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/DataImpulse.png" alt="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." style="max-height:60px;">
6
  </a>
7
  {% endblock %}
 
1
  {% extends "base.html" %}
2
 
3
  {% block announce %}
4
+ <a href="https://dataimpulse.com/?utm_source=scrapling&utm_medium=banner&utm_campaign=scrapling" target="_blank" style="display:flex; justify-content:center; padding:0px 0;">
5
  <img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/DataImpulse.png" alt="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." style="max-height:60px;">
6
  </a>
7
  {% endblock %}