
🕷️ Un framework di Web Scraping adattivo che gestisce tutto, da una singola richiesta a un crawling su larga scala!
العربيه | Español | Português (Brasil) | Français | Deutsch | 简体中文 | 日本語 | Русский | 한국어
Metodi di selezione · Fetcher · Spider · Rotazione proxy · CLI · MCP
Scrapling è un framework di Web Scraping adattivo che gestisce tutto, da una singola richiesta a una scansione su larga scala.
Il suo parser impara dai cambiamenti dei siti web e riposiziona automaticamente i tuoi elementi quando le pagine vengono aggiornate. I suoi fetcher bypassano i sistemi anti-bot come Cloudflare Turnstile senza configurazione aggiuntiva. E il suo framework spider ti permette di scalare fino a scansioni concorrenti multi-sessione con pausa/ripresa, rotazione automatica dei proxy e una velocità di scansione che si adatta alla rapidità con cui ogni sito risponde e rallenta quando inizia a bloccarti - il tutto in poche righe di Python. Una sola libreria, zero compromessi.
Scansioni velocissime con statistiche in tempo reale e streaming. Creato da Web Scraper per Web Scraper e utenti comuni, c'è qualcosa per tutti.```python
from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # Fetch website under the radar!
products = p.css('.product', auto_save=True) # Scrape data that survives website design changes!
products = p.css('.product', adaptive=True) # Later, if the website structure changes, pass adaptive=True to find them!
O fino a scalare fino a crawler completi```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()
Vuoi mostrare il tuo annuncio qui? Clicca qui
Vuoi mostrare il tuo annuncio qui? Clicca qui e scegli il livello che fa per te!
start_urls, callback parse asincroni e oggetti Request/Response.async for item in spider.stream() con statistiche in tempo reale - ideale per UI, pipeline e crawl di lunga durata.Retry-After) ogni volta che il sito inizia a bloccare o limitare le richieste, e accelera di nuovo quando smette.robots_txt_obey che rispetta le direttive Disallow, e con caching per dominio.Fetcher. Può impersonare l'impronta TLS dei browser, gli header e usare HTTP/3.DynamicFetcher che supporta Chromium di Playwright e Chrome di Google.StealthyFetcher e spoofing dell'impronta digitale. Può bypassare facilmente tutti i tipi di Turnstile/Interstitial di Cloudflare con automazione.FetcherSession, StealthySession e DynamicSession per la gestione di cookie e stato tra le richieste.ProxyRotator integrato con strategie di rotazione cicliche o personalizzate su tutti i tipi di sessione, oltre a override proxy per singola richiesta.cdp_url, sia sulla stessa macchina, su un altro host o su un provider di browser gestito. Puoi anche puntare qualsiasi fetcher browser alla tua build di Chromium con .page.markdown()), oppure esegui il crawl di un intero sito web in un corpus Markdown con il template SiteToMarkdownSpider, tutto senza un LLM nel loop. (docs)scrapling_response per analizzare le risposte che già recuperi con il parser di Scrapling, senza riscritture.Ti diamo una rapida occhiata a cosa può fare Scrapling senza entrare troppo nel dettaglio.
Richieste HTTP con supporto sessione```python from scrapling.fetchers import Fetcher, FetcherSession
with FetcherSession(impersonate='chrome') as session: # Use latest version of Chrome's TLS fingerprint page = session.get('https://quotes.toscrape.com/', stealthy_headers=True) quotes = page.css('.quote .text::text').getall()
page = Fetcher.get('https://quotes.toscrape.com/') quotes = page.css('.quote .text::text').getall()
Modalità stealth avanzata```python
from scrapling.fetchers import StealthyFetcher, StealthySession
with StealthySession(headless=True, solve_cloudflare=True) as session: # Keep the browser open until you finish
page = session.fetch('https://nopecha.com/demo/cloudflare', google_search=False)
data = page.css('#padded_content a').getall()
# Or use one-off request style, it opens the browser for this request, then closes it after finishing
page = StealthyFetcher.fetch('https://nopecha.com/demo/cloudflare')
data = page.css('#padded_content a').getall()
Piena automazione del browser```python from scrapling.fetchers import DynamicFetcher, DynamicSession
with DynamicSession(headless=True, disable_resources=False, network_idle=True) as session: # Keep the browser open until you finish page = session.fetch('https://quotes.toscrape.com/', load_dom=False) data = page.xpath('//span[@class="text"]/text()').getall() # XPath selector if you prefer it
page = DynamicFetcher.fetch('https://quotes.toscrape.com/') data = page.css('.quote .text::text').getall()
### Spiders
Costruisci crawler completi con richieste concorrenti, più tipi di sessione e funzionalità di pausa/ripresa:```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"Scraped {len(result.items)} quotes")
result.items.to_json("quotes.json")
Usa più tipi di sessione in un singolo 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():
# Route protected pages through the stealth session
if "protected" in link:
yield Request(link, sid="stealth")
else:
yield Request(link, sid="fast", callback=self.parse) # explicit callback
Pausa e riprendi lunghe scansioni con checkpoint eseguendo lo spider in questo modo:```python
QuotesSpider(crawldir="./crawl_data").start()
Premi Ctrl+C per mettere in pausa con eleganza: i progressi vengono salvati automaticamente. In seguito, quando riavvierai lo spider, passa lo stesso crawldir e riprenderà da dove si era fermato.
Oppure salta del tutto la scrittura della logica di crawling con i modelli già pronti, come estrarre l'intero catalogo di un negozio Shopify:```python from scrapling.spiders import ShopifySpider
class MyStore(ShopifySpider): target_website = "example.com"
result = MyStore().start() # Every product in the store, one item per variant
### Analisi Avanzata e Navigazione```python
from scrapling.fetchers import Fetcher
# Rich element selection and navigation
page = Fetcher.get('https://quotes.toscrape.com/')
# Get quotes with multiple selection methods
quotes = page.css('.quote') # CSS selector
quotes = page.xpath('//div[@class="quote"]') # XPath
quotes = page.find_all('div', {'class': 'quote'}) # BeautifulSoup-style
# Same as
quotes = page.find_all('div', class_='quote')
quotes = page.find_all(['div'], class_='quote')
quotes = page.find_all(class_='quote') # and so on...
# Find element by text content
quotes = page.find_by_text('quote', tag='div')
# Advanced navigation
quote_text = page.css('.quote')[0].css('.text::text').get()
quote_text = page.css('.quote').css('.text::text').getall() # Chained selectors
first_quote = page.css('.quote')[0]
author = first_quote.next_sibling.css('.author::text')
parent_container = first_quote.parent
# Element relationships and similarity
similar_elements = first_quote.find_similar()
below_elements = first_quote.below_elements()
Puoi usare il parser subito se non vuoi recuperare siti web come di seguito:```python from scrapling.parser import Selector
page = Selector("...")
E funziona esattamente allo stesso modo!
### Esempi di gestione delle sessioni asincrone```python
import asyncio
from scrapling.fetchers import FetcherSession, AsyncStealthySession, AsyncDynamicSession
async with FetcherSession(http3=True) as session: # `FetcherSession` is context-aware and can work in both sync/async patterns
page1 = session.get('https://quotes.toscrape.com/')
page2 = session.get('https://quotes.toscrape.com/', impersonate='firefox135')
# Async session usage
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()) # Optional - The status of the browser tabs pool (busy/free/error)
results = await asyncio.gather(*tasks)
print(session.get_pool_stats())
Scrapling include una potente interfaccia a riga di comando:
Avvia la shell interattiva per il Web Scraping```bash scrapling shell
Estrae le pagine in un file direttamente senza programmazione (estrae il contenuto all'interno del tag `body` per impostazione predefinita). Se il file di output termina con `.txt`, verrà estratto il contenuto testuale del target. Se termina con `.md`, sarà una rappresentazione Markdown del contenuto HTML; se termina con `.html`, sarà il contenuto HTML stesso.```bash
scrapling extract get 'https://example.com' content.md
scrapling extract get 'https://example.com' content.txt --css-selector '#fromSkipToProducts' --impersonate 'chrome' # All elements matching the CSS selector '#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] Ci sono molte altre funzionalità, ma vogliamo mantenere questa pagina concisa, incluso il server MCP e la shell interattiva di Web Scraping. Consulta la documentazione completa qui
Scrapling non è solo potente, ma anche estremamente veloce. I seguenti benchmark confrontano il parser di Scrapling con le ultime versioni di altre librerie popolari.
Le capacità adattive di individuazione degli elementi di Scrapling superano significativamente le alternative:
| Libreria | Tempo (ms) | vs Scrapling |
|---|---|---|
| Scrapling | 2.3 | 1.0x |
| AutoScraper | 12.58 | 5.47x |
Tutti i benchmark rappresentano medie di oltre 100 esecuzioni. Consulta benchmarks.py per la metodologia.
Scrapling richiede Python 3.10 o superiore:```bash pip install scrapling
> [!IMPORTANT]
> Questa installazione include solo il motore di parsing e le sue dipendenze, senza alcun fetcher o dipendenza da riga di comando. Quindi importare qualsiasi cosa da `scrapling.fetchers` o `scrapling.spiders`, come negli esempi precedenti, solleverà `ModuleNotFoundError` con questa sola installazione. Se hai intenzione di utilizzare uno qualsiasi dei fetcher o spider, installa prima le dipendenze dei fetcher come mostrato di seguito.
### Dipendenze Opzionali
1. Se hai intenzione di utilizzare una qualsiasi delle funzionalità extra di seguito, i fetcher o le loro classi, dovrai installare le dipendenze dei fetcher e le loro dipendenze del browser come segue:
```bash
pip install "scrapling[fetchers]"
scrapling install # installazione normale
scrapling install --force # forzare la reinstallazione
```
Questo scarica tutti i browser, insieme alle loro dipendenze di sistema e alle dipendenze per la manipolazione delle impronte digitali.
Oppure puoi installarli dal codice invece di eseguire un comando come questo:
```python
from scrapling.cli import install
install([], standalone_mode=False) # installazione normale
install(["--force"], standalone_mode=False) # forzare la reinstallazione
```
2. Funzionalità extra:
- Installa la funzionalità del server MCP:
```bash
pip install "scrapling[ai]"
```
- Installa le dipendenze per ([costruire sistemi RAG](https://scrapling.readthedocs.io/en/latest/ai/building-rag-systems.html)):
```bash
pip install "scrapling[rag]"
```
- Installa le funzionalità della shell (shell di Web Scraping e il comando `extract`):
```bash
pip install "scrapling[shell]"
```
- Installa tutto:
```bash
pip install "scrapling[all]"
```
Ricorda che devi installare le dipendenze del browser con `scrapling install` dopo una qualsiasi di queste opzioni extra (se non l'hai già fatto)
### Docker
Puoi anche installare un'immagine Docker con tutte le funzionalità extra e i browser con il seguente comando da DockerHub:```bash
docker pull pyd4vinci/scrapling
Oppure scaricalo dal registro GitHub:```bash docker pull ghcr.io/d4vinci/scrapling:latest
Questa immagine viene creata e pubblicata automaticamente tramite GitHub Actions e il ramo principale del repository.
## Contributi
Accogliamo con piacere i contributi! Ti preghiamo di leggere le nostre [linee guida per i contributi](https://github.com/D4Vinci/Scrapling/blob/main/CONTRIBUTING.md) prima di iniziare.
## Dichiarazione di esclusione di responsabilità
> [!CAUTION]
> Questa libreria è fornita esclusivamente a scopo educativo e di ricerca. Utilizzando questa libreria, accetti di conformarti alle leggi locali e internazionali sullo scraping dei dati e sulla privacy. Gli autori e i contributori non sono responsabili di qualsiasi uso improprio di questo software. Rispetta sempre i termini di servizio dei siti web e i file robots.txt.
## 🎓 Citazioni
Se hai utilizzato la nostra libreria per scopi di ricerca, ti preghiamo di citarci con il seguente riferimento:```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!}
}
Questo lavoro è concesso in licenza sotto la Licenza BSD-3-Clause.
Questo progetto include codice adattato da:
| NodeMaven - Il fornitore di proxy più efficiente per Web Scraping e Automazione, con IP della massima qualità sul mercato. Usa il codice SCRAPLING35 per uno sconto del 35%. |
| Proxidize fornisce proxy mobili e residenziali per scraping, automazione del browser, monitoraggio SEO, agenti AI e raccolta dati. Usa il codice scrapling20 per uno sconto del 20%. |
| ColdProxy fornisce proxy residenziali e datacenter per uno scraping web stabile, raccolta di dati pubblici e test geo-targetizzati in oltre 195 paesi. |
| Scrapling gestisce Cloudflare Turnstile. Per una protezione di livello enterprise, Hyper Solutions fornisce endpoint API che generano token antibot validi per Akamai, DataDome, Kasada e Incapsula. Semplici chiamate API, nessuna automazione del browser richiesta. |
| Ehi, abbiamo creato
BirdProxies
perché i proxy non dovrebbero essere complicati o sovrapprezzati. Proxy residenziali e ISP veloci in oltre 195 località, prezzi equi e supporto reale. Prova il nostro gioco FlappyBird sulla landing page per dati gratuiti! |
|
Evomi
: proxy residenziali da $0.49/GB. Browser di scraping con Chromium completamente spoofato, IP residenziali, risoluzione automatica dei CAPTCHA e bypass anti-bot. Scraper API per risultati senza problemi. Sono disponibili integrazioni MCP e N8N. |
|
TikHub.io fornisce oltre 900 API stabili su più di 16 piattaforme, tra cui TikTok, X, YouTube e Instagram, con oltre 40 milioni di dataset. Offre anche modelli AI SCONTATI - Claude, GPT, GEMINI e altri fino al 71% di sconto. |
|
Chiudi il laptop. I tuoi scraper continuano a funzionare. PetroSky VPS - server cloud progettati per automazione senza interruzioni. Macchine Windows e Linux con controllo totale. Da €6.99/mese. |
| Leggi una recensione completa di Scrapling su The Web Scraping Club (novembre 2025), la newsletter n.1 dedicata al Web Scraping. |
| Swiftproxy fornisce proxy residenziali scalabili con oltre 80 milioni di IP in più di 195 paesi, garantendo connessioni veloci e affidabili, rotazione automatica e prestazioni anti-blocco elevate. Prova gratuita disponibile. |
| CoreClaw fornisce API per dati web destinati agli agenti AI. Accedi a dati strutturati da Google Maps, LinkedIn, Instagram, YouTube, Amazon e altro. |
| NiuProxy — Proxy residenziali rotanti da $0.35/GB. Usa il codice esclusivo Scrapling PAY2 per uno sconto del 10% sulla tua ricarica. |
Crawl-delayRequest-rateparse() senza colpire di nuovo i server di destinazione.CrawlSpider per il follow di link basato su regole, SitemapSpider per crawl guidati da sitemap/robots.txt, XMLFeedSpider/CSVFeedSpider per iterare feed XML/RSS e CSV, e ShopifySpider per estrarre ogni prodotto da qualsiasi negozio Shopify tramite la sua API JSON, un elemento per variante.LinkExtractor con pattern allow/deny, filtri per dominio, ambito CSS/XPath, filtri per estensione e canonicalizzazione - usala nei template o da sola.result.items.to_json(), to_jsonl(), to_csv() e to_xml().executable_pathcapture_xhr e tutte le risposte XHR/fetch corrispondenti che la pagina effettua durante il caricamento vengono raccolte per te come oggetti Response in response.captured_xhr - ottieni i dati API di un sito senza fare reverse-engineering delle richieste da solo.| # | Libreria | Tempo (ms) | vs Scrapling |
|---|
| 1 | Scrapling | 1.99 | 1.0x |
| 2 | Parsel/Scrapy | 2.06 | 1.035 |
| 3 | Raw Lxml | 2.56 | 1.286 |
| 4 | PyQuery | 23.98 | ~12x |
| 5 | Selectolax | 197.02 | ~99x |
| 6 | MechanicalSoup | 1545.15 | ~776.5x |
| 7 | BS4 con Lxml | 1562.1 | ~785.0x |
| 8 | BS4 con html5lib | 3412.73 | ~1714.9x |