CLI tool
D4Vinci/Scrapling avatar
D4Vinci/Scrapling

Scrapling: An Adaptive Scraping Framework That Survives Website Redesigns

An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!

81,121 stars8,199 forksPythonBSD-3-Clause

At a glance

What is it?
Scrapling is a Python framework that combines a self-healing CSS selector engine, anti-bot fetchers, and a concurrent spider system. It targets scraper maintainers tired of fixing broken selectors after every site update.
Who is it for?
Adopt Scrapling if you maintain scrapers that break when target sites change their HTML, or if you need a single library that spans simple requests, browser-based fetches, and full crawls. Skip it if you prefer a minimal, dependency-light scraper or if your targets use enterprise bot protection like Akamai or DataDome, which Scrapling does not claim to bypass.
Can I use it commercially?
Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The Problem: Scrapers Break When Websites Change

Every scraper maintainer knows the cycle: you write a CSS selector, it works for months, then the site ships a redesign and your pipeline silently returns empty lists. Scrapling addresses this specific failure mode. Its parser learns from website changes and automatically relocates your elements when pages update. That is the core promise in the README. The framework is built for two audiences: developers who run a few targeted scrapes and teams that need full-scale concurrent crawls. The README claims it handles everything from a single request to a full-scale crawl, and the architecture reflects that range. If your pain is selector fragility, not just raw fetching speed, this library targets you directly.

Adaptive Selection: How the Parser Relocates Elements

The adaptive mechanism is the most distinctive part of Scrapling. The README shows two usage modes. First, you save a baseline with `p.css('.product', auto_save=True)`. Later, when the site structure changes, you pass `adaptive=True` to the same selector call. The parser then uses the previously saved structure to locate the elements in the new HTML. This is not a fuzzy match on class names. It is a learned representation of the element's context, saved from the first successful scrape. The documentation describes it as the parser learning from website changes. The implication is that the first run must succeed and be saved, so you cannot use adaptive mode on a brand-new target without a prior baseline. That is a real constraint: the feature requires a history, so it is useless for one-off scrapes.

Fetchers and Anti-Bot Handling

Scrapling ships four fetchers in a single import line: `Fetcher`, `AsyncFetcher`, `StealthyFetcher`, and `DynamicFetcher`. The README highlights `StealthyFetcher` with `adaptive = True` and claims it bypasses anti-bot systems like Cloudflare Turnstile out of the box. The example sets `headless=True` and `network_idle=True`, which suggests it waits for network activity to settle before returning the page. This is a browser-based fetcher, not a plain HTTP client. The README also mentions a Docker image and a CLI, so you can run it in a container for isolation. The anti-bot claim is bold, and the README is honest about its limits: it names Cloudflare Turnstile specifically, but for Akamai, DataDome, Kasada, and Incapsula, it points to a commercial API partner. So Scrapling does not claim universal bypass. If your target uses enterprise-grade protection, you will need an external service.

The Spider Framework: Concurrency, Pause, and Proxy Rotation

For full crawls, Scrapling provides a `Spider` class. The README example defines a subclass with `name`, `start_urls`, and an async `parse` method that yields dictionaries. Calling `MySpider().start()` runs the crawl. The documentation sections cover architecture, proxy rotation, and a feature set that includes pause/resume and adaptive crawl speed. The README says the crawl speed adapts to how fast each website responds and backs off when it starts blocking you. That is a meaningful design choice: instead of a fixed request rate, the spider adjusts dynamically. This is useful for politeness and for avoiding IP bans. The framework also supports multi-session concurrency, which means you can run parallel sessions with different identities or proxies. The spider system is where Scrapling moves beyond a simple scraper library into a full crawl orchestration tool.

Getting Started: Commands and Configuration

The README does not show a pip install command, but the project is on PyPI, so `pip install scrapling` is the standard path. The import line `from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher` works after installation. The adaptive feature requires two calls: first with `auto_save=True`, then later with `adaptive=True`. For the spider, you subclass `Spider` and override `parse`. The documentation mentions a CLI and an MCP server, both of which are separate entry points. The README also references a Docker image at `pyd4vinci/scrapling`, which is useful if you want to avoid installing browser dependencies locally. Configuration is mostly in code, not in a config file. There is no YAML or JSON config shown, so you manage settings through Python arguments and class attributes.

Limitations and Wrong Use Cases

The most obvious limitation is that adaptive selection requires a saved baseline, so it cannot help with a brand-new site. Another is the anti-bot scope: Scrapling handles Cloudflare Turnstile, but the README explicitly routes Akamai, DataDome, Kasada, and Incapsula to a paid API partner. If your scraping targets are behind those protections, Scrapling alone will not suffice. The framework is also Python-only, so it is not a fit for non-Python teams. The browser-based fetchers likely have a heavier resource footprint than a plain HTTP client, which matters for large-scale crawls. The README does not mention rate limiting as a built-in feature beyond the adaptive speed, so you may need to implement your own domain-specific throttling. Finally, the project is under active development with frequent releases, so API stability is not guaranteed; you should pin versions.

Alternatives and How They Differ

The most direct alternative is Selectolax, a Python binding to the Lexbor HTML parser. Selectolax is fast and lightweight, but it is only a parser: it has no fetchers, no anti-bot handling, and no adaptive learning. You would pair it with a separate HTTP client like httpx or requests. Another alternative is Scrapy, a mature crawling framework with built-in middleware for retries, redirects, and extensions. Scrapy has a large ecosystem and is not adaptive; its selectors are static, and you must handle site changes yourself. Scrapling's differentiator is the adaptive selector engine and the integrated fetchers. Scrapy gives you more control over middleware and pipelines, but Scrapling aims to reduce maintenance overhead. If you already have a Scrapy pipeline and your selectors rarely change, switching may not be worth it. If selector breakage is your top cost, Scrapling's approach is the one that directly addresses that.

Maintenance, License, and Upgrade Considerations

Scrapling is licensed under BSD-3-Clause, which is permissive and allows commercial use with attribution. The project is not archived, and the last push was August 2026 with releases v0.4.13 through v0.4.15 in quick succession. That cadence suggests active maintenance, but it also means you should expect API changes between minor versions. The README mentions an MCP server and an AI agent skill, which are newer additions and may be less stable than the core fetchers. The documentation is hosted on Read the Docs, and there is a Discord and an X account for support. For upgrades, you should read the changelog for each release, because the adaptive feature's saved data format could change. The project also has a Docker image, so you can test new versions in a container before deploying to production.

Editorial conclusion

Adopt Scrapling if you maintain scrapers that break when target sites change their HTML, or if you need a single library that spans simple requests, browser-based fetches, and full crawls. Skip it if you prefer a minimal, dependency-light scraper or if your targets use enterprise bot protection like Akamai or DataDome, which Scrapling does not claim to bypass. Before committing, verify that your Python version is supported, test the adaptive selector feature on a staging copy of your target site, and confirm that the proxy rotation and pause/resume features match your crawl volume. The project is under active development with regular releases, so pin your version and re-test after upgrades.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Community notes

Community notes