$ -weight: 500;">pip -weight: 500;">install scrapling[fetchers,ai] # HTTP + Chromium + MCP server
scrapling -weight: 500;">install # Downloads Playwright browsers
-weight: 500;">pip -weight: 500;">install scrapling[fetchers,ai] # HTTP + Chromium + MCP server
scrapling -weight: 500;">install # Downloads Playwright browsers
-weight: 500;">pip -weight: 500;">install scrapling[fetchers,ai] # HTTP + Chromium + MCP server
scrapling -weight: 500;">install # Downloads Playwright browsers
from scrapling.fetchers import Fetcher page = Fetcher.get('https://quotes.toscrape.com/', timeout=15)
quotes = page.css('.quote .text::text').getall()
# 0.88s, 200 OK, 10 quotes parsed
# Memory: 56MB RSS
from scrapling.fetchers import Fetcher page = Fetcher.get('https://quotes.toscrape.com/', timeout=15)
quotes = page.css('.quote .text::text').getall()
# 0.88s, 200 OK, 10 quotes parsed
# Memory: 56MB RSS
from scrapling.fetchers import Fetcher page = Fetcher.get('https://quotes.toscrape.com/', timeout=15)
quotes = page.css('.quote .text::text').getall()
# 0.88s, 200 OK, 10 quotes parsed
# Memory: 56MB RSS
# ❌ Don't do this in a loop
for url in urls: page = StealthyFetcher.fetch(url) # New browser every time # ✅ Do this instead
session_id = open_session(type="dynamic")
for url in urls: page = fetch(url, session_id=session_id) # Reuses same browser
close_session(session_id)
# ❌ Don't do this in a loop
for url in urls: page = StealthyFetcher.fetch(url) # New browser every time # ✅ Do this instead
session_id = open_session(type="dynamic")
for url in urls: page = fetch(url, session_id=session_id) # Reuses same browser
close_session(session_id)
# ❌ Don't do this in a loop
for url in urls: page = StealthyFetcher.fetch(url) # New browser every time # ✅ Do this instead
session_id = open_session(type="dynamic")
for url in urls: page = fetch(url, session_id=session_id) # Reuses same browser
close_session(session_id)
-weight: 500;">pip -weight: 500;">install camoufox
python -m camoufox fetch # Downloads the browser binary (~713MB)
-weight: 500;">pip -weight: 500;">install camoufox
python -m camoufox fetch # Downloads the browser binary (~713MB)
-weight: 500;">pip -weight: 500;">install camoufox
python -m camoufox fetch # Downloads the browser binary (~713MB)
from camoufox import Camoufox
from scrapling import Selector # Camoufox: stealth browsing with Firefox fingerprint (81MB)
with Camoufox(headless=True) as browser: page = browser.new_page() page.goto('https://target.com') html = page.content() # Scrapling: adaptive parsing with CSS/XPath
sel = Selector(html)
data = sel.css('.product::text').getall()
from camoufox import Camoufox
from scrapling import Selector # Camoufox: stealth browsing with Firefox fingerprint (81MB)
with Camoufox(headless=True) as browser: page = browser.new_page() page.goto('https://target.com') html = page.content() # Scrapling: adaptive parsing with CSS/XPath
sel = Selector(html)
data = sel.css('.product::text').getall()
from camoufox import Camoufox
from scrapling import Selector # Camoufox: stealth browsing with Firefox fingerprint (81MB)
with Camoufox(headless=True) as browser: page = browser.new_page() page.goto('https://target.com') html = page.content() # Scrapling: adaptive parsing with CSS/XPath
sel = Selector(html)
data = sel.css('.product::text').getall()
Priority 1: Fetcher (HTTP) 0.77s ~0 MB Static pages ↓ page is empty / JS-rendered?
Priority 3: DynamicFetcher (Chromium) 3.66s 180 MB JS-rendered SPAs ↓ blocked by anti-bot?
Priority 4: StealthyFetcher (Chromium) ~4s 120 MB Cloudflare, basic WAF ↓ Chromium itself blocked?
Priority 5: Camoufox (Firefox) 8.84s 81 MB Firefox fingerprint ↓ CAPTCHA / aggressive WAF?
Priority 6: Firecrawl enhanced proxy ~3-5s credits Hard targets
Priority 1: Fetcher (HTTP) 0.77s ~0 MB Static pages ↓ page is empty / JS-rendered?
Priority 3: DynamicFetcher (Chromium) 3.66s 180 MB JS-rendered SPAs ↓ blocked by anti-bot?
Priority 4: StealthyFetcher (Chromium) ~4s 120 MB Cloudflare, basic WAF ↓ Chromium itself blocked?
Priority 5: Camoufox (Firefox) 8.84s 81 MB Firefox fingerprint ↓ CAPTCHA / aggressive WAF?
Priority 6: Firecrawl enhanced proxy ~3-5s credits Hard targets
Priority 1: Fetcher (HTTP) 0.77s ~0 MB Static pages ↓ page is empty / JS-rendered?
Priority 3: DynamicFetcher (Chromium) 3.66s 180 MB JS-rendered SPAs ↓ blocked by anti-bot?
Priority 4: StealthyFetcher (Chromium) ~4s 120 MB Cloudflare, basic WAF ↓ Chromium itself blocked?
Priority 5: Camoufox (Firefox) 8.84s 81 MB Firefox fingerprint ↓ CAPTCHA / aggressive WAF?
Priority 6: Firecrawl enhanced proxy ~3-5s credits Hard targets
Priority 1: Scrapling Fetcher (HTTP) 0.77s $0
Priority 3: Scrapling DynamicFetcher 3.66s $0
Priority 4: Scrapling StealthyFetcher ~4s $0
Priority 5: Camoufox + Scrapling Selector 8.84s $0
Priority 6: Firecrawl enhanced proxy ~3-5s credits
Priority 1: Scrapling Fetcher (HTTP) 0.77s $0
Priority 3: Scrapling DynamicFetcher 3.66s $0
Priority 4: Scrapling StealthyFetcher ~4s $0
Priority 5: Camoufox + Scrapling Selector 8.84s $0
Priority 6: Firecrawl enhanced proxy ~3-5s credits
Priority 1: Scrapling Fetcher (HTTP) 0.77s $0
Priority 3: Scrapling DynamicFetcher 3.66s $0
Priority 4: Scrapling StealthyFetcher ~4s $0
Priority 5: Camoufox + Scrapling Selector 8.84s $0
Priority 6: Firecrawl enhanced proxy ~3-5s credits - Adaptive element tracking — saves fingerprints of targeted elements and relocates them after site redesigns using similarity scoring. Your scrapers survive CSS changes without maintenance.
- Three fetchers, one API — HTTP (Fetcher, curl_cffi), browser (DynamicFetcher, Playwright Chromium), and stealth (StealthyFetcher, Chromium + anti-bot patches). Swap with one line.
- Spider framework — Scrapy-like API with async, concurrent crawling, Ctrl+C pause/resume via checkpoint persistence, multi-session support.
- MCP server — 14 tools exposed natively for AI coding agents. Your agent can call mcp_scrapling_get, mcp_scrapling_fetch, mcp_scrapling_stealthy_fetch directly. - Tier 1 correctly failed — Lazada is JS-rendered, raw HTML is empty. No time wasted.
- Tier 3 succeeded on all 3 pages at ~3s each. No IP ban, no reCAPTCHA. Different outcome from the May test where StealthyFetcher was banned on page 3 — either Lazada relaxed detection or DynamicFetcher's lighter fingerprint helps.
- Tier 5 worked but was never needed — 42s vs 3s confirms it belongs at the bottom. - Installation is the first test. Read the docs before -weight: 500;">pip -weight: 500;">install. Know what each dependency costs in RAM. Skip what you don't need — you can always add it later.
- The 1.4GB Camoufox story was user error. Spawning browsers in a loop without sessions will eat any machine. With persistent sessions, Camoufox is the lightest browser in the stack at 81MB. Don't believe benchmark threads — run your own.
- Speed differences compound silently. 0.77s vs 8.84s is nothing for one page. For 100 pages, it's 77 seconds vs nearly 15 minutes. Choosing the right tier pays off exponentially.
- Fingerprint diversity is a superpower. Having both Chromium and Firefox in your arsenal means you can bypass sites that target either. Camoufox is slow but it's a different shape entirely — and sometimes that's all you need.
- Wire the ladder, not the tools. Individual tools leave you guessing. A priority ladder gives you a protocol: -weight: 500;">start cheap, escalate on failure. Encode it as an agent skill and you never have to think about it again.
- Scrapling is the platform, not just a fetcher. Adaptive element tracking, three-tier architecture, spider framework with pause/resume, MCP server for AI agents — it's the foundation everything else plugs into. The benchmarks measure its fetchers, but the framework is what makes them interchangeable.