Jak jsem použil 20 AI agentů k extrakci dat z 1 700 webů autoškol
Příběh metody Ralph — flotila paralelních Claude Code sessions, které autonomně crawlovaly, extrahovaly a validovaly každou autoškolu v Česku.
Když stavíte největší srovnávač autoškol v zemi, potřebujete data. Hodně dat. A český trh autoškol vám to zrovna neulehčí — ceníky pohřbené v PDF, kontakty roztroušené po špatně postavených webech a žádný standardizovaný formát na cokoliv.
Takhle jsem ten problém vyřešil pomocí AI agentů v měřítku, které jsem jako sólo zakladatel neviděl nikde jinde.
Problém
Kvalty.cz potřebovalo kompletní data o každé autoškole v Česku: názvy, adresy, kontakty, ceníky pro každý typ kurzu, kategorie řidičáků, volba převodovky, splátkové kalendáře, otevírací doby, hodnocení na Google Maps — celkový obraz.
Bylo tu ~1 700 škol. Každá s jiným webem (pokud ho vůbec měla). Některé měly moderní React weby. Některé statické HTML z roku 2008. Některé měly celý ceník v PDF ke stažení. Některé ho měly rozházený přes 5 různých podstránek.
Žádné API. Žádný standardní formát. Jen chaos.
Fáze 1: Discovery
Nejdřív jsem potřeboval najít všechny školy. Agregoval jsem data z veřejně dostupných obchodních rejstříků a registrů, křížově je porovnával s Google Maps pro hodnocení, geokódování a mapování regionů. Česká IČO sloužila jako primární klíč pro párování, což nám dalo 99,6% úspěšnost.
Tím jsme získali kostru. Ale kostry nemají ceníky.
Fáze 2: Metoda Ralph
Tady to začíná být zajímavé.
Potřeboval jsem navštívit web každé jednotlivé školy, najít jejich stránku s ceníkem, extrahovat strukturovaná data z jakéhokoliv formátu, validovat je oproti Google Maps, napsat popisy a všechno přeložit. Pro 1 700 škol.
Ručně by to trvalo měsíce. Jednoduchým scraperem by to nešlo — formáty byly příliš rozmanité, příliš chaotické, příliš „čitelné jen pro lidi”.
Tak jsem vybudoval to, čemu říkám metoda Ralph: flotilu 20 paralelních Claude Code (Anthropic CLI) sessions, z nichž každá běžela jako autonomní validační agent.
Proč „Ralph”?
Název pochází od Ralpha Wigguma — postavy ze Simpsonů, která je blaženě mimo, ale nějak to vždycky zvládne. Agenti mi ho při testování připomínali. Narazili na web autoškoly, který byl jen Facebook stránka s telefonním číslem v biu, a svědomitě nahlásili: „Obsah webu extrahován. Ceník: nenalezen. Popis: tato škola má přítomnost na sociálních sítích.” Technicky správně, roztomile naivní. Název zůstal.
Architektura
Orchestrační skript (Python + Bash) rozdělí 1 700 škol do 20 dávek. Každý worker spustí izolovanou Claude Code session přes GNU screen s vlastním 826řádkovým promptem (PROMPT.md), který přesně popisuje, co má agent dělat.
Každá Claude instance má přístup k:
WebFetchpro crawlování webů- Nástrojům souborového systému (
Read/Write/Edit) pro správu datových souborů Bashpro spouštění pomocných skriptů- Nástrojům pro správu úkolů pro sledování postupu
Klíčové: git push/commit je explicitně zakázán. Agenti dělají práci, ale člověk recenzuje každou změnu, než se dotkne databáze.
Uvnitř 826řádkového promptu
PROMPT.md je mozek celé operace. Tady je reprezentativní výsek instrukcí pro agenta:
## Pricing Extraction Rules
When extracting pricing, you MUST:
- Match each found price to an existing service in the database using semantic matching
- "Řidičské oprávnění skupiny B" → maps to category "License B - Car"
- "Kondičné jízdy" → maps to category "Refresher Driving Lessons"
- "Výcvik na automat" → maps to "License B - Car (Automatic)"
- NEVER create new service categories — only match to existing ones
- If a price includes VAT info, extract both with-VAT and without-VAT amounts
- If pricing is "od 15 000 Kč" (from 15,000 CZK), mark as minimum price, not fixed
- Currency is ALWAYS CZK. If you see EUR, convert at the rate in config.json
Sémantické párování bylo klíčové. České autoškoly popisují stejnou službu desítkami způsobů. „Řidičské oprávnění skupiny B,” „Řidičák na auto,” „Výcvik sk. B,” „Autoškola B” — všechno znamená totéž: řidičák skupiny B na osobák. Prompt obsahuje ~60 takových příkladů mapování, aby agent zvládl variace bez toho, aby si halucinoval nové kategorie.
Další sekce promptu pokrývají: jak ošetřit vícestránkové ceníky (následovat všechny odkazy, které vypadají jako podstránky s cenami), jak psát popisy na různých úrovních kvality podle Google hodnocení školy, jak označit podezřelá data pro lidský review a přísná pravidla o tom, co je „nemá web” versus „web existuje, ale nemá užitečný obsah”.
Co každý agent dělá (autonomně)
Pro každou školu agent:
- Najde další neúplný úkol přes
find-next-task.py - Přečte snapshot databáze (
input.json) a pracovní kopii (output.json) - Spustí vyhledávání na Google Maps → získá hodnocení, place_id, CID, ověřenou adresu, otevírací hodiny
- Proleze celý web školy — statické stránky přes WebFetch, JavaScript-heavy weby (Wix, React, Vue) přes
js-site-extractor.py(na bázi Playwright), PDF přespdf-parser.py - Extrahuje všechny ceny — kurzy, služby, poplatky, se sémantickým párováním k existujícím záznamům v databázi. Ošetřuje typy řidičáků (A, B, C, D, T…), převodovky (manuál/automat), hodiny výuky, splátkové kalendáře
- Napíše dva popisy pro každou školu — jeden faktický, jeden optimalizovaný pro SEO. S tónovými úrovněmi podle hodnocení: 4,5+ hvězd = nadšený, pod 3,5 = neutrální
- Přeloží všechno čeština → angličtina
- Validuje oproti Pydantic schématu (
validate-output.py) - Vytvoří
VALIDATION-SUMMARY.mddokumentující každou provedenou změnu - Označí úkol jako dokončený a zastaví se — jedna škola na spuštění, žádné riziko překryvu
Školy, které rozbily všechno
Z 1 700 škol byla většina bezproblémová. Ale pár edge cases málem rozbilo celý pipeline:
Wix s infinite scrollem. Jedna škola v Brně postavila celý web na Wix s cenami zobrazenými jako scrollovatelná sekce „služby”, která se načítala dynamicky při scrollování dolů. Nástroj WebFetch zachytil úvodní HTML — které neobsahovalo žádné ceny. Playwright js-site-extractor.py zachytil první viewport po scrollu, kde se zobrazovaly jen kurzy na motorku. Ceny za auto? Načetly se až po 3 scroll eventech. Musel jsem přidat scroll-to-bottom chování do JS extraktoru specificky pro Wix lazy-loading patterny. Jedna škola, jedna custom oprava.
PDF bez textové vrstvy. Škola na jižní Moravě měla celou tabulku s cenami v naskenovaném PDF — obrázek vytištěného dokumentu. Žádný vybíratelný text. pdf-parser.py nic nedostal. OCR by fungovalo, ale nebylo v pipeline (přidávat Tesseract ke 20 paralelním agentům se nevyplatilo kvůli složitosti pro méně než 10 škol). Tyto se označily pro manuální extrakci. Ty ceny jsem vyťukal ručně. Někdy je starý způsob jediný způsob.
Migrace URL uprostřed crawlu. Tři týdny do 32denního běhu se škola v Plzni rozhodla předělat web. Nová struktura domény, staré URL vracely 404. Agent svědomitě nahlásil „web se zdá být offline.” Ale škola nebyla offline — jen přesunuli /cenik na /sluzby/cenik-autoskoly. Monitory changedetection.io to zachytily později, ale během dávkového běhu se pro tuhle školu vrátila prázdná data a musel jsem ji ručně znovu zařadit.
Tyhle edge cases představují asi 3-4 % všech škol. Ale spotřebovaly asi 20 % mého času. Dlouhý ocas webové podivnosti je to místo, kde automatizace selhává a přichází lidský úsudek.
Náklady
Tady je matematika, která to celé umožnila.
Všech 20 agentů běželo na Claude Code s Haiku — nejrychlejším a nejlevnějším modelem Anthropicu. Pro 1 639 škol za ~32 dní přišly celkové API náklady zhruba na 0,15–0,25 $ za školu. Řekněme ~300 $ za celou zemi.
Pro srovnání: najmout manuální zadavatele dat, kteří by navštívili 1 700 webů, extrahovali ceníky, ověřili je oproti Google Maps, napsali popisy a přeložili? I za pouhé 3-5 $ za školu (což je konzervativní odhad pro kvalitní dvojjazyčnou práci), to je 5 000–8 500 $. A trvalo by to týmu lidí týdny, s nevyhnutelnými nekonzistencemi mezi zpracovateli.
Metoda Ralph stála zhruba 5 % manuální alternativy a produkovala konzistentnější výstup, protože každou školu zpracoval stejný prompt se stejnými pravidly.
Infrastrukturní náklady byly zanedbatelné — orchestrátor běžel na mém lokálním stroji. Playwright instance pro JS-heavy weby byly nejnáročnější část, ale 20 headless Chrome tabů na MacBooku Pro je zvládnutelné.
Výsledky
Za ~32 dní (leden–únor 2026):
- 1 639 z 1 640 škol validováno (~99,9 %)
- ~80 % mělo přidané nové položky ceníku
- ~40 % mělo opravené adresy díky křížové kontrole s Google Maps
- 100 % dostalo přepsané čerstvé popisy
Tohle všechno běželo na Claude Code Haiku pro nákladovou efektivitu.
Fáze 3: Udržování aktuálnosti
Školy mění ceny. Weby se aktualizují. Nemůžete extrahovat jednou a prohlásit to za hotové.
Metoda Ralph zvládá i průběžné aktualizace. changedetection.io s headless Chrome monitoruje stránku s cenami každé školy denně. Když je detekována změna, Ralph agenti porovnají aktuální data z webu s tím, co už je v databázi, extrahují rozdíly a vytvoří návrh aktualizace pro lidský review.
Stejný autonomní workflow, stejná důkladnost validace — jen běží průběžně místo jako jednorázová dávka. Agenti už znají existující data školy, takže dokážou inteligentně porovnat, co se změnilo, místo aby znovu extrahovali všechno od nuly.
Širší kontext
Před rokem tato data neexistovala v žádné strukturované, porovnatelné formě. Ceníky autoškol v Česku byly zamčené v PDF, pohřbené v patičkách webů a zásadně neprůhledné.
Teď je to všechno na jednom místě: vyhledatelné, filtrovatelné, porovnatelné. A automaticky se udržuje aktuální.
Metoda Ralph potvrdila něco, co jsem tušil delší dobu: AI agenti se nemusí omezovat na generování kódu. Dokážou dělat reálnou práci v měřítku, které by bylo pro sólo zakladatele ekonomicky nemožné jinak. Dvacet agentů běžících paralelně, každý dělající inteligentní rozhodnutí o chaotických reálných datech, koordinovaných orchestrátorem a validovaných člověkem.
To je hodně daleko od vibe codingu.
Mohl by tenhle přístup fungovat pro jiné problémy s extrakcí dat? Myslím, že ano. Jakákoliv doména, kde jsou informace roztroušené přes stovky nekonzistentních webů — řemeslníci, restaurace, lokální služby, poskytovatelé zdravotní péče — stejná architektura platí. Orchestrátor, paralelní agenti, detailní prompt s doménově specifickými sémantickými mapováními, validace schématu a lidský review.
Celý pipeline je součástí Kvalty.cz — a stále běží, udržuje profily 1 700+ škol aktuální.