Adaptivním selektorům se často přisuzují schopnosti úplně jiných nástrojů. U poloviny srovnání scraperů, která čtu, se tvrzení, že „přežije redesign webu“, připisuje nějakému velkému AI crawleru, který to ve skutečnosti neumí. Python knihovna, která tuhle funkci staví do popředí, je Scrapling — rychle rostoucí projekt s přibližně 68,7 tisíci hvězdičkami na GitHubu k datu 2026-07-09.
Tak jsem udělal ten jediný test, na kterém na takovém tvrzení opravdu záleží. Vytvořil jsem testovací stránku, uložil selektor a pak cílovému prvku přejmenoval třídu — přesně ten typ změny, který dokáže scraperu potichu odříznout data hned ráno po nasazení redesignu. Běžný selektor vrátil prázdný výsledek. Adaptivní shoda v Scraplingu ale prvek našla i tak. To je reálné a čísla ukážu. Co ale téměř nikdo neměří, je místo, kde se obnova zastaví — a právě tahle hranice je celé jádro téhle recenze.
Co Scrapling ve skutečnosti je

Scrapling se popisuje jako adaptivní framework pro web scraping, který zvládne „všechno od jednoho requestu až po velký crawl“. Když odložíme marketingovou větu stranou, jsou v něm nad sebou dvě vrstvy: HTTP Fetcher, který stahuje stránky, a na lxml postavený Selector, který je parsuje a nabízí klasické CSS/XPath spolu s praktickými pseudo-selektory ::text a ::attr(). Je licencovaný pod BSD-3-Clause, takže je hodně vstřícný i pro open source. Testoval jsem verzi 0.4.10, která byla v době testu aktuální — žádné „benchmarkoval jste starou verzi“ se řešit nemusí.
Zajímavá je vrstva nad parserem: adaptivní část. Představte si běžný selektor jako pevnou adresu: „vezmi prvek s třídou product-name“. Přeznačte budovu — změňte třídu — a adresa ukazuje na prázdné místo. Scrapling ale umí při jednom běhu uložit otisk prvku a při dalším běhu, až se HTML změní, ten samý prvek znovu najít podle otisku, ne podle už neplatné adresy. Podle dokumentace adaptivního scrapingu Scraplingu fáze shody porovnává podobnost napříč značkou prvku, textem, atributy, sourozenci i pozicí — bez modelu v loopu, čistě strukturálním srovnáním s tím, co bylo dřív uložené.
Je fér zmínit i původ téhle funkce, protože to mění, jak ji čtete. Adaptivní dohledání je reálná a zdokumentovaná schopnost, ne něco, co bych objevil já — vendor dokumentace přesně popisuje mechanismus uložení do SQLite a následné shody podle podobnosti a najdete k tomu i nezávislé články třetích stran. Myšlenka samoopravných selektorů navíc před Scraplingem existovala v oblasti testovací automatizace. Zvláštní na tom je hlavně to, že Scrapling ji nabízí jako nativní funkci knihovny: běžné parsery jako lxml, parsel a BeautifulSoup vám dají statické selektory, ale nic, co by se samo přemístilo na nový prvek. Jde tedy o výraznou, ale zdokumentovanou funkci, kterou jsem reprodukoval a otestoval pod zátěží — ne o schopnost, kterou by nikdo jiný neměl.
Adaptivní test podrobně

Tady je nastavení. Spustil jsem testovací katalog a sledoval produktový prvek v době, kdy měl třídu product-name. Pak jsem tu třídu přejmenoval na product-title a znovu spustil stejný kód. Prostý selektor .product-name našel 0 prvků — přesně takový prázdný výsledek, jaký čekáte, když selektor míří na třídu, která už neexistuje. Adaptivní opětovné dohledání v Scraplingu ale sledovaný prvek obnovilo pomocí otisku, který si uložilo v předchozí verzi. Surový výsledek je v benchmark repozitáři na local_adaptive_selector.json.

Vyzkoušejte Thunderbit pro extrakci webových dat

A teď část, kterou většina recenzí přeskočí. Zkoušel jsem i syntetický test s více prvky — tři sledované prvky místo jednoho. Scrapling přemístil první uložený prvek, ne všechny tři. To není selhání ani bug; dokumentace popisuje automatickou shodu jako sledování jednoho prvku podle otisku, takže výsledek 1 ze 3 při výchozím nastavení znamená, že se funkce chovala přesně tak, jak byla navržená. Zároveň to ale znamená, že přesný popis je „odolné sledování prvku“, ne „automatická obnova celé redesignované stránky“. Auto-match sleduje ten prvek, který jste mu řekli, aby sledoval. Odolnost vůči více prvkům je věc, kterou si musíte doladit sami.
Ten rozdíl je důležitější, než se na první pohled zdá. „Přežije změny v HTML“ je slogan. „Drží se jednoho otisknutého prvku i po změnách v HTML, zbytek si řešíte sami“ je skutečná schopnost, kterou kupujete. Když čekáte to první, budete zklamaní. Když čekáte to druhé, funguje to čistě.
Nastavení: tření, na které vás nikdo neupozorní
Tady jsem ztratil skutečný čas, takže to dostáváte dřív, než na to narazíte sami. pip install scrapling nainstaluje parser — a jen parser. Jakmile jsem napsal from scrapling.fetchers import Fetcher, spadlo to na řetěz chybějících závislostí: nejdřív curl_cffi, pak playwright, pak browserforge, přičemž každá další se ukázala až po vyřešení té předchozí.
Řešení je nainstalovat extra balíček: pip install "scrapling[fetchers]", případně použít CLI krok scrapling install, který stáhne kompletní HTTP i browser stack pro fetchery. Pak už vše fungovalo. Jenže sekvence „základní instalace vypadá v pořádku a při prvním fetchi exploduje“ je reálná a na první pohled vás na ni nic nepřipraví. Když si hned od začátku započítáte [fetchers] extra a jeho těžké tranzitivní závislosti, vyhnete se celé slepé uličce.
Co obstálo při čisté HTTP extrakci
Jakmile byly fetchery připravené, běžná extrakce byla pevná — recall 1.0 napříč celou sadou:
| Test | Výsledek |
|---|---|
| Statický katalog + stránkování | 12/12 produktů |
| Extrakce článku | nadpis + 3/3 odstavce |
| Dynamické JSON API | 8/8 položek |
| Books to Scrape (veřejné) | 20 produktů |
| Ošetření HTTP 500 | stav byl vystaven korektně, bez pádu |
Tady je dobře vidět podpora lxml. CSS i XPath fungují přesně tak, jak chcete, a pseudo-selektory ::text / ::attr() drží kód krátký a čitelný, místo aby z něj byl chaos vnořených volání. Případ s 500 je malý, ale výmluvný — Fetcher mi ukázal stavový kód místo toho, aby vyhodil stack trace, a to je rozdíl mezi scraperem, který můžete nasadit do provozu, a scraperem, nad kterým musíte sedět. Kompletní čísla jsou v scrapling-test-summary.json.
Nic z toho není okázalé. Je to prostě správně — a správnost je dost podceňovaná.
Co to nedělá (záměrně)

HTTP Fetcher nevykresluje JavaScript. Zkusil jsem ho na fixture se serverless/JS renderováním a dostal 0 karet zpět; stejně 0 na veřejné stránce Quotes to Scrape JS. To není vada — HTTP Fetcher stahuje HTML, neovládá prohlížeč, takže obsah renderovaný až na klientovi v době načtení prostě neexistuje. Scrapling má samostatný DynamicFetcher (na bázi prohlížeče) právě pro JS stránky. V tomhle průchodu jsem ho netestoval, takže nebudu tvrdit, jak si vede. Jen na HTTP cestu neposílejte aplikaci, která všechno vykresluje až v prohlížeči, a nečekejte, že tam obsah uvidíte.
Je tu také StealthyFetcher zaměřený na anti-detekci. To beru čistě jako compliance téma — ne jako funkci, kterou je vhodné mávat před všemi ostatními. Kde a jak smíte scrapovat, to je na vás a na vašem právním rámci; tahle recenze testovala schopnost extrakce, ne obcházení detekce. Netestoval jsem ho a nehodnotím ho.
Klady a zápory
Klady:
- Adaptivní selektory skutečně obnovily sledovaný prvek po přejmenování třídy, zatímco běžný selektor vrátil 0 — přesně ten důvod, proč po Scraplingu sáhnout.
- HTTP extrakce na statických stránkách, článcích i JSON API měla recall 1.0.
- Čisté CSS/XPath nad lxml s čitelnými pseudo-selektory
::text/::attr(). - Elegantní ošetření HTTP 500 — stav se zobrazil, aplikace nespadla.
- Testovaná verze odpovídala aktuálnímu releasu, takže nehrozí problém se zastaralou verzí.
- Vstřícná licence BSD-3-Clause, vhodná i pro komerční použití.
Zápory:
- Auto-match sleduje jeden uložený prvek, ne celou stránku — tříprvkový test obnovil jen jeden. Tvrzení je potřeba tomu přizpůsobit.
pip install scraplingnainstaluje jen parser; fetchery vyžadují[fetchers]extra a s ním i těžký řetězec závislostí, na který jsem narazil až nepříjemně pozdě.- HTTP Fetcher nevykresluje JavaScript; obsah renderovaný na klientovi potřebuje browser-backed
DynamicFetcher, který jsem zde netestoval. - Hlavní funkce odolnosti vyžaduje ruční doladění pro víceprvkové scénáře.
Pro koho je a pro koho není
Scrapling dává smysl, pokud spravujete scrapers proti webům, které se často redesignují, a už vás nebaví, že vám jedno přejmenování třídy tiše shodí celý sběr dat ze dne na den. Jestli je vaše opakovaná bolest „selektory se mi rozbíjejí každých pár týdnů a já jen chci, aby se pořád našel ten jeden důležitý prvek“, je to přesně pro vás. Funguje i jako čistý a lehký lxml extractor pro statické stránky a JSON API, i když adaptivní vrstvu vůbec nezapnete.
Očekávání je potřeba upravit — nebo se podívat jinam — ve dvou případech. Pokud čekáte, že adaptivní selektory samy opraví celou redesignovanou stránku, tak to nedělají: sledují prvky, nepřestavují layout. A pokud jsou vaše cíle silně založené na JavaScriptu a nechcete stavět browser-backed DynamicFetcher, samotná HTTP cesta vám stačit nebude. V každém případě, až to budete instalovat, přidejte [fetchers] extra už od prvního příkazu.
Kde dává smysl spravované AI scraping API
Scrapling je zdarma a open source knihovna, kterou si provozujete a udržujete sami. Vlastníte kód, řetězec závislostí i ladění — a na oplátku neplatíte za jednotlivé requesty a vše držíte u sebe. To je legitimní a pro spoustu týmů dokonce nejlepší volba.
Otázka, kterou se vyplatí položit, je, kdo vlastní problém s odolností. U Scraplingu odpověď zní: vy. Vy si děláte fingerprint prvků a ladíte tracking. Spravované AI scraping API odpovídá jinak — řešení driftu se přesouvá na server. Do téhle role zapadá Thunderbit pro technické týmy. POST /extract vrací strukturované JSON podle vámi definovaného JSON Schema, přičemž renderování, anti-bot i změny v HTML jsou absorbované na serveru; přepínač renderMode určuje, jak velká část stránky se před extrakcí vykreslí. Pro AI agenty a coding asistenty existuje Thunderbit MCP server — thunderbit_suggest_fields je zdarma a běží jako první krok pro plánování extrakce — a také CLI přes npx @thunderbit/thunderbit-cli pro terminál, skripty i CI. Ve všech třech rozhraních běží stejný AI engine.
Skutečný kompromis není lepší versus horší — je to o tom, kde chcete, aby žila logika odolnosti. Se Scraplingem ji máte ve vlastním kódu, otisknutou a naladěnou vámi, za nulové náklady na jeden request, ale nesete i údržbu, která s tím přichází. Se spravovaným API předáte řešení driftu dál a platíte za request. Malý self-hosted stack a chcete mít ladění ve vlastních rukou? Kontrola, kterou Scrapling dává, je správná odpověď. Potřebujete škálovat na stovky webů a nechcete hlídat otisky selektorů na každém z nich? Spravovaná varianta vám tuhle údržbu smaže ze seznamu problémů.
Pokud srovnáváte trh, full open-source scraper benchmark staví Scrapling vedle dalších nástrojů na stejných testovacích sadách a recenze Scrapy a recenze Colly pokrývají další dva HTTP-first frameworky, které stojí za pozornost.
Verdikt
Má cenu Scrapling používat? Ano — pokud chcete open-source Python extractor, jehož hlavní trik spočívá v tom, že udrží sledovaný prvek dohledatelný i poté, co se pod ním změní HTML, a zároveň chápete, co přesně ta funkce umí a neumí. Obnovil prvek, který rozbitý selektor už nenašel, a to po přejmenování, které by běžnému scraperu potichu sebralo data. Čistá HTTP extrakce je solidní a na všech testovacích sadách dosáhla plného recallu. Licence je vstřícná a verze, kterou jsem testoval, byla aktuální.
Jen si tu schopnost vyložte správně a budete spokojení. Sleduje prvky, neobnovuje celé stránky — ve tříprvkovém testu obnovil jeden. Nainstalujte [fetchers] extra hned od začátku, jinak narazíte na závislostní zeď stejně jako já. A pokud vaše stránky potřebují JavaScript, tohle je úkol pro browser-backed fetcher, ne pro HTTP cestu. V těchto mezích Scrapling dělá přesně tu jednu věc, pro kterou je známý, a mezi Python scraping knihovnami je to ta, která tu funkcionalitu, kterou si lidé pořád pletou s jinými nástroji, opravdu dodává.
Vyzkoušejte Thunderbit pro extrakci webových dat Get Started Free
Časté dotazy
Přežijí adaptivní selektory Scraplingu opravdu redesign webu?
Přežijí přejmenování třídy u sledovaného prvku — to bylo v testu ověřeno. Když jsem přejmenoval product-name na product-title, běžný selektor našel 0 prvků, zatímco adaptivní opětovné dohledání obnovilo sledovaný prvek. Jenže sledují uložené prvky, ne přestavují celou stránku: ve syntetickém testu se třemi prvky se obnovil jeden. Berte je tedy jako odolné sledování prvku, ne automatickou obnovu celé stránky.
Proč pip install scrapling selže, když importuji fetcher?
Protože základní instalace obsahuje jen parser. Import scrapling.fetchers spustí řetězec chybějících závislostí — nejdřív curl_cffi, pak playwright, pak browserforge. Spusťte pip install "scrapling[fetchers]" (nebo CLI scrapling install), aby se stáhl celý fetcher stack, a import začne fungovat.
Umí Scrapling scrapovat stránky renderované v JavaScriptu?
Ne s HTTP Fetcherem — na JS fixture i na veřejné stránce Quotes JS vrátil 0, protože stahuje HTML bez spuštění prohlížeče. Scrapling má samostatný browser-backed DynamicFetcher pro JS stránky, ale tenhle test ho nezahrnoval, takže k jeho výkonu se zatím nevyjadřuji.
Je Scrapling rychlý a přesný pro běžnou extrakci? V testu byl přesný — recall 1.0 na statických katalozích, stránkách článků i JSON API, a CSS/XPath nad lxml fungovalo čistě. Zvládl i HTTP 500 tím, že ukázal stav místo pádu. Pokud se adaptivní vrstvě vůbec nevěnujete, pořád jde o solidní a lehký extractor pro statický obsah.
Je Scrapling zdarma pro komerční použití? Ano, je pod licencí BSD-3-Clause, která je velmi vstřícná i pro komerční projekty. Jako vždy si před nasazením ověřte aktuální licenci v repozitáři.


