
🕷️ 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 dei proxy · CLI · MCP
Scrapling è un framework di Web Scraping adattivo che gestisce tutto, da una singola richiesta a un crawl 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 per spider ti consente di scalare fino a crawl concorrenti e multi-sessione, con pausa/ripresa e rotazione automatica dei proxy: il tutto in poche righe di Python. Una sola libreria, zero compromessi.
Crawl fulminei con statistiche in tempo reale e streaming. Creato da chi fa scraping per chi fa scraping e per gli 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!
Oppure scalare fino a crawl 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 asincrone 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) quando il sito inizia a bloccare o limitare il traffico, 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 Google Chrome.StealthyFetcher e spoofing dell'impronta digitale. Può bypassare facilmente tutti i tipi di Turnstile/Interstitial di Cloudflare con l'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 del proxy per singola richiesta.cdp_url, sia sulla stessa macchina, su un altro host o tramite un provider di browser gestiti. Puoi anche puntare qualsiasi browser fetcher alla tua build di Chromium con .scrapling_response per analizzare le risposte che recuperi già con il parser di Scrapling, senza bisogno di riscrittura.Diamo una rapida occhiata a ciò che Scrapling può fare senza scendere troppo in profondità.
Richieste HTTP con supporto alle sessioni```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()
Automazione completa 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()
### Spider
Costruisci crawler completi con richieste concorrenti, più tipi di sessione e 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
Metti in pausa e riprendi lunghe scansioni con checkpoint eseguendo lo spider in questo modo:```python
QuotesSpider(crawldir="./crawl_data").start()
Premi Ctrl+C per sospendere in modo pulito: i progressi vengono salvati automaticamente. In seguito, quando avvii di nuovo lo spider, passa lo stesso crawldir e riprenderà da dove si era interrotto.
Oppure salta del tutto la scrittura della logica di crawling con i template 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
### Parsing e Navigazione Avanzati```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 di Web Scraping```bash scrapling shell
Estrae 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 l'interattiva Web Scraping Shell. Consulta la documentazione completa qui
Scrapling non è solo potente: è anche estremamente veloce. I seguenti benchmark confrontano il parser di Scrapling con le versioni più recenti 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 la media di oltre 100 esecuzioni. Vedi 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 dipendenze 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 dei fetcher o spider, installa prima le dipendenze dei fetcher come mostrato di seguito.
### Dipendenze opzionali
1. Se hai intenzione di utilizzare una delle funzionalità extra qui sotto, i fetcher o le loro classi, dovrai installare le dipendenze dei fetcher e le relative dipendenze del browser come segue:
```bash
pip install "scrapling[fetchers]"
scrapling install # normal install
scrapling install --force # force reinstall
```
Questo scarica tutti i browser, insieme alle loro dipendenze di sistema e alle dipendenze di manipolazione delle fingerprint.
Oppure puoi installarle dal codice invece di eseguire un comando come questo:
```python
from scrapling.cli import install
install([], standalone_mode=False) # normal install
install(["--force"], standalone_mode=False) # force reinstall
```
2. Funzionalità extra:
- Installa la funzionalità server MCP:
```bash
pip install "scrapling[ai]"
```
- Installa le funzionalità della shell (la shell 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 installazioni extra (se non l'hai già fatto).
### Docker
Puoi anche installare un'immagine Docker con tutte le estensioni 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 utilizzando GitHub Actions e il branch principale del repository.
## Contributi
Accogliamo con piacere i contributi! Prima di iniziare, ti preghiamo di leggere le nostre [linee guida per i contributi](https://github.com/D4Vinci/Scrapling/blob/main/CONTRIBUTING.md).
## Disclaimer
> [!CAUTION]
> Questa libreria è fornita esclusivamente a scopo didattico e di ricerca. Utilizzando questa libreria, accetti di rispettare le leggi locali e internazionali sul data scraping e sulla privacy. Gli autori e i contributori non sono responsabili per 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!}
}
Quest'opera è concessa in licenza ai sensi della BSD-3-Clause License.
Questo progetto include codice adattato da:
| NodeMaven - fornitore di proxy affidabile con IP della massima qualità sul mercato. Usa il codice promozionale SCRAPLING35 per uno sconto del 35% sui proxy. |
| Proxidize offre 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 da datacenter per uno scraping web stabile, la raccolta di dati pubblici e test con targeting geografico 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 195+ località, prezzi equi e supporto reale. Prova il nostro gioco FlappyBird sulla landing page per ottenere dati gratuiti! |
|
Evomi
: proxy residenziali da $0.49/GB. Browser di scraping con Chromium completamente spoffato, IP residenziali, risoluzione automatica dei CAPTCHA e bypass anti-bot. API Scraper per risultati senza intoppi. Sono disponibili integrazioni MCP e N8N. |
|
TikHub.io offre 900+ API stabili su 16+ piattaforme, tra cui TikTok, X, YouTube e Instagram, con 40M+ dataset. Offre anche modelli AI SCONTATI - Claude, GPT, GEMINI e altri fino al 71% di sconto. |
|
Chiudi il laptop. I tuoi scraper continuano a girare. PetroSky VPS - server cloud progettati per un'automazione senza interruzioni. Macchine Windows e Linux con controllo completo. A partire 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 80M+ IP in oltre 195 paesi, garantendo connessioni veloci e affidabili, rotazione automatica e una solida resistenza al blocco. Prova gratuita disponibile. |
| CoreClaw fornisce API di dati web per agenti AI. Accedi a dati strutturati da Google Maps, LinkedIn, Instagram, YouTube, Amazon e altro. |
Crawl-delayRequest-rateparse() senza dover colpire nuovamente i server di destinazione.CrawlSpider per il follow dei link basato su regole, SitemapSpider per i 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 di 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 with Lxml | 1562.1 | ~785.0x |
| 8 | BS4 with html5lib | 3412.73 | ~1714.9x |