Auto Dorian Gray a Schrödingerova cena: noc s AI vyšetřovatelem ojetin

Auto, které stárne v inzerátu, ale ne na fotkách. Cena, která existuje současně ve čtyřech různých hodnotách. Kilometry, které tomu samému autu během týdne ubývají. Tohle nejsou výmysly — tohle jsou tři historky, které mi za jednu noc poslal AI vyšetřovatel ojetin, kterého jsem si o víkendu postavil.
Není to scraper. Je to vyšetřovatel. A je to první věc, kterou jsem na Claudovi udělal a u které jsem si fakt řekl: "OK, tohle je jiná liga."
Tenhle článek je o tom, jak to funguje, co k tomu potřebuješ a proč si myslím, že tohle není jen o autech — je to prototyp něčeho většího. Žádný portál v něm nejmenuju. Případy jsou skutečné, principy reprodukovatelné. Komu se chce, najde si je sám.
Proč klasický scraper nestačí
V článku o scrapování v roce 2026 jsem psal, že scraper je systém, ne skript. Tohle je o krok dál: nejde o to data sebrat, jde o to jim věřit.
Když si scrapuješ inzeráty ojetin ze čtyř portálů, dostaneš čtyři reality. Cenu v nadpisu, jinou v detailu, třetí ve strukturovaných datech pro Google a čtvrtou na fotce s cenovkou. Každý portál má jiný layout, jiné agregátory ho indexují pozpátku, někteří přidávají DPH, jiní ho vykouzlí pryč. Surová data lžou — ne zlomyslně, ale strukturálně.
Klasický scraper to nepozná. Vytáhne .price-final, vrátí číslo, jede dál. Validátor to pozná, protože otevře tu stránku v reálném prohlížeči a podívá se vlastníma očima. To je celá pointa.
Stack: dva Claudi, Chrome DevTools, SearXNG, Docker
Architektura je zbytečně jednoduchá na to, co dělá. Tady je celý stack:
- Scraper-Claude — první agent. Dostane VIN nebo specifikaci auta. Najde ho přes SearXNG, otevře HTML, vytáhne strukturovaná data (cena, najeto, rok, výbava, fotky). Vrátí JSON.
- Validator-Claude — druhý agent v jiném kontextu. Paranoidní. Dostane výstup Scrapera a má jediný úkol: "Otevři tu stránku v Chromu, najdi to vlastníma očima a řekni mi, jestli to sedí." Pokud nesedí, vrací co je špatně a kde.
- Chrome DevTools MCP — dělá z Validátora skutečného uživatele. Klikne, scrolluje, čte text, koukne na atributy elementů, získá screenshoty. Žádný headless
requests. Skutečný browser, skutečný DOM. - SearXNG v Dockeru — vlastní search backend. Místo Brave Search API nebo Serper za $200 měsíčně. Containers, jeden compose, žádný klíč, žádný 429.
- Loop — Scraper vrátí výsledek → Validator ho prověří → pokud nesedí, vrátí Scraperovi, co opravit (nový selektor, nová URL, jiná stránka). Loop končí, když je validace zelená nebo když Validator řekne "tady to fakt nesedí, zapiš nesrovnalost."
To je vše. Nic z toho není nový vynález. Je to nová kombinace.
Trik číslo 1: SearXNG místo placených search API
Když scrapuješ napříč internetem, potřebuješ vyhledávat. "Najdi mi tohle auto na všech portálech, kde běží." Brave Search API? $5 za tisíc dotazů. Serper? Podobně. Při sériovém scrapingu desítek aut denně se to rychle natáhne.
Řešení: SearXNG v Dockeru. Open-source meta-search engine, který agreguje výsledky z desítek vyhledávačů (Google, Bing, DuckDuckGo, Brave, Qwant, Yandex…) a vrací je jako jednotné JSON API. Jeden compose, dvacet sekund startup, $0 za měsíc.
# docker-compose.yml — minimal SearXNG
services:
searxng:
image: searxng/searxng:latest
ports:
- "8080:8080"
volumes:
- ./searxng:/etc/searxng
environment:
- SEARXNG_BASE_URL=http://localhost:8080/
restart: unless-stopped
V settings.yml přepneš JSON output:
search:
formats:
- html
- json
A pak voláš jako normální REST endpoint:
curl "http://localhost:8080/search?q=octavia+2018+1.6+tdi&format=json&categories=general"
Žádný API klíč. Žádný rate limit. Žádný účet. Pokud z tebe Google začne dělat captcha, SearXNG mezitím servíruje výsledky z Bingu a Brave. Pro Claude agenta je to jako kdyby měl celý web v localhost.
Side note: ano, je to meta-search, takže se technicky rate-limituješ na cizí stranu. Buď slušný, dej pauzy mezi dotazy, používej víc backendů. Pro osobní výzkum a pomalé loopy je to bez problému.
Trik číslo 2: Validátor jako paranoidní QA inženýr
Tohle je srdce celé věci. Místo aby Scraper-Claude rozhodoval "asi to bude OK", deleguje rozhodnutí druhému Claudovi — bez kontextu, bez sentimentu, jen s úkolem najít, čím se výstup liší od reality.
Promptík (zkráceně):
Jsi paranoidní QA inženýr. Nevěříš ničemu, dokud jsi to neviděl
v Chromu. Dostaneš JSON výstup scraperu a URL inzerátu.
Tvůj úkol:
1. Otevři URL přes chrome-devtools MCP.
2. Pro každé pole v JSONu najdi odpovídající hodnotu na stránce
(cenu, najeto, rok, fotky, popis).
3. Porovnej. Pokud sedí, řekni "match".
4. Pokud nesedí, vrať: pole, scraper-hodnotu, skutečnou hodnotu,
selektor kde jsi ji našel, a hypotézu PROČ nesedí
(chybný selektor / cena bez DPH / agregátor přepsal hodnotu / atd).
5. Pokud najdeš něco podezřelého (cena v meta tagu jiná než na
stránce, fotky se v EXIFu liší od inzerovaného roku, JSON-LD
vs DOM), zapiš to jako anomálii i bez výzvy.
Validator nikdy nedá "asi". Buď match, nebo nesrovnalost s důkazem. A tady je psychologický trik: když jsou to dva oddělení agenti v oddělených kontextech, druhý nemá motivaci hájit práci prvního. Nemá ego. Nezná příběh, jak ten výstup vznikl. Jen kouká, co tam je. Často najde něco, co Scraper-Claude přehlédl, protože byl už "zaháčkovaný" v tom, co očekává.
Tohle je přesně typ úkolu, na který je Chrome DevTools MCP udělaný. Není to jen "napiš mi selektor". Je to "podívej se, co tam doopravdy je".
Trik číslo 3: Loop, který sám rozhoduje, kam dál
Klasický scraper má pevný pipeline: stáhni → parse → ulož. Tahle věc má rozhodovací loop:
1. Scraper najde inzerát.
2. Validator si ho ověří.
3. Pokud match → zapiš do DB, hotovo.
4. Pokud nesrovnalost → tři větve:
a) "Selektor byl špatný" → Scraper to opraví a zkusí znovu.
b) "Hodnota tam fakt jinak je" → zapiš jako anomálii,
Scraper jde najít stejné auto na jiném portálu.
c) "Tohle auto má víc verzí na různých portálech" → Scraper
přes SearXNG dohledá všechny, projedou se všechny,
Validator porovná napříč.
5. Po N iteracích nebo když se nesrovnalostí kupí → Scraper si
vytáhne sériové číslo / VIN a zkontroluje historii v
externím registru (cebia, archive.org, EU vehicle history).
To není scraping pipeline. To je investigativní agent. Claude rozhoduje za běhu, kam dál koukat, na základě toho, co druhý Claude před chvílí našel. Pevný DAG nahrazený rozhodovací smyčkou. Tohle je to, co LLM skutečně přidávají — ne to, že umí parsovat HTML lépe (často umí hůř), ale že umí rozhodovat za běhu na základě fuzzy signálů.
Tři historky z jedné noci
Pustil jsem to na noc. Konkrétní zadání: vezmi pár specifikací běžných ojetin, najdi je napříč velkými inzertními portály, ověř konzistenci. Ráno jsem v logu měl tohle.
1. Auto Dorian Gray
Inzerát existuje 14 měsíců. Na fotce auto vypadá pořád stejně — výborně, čerstvě umyté, ostré stíny, žluté listí v pozadí. To žluté listí mě zarazilo. Čtrnáct měsíců a venku je furt podzim?
Validator-Claude porovnal hash fotek mezi snapshoty z archive.org napříč těmi 14 měsíci. Identické soubory. Bit za bitem. Mezitím se v inzerátu měnil popisek ("právě dovezeno", "po servisu", "sleva!"), měnily se kilometry (občas i nahoru), měnila se cena. Auto neexistuje v takové podobě, v jaké ho fotka ukazuje, už víc než rok.
Pointa: inzerát je literární žánr. Fotka je metafora. Validator to našel za 8 sekund — člověk by tam pojmenovat slovo "podzim" musel ručně, otevřít wayback machine, pamatovat si to z minulé prohlídky. Stroj nezapomíná.
2. Schrödingerova cena
Auto. Cena v <title> stránky: 289 000. Cena v <h1>: 319 000. Cena v JSON-LD strukturovaných datech pro Google: 269 000. Cena na fotce s cenovkou v okně auta: 340 000.
Validator-Claude poznámka v logu: "Cena tohoto vozu je superpozicí čtyř hodnot. Měří se až při kontaktu s prodejcem."
Co se stalo? Pravděpodobně klasická salát ze starých polí v CMS — někdo přepsal cenu jen na jednom místě, agregátor importoval starou verzi, fotka je z první inzerce, JSON-LD generuje nějaký skript, který nikdo neauditoval. Není to podvod. Je to chaos. Ale pro kupujícího, který se rozhoduje "stojí to za to telefonát?" je to katastrofa — nikdo neví, jakou cenu dostane na druhé straně.
A teď klíčová věc: klasický scraper by vrátil jednu z těch čtyř hodnot a tvářil se, že má pravdu. Validator-Claude vrací všechny čtyři a říká "nevím, jaká je správná, ale tohle je signál, že o tomhle inzerátu nikdo neví, kolik vlastně stojí." To je úplně jiná informace.
3. Najetá pravda (auto, které jezdí časem pozpátku)
Stejný inzerát, stejné auto, sledováno 6 dní. Kilometry v inzerátu:
- Pondělí: 98 200 km
- Středa: 89 400 km
- Pátek: 84 100 km
To auto nikam nejelo. Nikam ho nikdo nepřevezl. Stálo na lotu. A přesto mu "odjelo" za týden minus 14 100 km.
Vysvětlení nemám. Možná nějaký retroaktivní edit, možná překlep, možná nějaký import přepsal hodnotu hodnotou z fotky odometru, kterou neumělo OCR správně přečíst. Validator-Claude šel ručně na všechny tři snapshoty z archive.org a potvrdil, že to není moje halucinace. "Doporučuji opatrnost při interpretaci údaje 'najeto' u tohoto subjektu." Suše.
Co to celé říká o internetu v roce 2026
Když jsem ten loop nechal běžet pár nocí, došlo mi něco důležitého. Polovina nesrovnalostí, které Validator-Claude našel, nebyly pokusy někoho někoho oklamat. Byly to chyby parsování od jiných agregátorů, špatně nakonfigurované JSON-LD, automatické překlady, které spolu nemluví. Špinavá data, ne špinavé úmysly.
Ale pro kupujícího je výsledek stejný: nemá komu věřit. A to je problém, který v roce 2026 nevyřeší další scraper. Vyřeší ho vrstva validace nad daty. AI, která se na svět dívá nedůvěřivě a porovnává verze.
Tohle není scraper na auta. Je to prototyp něčeho většího. AI, která validuje internet sama pro sebe. Protože v roce 2026 už není problém data sebrat — problém je věřit jim. A to dovedeme delegovat.
Kolik to stojí a kdy to nefunguje
Ekonomika: stack za 0 Kč měsíčně. SearXNG v Dockeru zdarma. Chrome DevTools MCP zdarma. Hostuju to na vlastním Macu, běží to v noci, ráno se podívám.
Jediná položka jsou tokeny pro Claude. Při běhu na 30–50 inzerátů za noc se to vejde do Claude Pro za $20 (resp. v rámci limitu). Pokud bys to chtěl škálovat na tisíce inzerátů denně, sáhneš po API a budeš platit za tokeny — pak dává smysl Validátora pouštět jen na podezřelé záznamy, ne na každý.
Kdy to nefunguje:
- Za Cloudflare Turnstile / hCaptcha. Chrome DevTools MCP umí browser, ale ne řešit captcha. Pokud cílový web tlačí na bot-detection, dostaneš se na zeď. Tady nepomůže ani SearXNG, ani Validator — je to architektonický problém scrapování, ne validace.
- U JS-renderovaných SPA bez stabilních selektorů. Validator umí "najdi cenu", ale pokud se cena renderuje jako React komponenta s náhodným hashem v classname, smyčka se může zacyklit (Scraper opraví selektor, on se za hodinu změní, opakuje se to). Tady pomáhá použít celý DOM textový obsah místo selektorů.
- U úplně cizích domén bez přípravy. Loop je dobrý ve známém terénu. Jakmile narazí na portál, který nikdy neviděl, první noc je explorace ne validace. Druhou noc už je rychlejší.
Co to není
Nechci tu prodávat zázrak. Tahle věc nezachrání kupujícího před každým podvodem. Najde nesrovnalost, ale nesrovnalost ≠ podvod. Auto s odlišnou cenou ve čtyřech polích nemusí být problém prodejce, může to být problém agregátoru. Auto Dorian Gray je podezřelé, ale taky to může být legitimní inzerát s prostě starou fotkou.
Nesrovnalost je signál, ne důkaz. A přesně tak to Validator-Claude i vrací — vrací co viděl, ne co se stalo. Interpretaci nechává na člověku. To je důležitá hranice.
Druhá důležitá hranice: portály nikoho nejmenuju, případy nepublikuju s VIN/SPZ. Cílem nástroje není někoho usvědčit. Cílem je vědět, na co se zeptat prodejce, než zaplatím 280 000 Kč. "Mohl byste mi prosím poslat aktuální fotku odometru a SPZ na ověření v cebia?" je legitimní dotaz, který Validátor-Claude poslouží jako munice k jeho položení.
Co bych chtěl postavit dál
Tři směry, které mě teď lákají:
- Memory přes běhy. Když Validator najde anomálii, měl by si pamatovat, že tenhle inzerát na pozítří zkontroluje znovu. "Vrátila se cena? Změnily se kilometry? Změnil se popis?" Time-series validace.
- Cross-portál fingerprinting. "Tohle auto jsem viděl už na 3 portálech s 3 různými prodejci. Je to legitimní agregace, nebo je to klon?" Validator už dnes umí porovnávat fotky a popis. Příští krok: detekce klonů.
- Generický validační agent pro libovolnou doménu. Auta, byty, nabídky práce, e-shopové ceny — všude jsou stejné typy nesrovnalostí. Stejný Validator-prompt, jen s parametrizovaným "co je důvěryhodné u téhle domény".
Tohle si píšu na další víkend. Pokud se ti líbí způsob uvažování, napiš mi — rád si o tom pokecám.
Take-aways
Pět věcí, které si z tohohle zapamatovat:
- Surová data lžou strukturálně, ne zlomyslně. Cena, kilometry, fotky — žádná vrstva nemá pravdu sama o sobě.
- Druhý agent v jiném kontextu = lacinný, mocný validátor. Nemá ego, nemá kontext, nemá motivaci hájit. Najde to, co první přehlédl.
- Chrome DevTools MCP změní scraping na vyšetřování. Žádný headless, žádné selektory naslepo. Skutečný browser, skutečné oči.
- SearXNG v Dockeru = Google bez limitů. Nepřeplácej Brave/Serper API, pokud nemusíš.
- Hodnotu tvoří rozhodovací loop, ne pipeline. AI je dobré v "co dál?" otázce, ne v "jak parsovat HTML?" odpovědi.
A jedna metavěc: tohle je první věc, kterou jsem postavil a u které jsem si řekl, že tradiční pojem "scraping" je vyčerpaný. V roce 2026 nestavíme scrapery. Stavíme agenty, kteří se umí podívat dvakrát.