Scrapling
A Python scraping framework with fetchers, a browser, spiders, an MCP server and elements that try to keep working after a site's layout changes.
- Safe
- 4/5
- Works
- 4/5
- Worth it
- 4/5
What we tested
- Static review of the source (commit 30cadb5): no install hooks, no hidden network calls, MCP server is local-only by default and asks for a token in HTTP mode
- Version 0.5.1 in Docker, as a non-root user, on a throwaway server
- Adaptive tracking: scrape 5 products from our own page, redesign the page completely, scrape again with the old selectors
- Three jobs on toscrape.com, sites built for scraping practice: 20 books, 30 quotes over 3 pages, and a JavaScript-only page
- What we did not test: the bot-protection bypass, on anyone's site
What happened
The plain fetching is excellent. Twenty books in 0.4 seconds, thirty quotes across three pages in under a second. On the JavaScript-only page, a normal HTTP request saw 0 quotes; the built-in browser saw all 10 in 3 seconds.
The headline feature is “adaptive” scraping: save what an element looks like, and when the site is redesigned, find it again without new selectors. We built two versions of the same shop page. Version 2 renamed every class and changed the structure. With the old selectors, a normal scraper finds 0 of 15 fields on version 2.
Scrapling found 10 of 15:
- Product names: 5 of 5.
- Prices: 5 of 5, even though “$89.00” became “USD 89.00”.
- Ratings: 0 of 5. Four times it said it found nothing above its 40% similarity threshold, which is fine. Once it returned a wrong value without any warning: another product’s price instead of the rating.
That last one is the reason for “use with care”. A scraper that says “not found” is easy to handle. A scraper that quietly returns the wrong number ends up in your spreadsheet.
Two things to know before you install it
- Adaptive data location. By default it saves its adaptive data next to the installed package. As a normal (non-root) user that folder isn’t writable and you get a database error on the first request. Point it somewhere writable with
storage_args={"storage_file": "..."}. - Version 0.5 renamed things. Older tutorials use
DynamicFetcher; in 0.5.x the browser fetcher isStealthyFetcher.
Who should use it
Use it for fetching and parsing, including JavaScript pages. Use adaptive tracking as a helper, not as truth: check the values it relocates before you trust them. We did not test the bot-protection bypass, and we won’t on sites we don’t own.