# Crawlery AI nie wykonują kodu JavaScript

> GPTBot, ClaudeBot i PerplexityBot czytają surowy HTML i nigdy nie wykonują skryptów. Jak sprawdzić, czy katalog jest widoczny, i naprawić to bez przebudowy.

**Language:** pl  
**Published:** 2026-08-09  
**Category:** Technical · **Tags:** AI crawlers, JavaScript rendering, server-side rendering, GPTBot, structured data, product data  
**Canonical:** https://partsgraph.ai/pl/blog/ai-crawlers-do-not-run-javascript

## W skrócie

**Czy crawlery AI, takie jak GPTBot i ClaudeBot, wykonują kod JavaScript?**

Nie. Wspólna analiza Vercel i MERJ, przeprowadzona w sieci obsługującej 569 milionów żądań GPTBot w ciągu jednego miesiąca, nie wykazała żadnych dowodów na to, by GPTBot, ClaudeBot, PerplexityBot czy crawler Meta wykonywały kod JavaScript: parsują surowy HTML zwrócony przez serwer i odrzucają skrypty. Wyjątkiem jest Google, ponieważ Gemini korzysta z tej samej infrastruktury renderującej co Googlebot. Jeśli Twój katalog parametryczny składa dane produktowe po stronie klienta, asystent AI widzi pustą skorupę w miejscu, w którym powinny znajdować się Twoje specyfikacje.

---

## Krótka odpowiedź

Crawlery AI nie wykonują kodu JavaScript. Kiedy GPTBot, ClaudeBot czy PerplexityBot pobiera stronę, wysyła zwykłe żądanie HTTP GET, przyjmuje bajty zwrócone przez serwer i parsuje je jako tekst. Nie ma tu przeglądarki, budowania DOM, hydracji ani czekania na rozwiązanie wywołań XHR. Wspólna analiza Vercel i MERJ, przeprowadzona w sieci obsługującej w ciągu jednego miesiąca 569 milionów żądań GPTBot i 370 milionów żądań ClaudeBot, nie wykazała żadnych dowodów na wykonywanie kodu JavaScript przez którykolwiek z liczących się crawlerów AI. Crawlery czasem faktycznie pobierają pliki skryptów — GPTBot sięgał po JavaScript w 11,50% żądań, ClaudeBot w 23,84% — a potem nigdy ich nie uruchamiają.

> **Figure.** What a browser receives versus what an AI crawler receives for the same product page.

Wyjątkiem jest Google — i to właśnie dlatego tak wiele zespołów nie zauważyło jeszcze problemu. Googlebot prowadzi usługę renderującą opartą na headless Chromium, a Gemini opiera się na tej infrastrukturze. Katalog parametryczny renderowany po stronie klienta może więc znakomicie rankować w wyszukiwarce Google, a jednocześnie być całkowicie nieobecny w ChatGPT, Claude i Perplexity. To już nie jest ta sama publiczność: z badania nabywców przeprowadzonego przez Forrester w 2026 roku wynika, że **94% nabywców biznesowych korzysta dziś z AI w procesie zakupowym**, a Adobe zmierzył, że ruch kierowany przez AI na strony handlowe rósł w tempie **393% rok do roku w pierwszym kwartale 2026 roku**.

## Co GPTBot faktycznie dostaje

Warto precyzyjnie rozróżnić dwa dokumenty, o które tu chodzi, bo większość zespołów katalogowych ogląda wyłącznie ten drugi.

**Surowy HTML** to strumień bajtów, który serwer origin zapisuje w odpowiedzi. To właśnie wypisuje `curl`, to pokazuje `view-source:` i to parsuje czysto tekstowy klient HTTP.

**Wyrenderowany DOM** to zawartość pamięci po tym, jak przeglądarka sparsowała ten HTML, pobrała i wykonała każdy skrypt, rozwiązała każde wywołanie `fetch()` i zastosowała każdą mutację. To właśnie pokazuje panel Elements w narzędziach deweloperskich przeglądarki.

W nowoczesnym katalogu typu SPA te dwa dokumenty nie mają ze sobą prawie nic wspólnego. Surowy HTML jest pustą skorupą: `<div id="root">`, manifest preload i sto kilobajtów odwołań do bundle'i. Każdy znaczący ciąg znaków — numer katalogowy, obudowa, tolerancja, zakres temperatur pracy, status RoHS, status cyklu życia, stan magazynowy, próg cenowy — pojawia się później, z wywołania API, którego crawler nigdy nie wykona.

> Crawler AI widzi Twój surowy HTML i nic poza tym. Jeśli danej specyfikacji nie ma w bajtach zwracanych przez serwer, to z punktu widzenia modelu ta specyfikacja nie istnieje.

## Które klienty renderują, a które nie

| Klient | Operator | Wykonuje JavaScript | Do czego służy |
|---|---|---|---|
| GPTBot | OpenAI | Nie | Zbieranie danych treningowych |
| OAI-SearchBot | OpenAI | Nie | Indeksowanie na potrzeby wyszukiwania w ChatGPT |
| ChatGPT-User | OpenAI | Nie | Pobranie na żywo na potrzeby pytania użytkownika |
| ClaudeBot | Anthropic | Nie | Zbieranie danych treningowych |
| PerplexityBot | Perplexity | Nie | Indeksowanie na potrzeby wyszukiwania |
| Meta-ExternalAgent | Meta | Nie | Trening i indeksowanie |
| Bytespider | ByteDance | Nie | Zbieranie danych treningowych |
| Googlebot | Google | **Tak**, headless Chromium | Wyszukiwarka i grounding dla Gemini |
| Applebot | Apple | **Tak**, może renderować w przeglądarce | Siri, Spotlight, Safari |

Każde „Nie" w tej tabeli to zmierzone zachowanie ze zbioru danych Vercel i MERJ, a nie wniosek wysnuty z przesłanek. Każde „Tak" jest udokumentowane przez operatora: Google publikuje opis swojego potoku renderowania, a dokumentacja crawlera Apple stwierdza, że Applebot „może renderować zawartość Twojej witryny w przeglądarce". Nowsze agenty Anthropic — Claude-SearchBot i Claude-User — powstały już po tym badaniu i nie były mierzone osobno; od tego czasu żaden operator nie ogłosił dla nich potoku renderowania.

Praktyczna konsekwencja jest asymetryczna w wyjątkowo niewygodny sposób. Renderowanie to kosztowna część crawlowania, a operatorzy, którzy je pominęli, to dokładnie ci, którzy stoją dziś między Twoim produktem a Twoim klientem.

## Dlaczego katalogi parametryczne wypadają gorzej niż cokolwiek innego

W analizie Adobe z kwietnia 2026 roku oceniono strony handlowe pod kątem czytelności maszynowej: karty produktów uzyskały **66% — najniższy wynik ze wszystkich typów stron**, poniżej stron głównych (75%), stron kategorii (74%), a nawet stron FAQ (80%). Ta kolejność nie jest przypadkiem. Strony niosące dane najbardziej ustrukturyzowane, najcenniejsze i najistotniejsze dla decyzji zakupowej to jednocześnie te zbudowane z największą ilością kodu JavaScript.

Za większość szkód odpowiada pięć wzorców:

1. **Stan filtrów żyje po stronie klienta.** Twój selektor parametryczny to komponent React czytający z lokalnego magazynu stanu. Nie istnieje renderowany serwerowo URL dla „0603, 100nF, X7R, 50V", więc crawler nie ma czego pobrać ani czego zacytować.
2. **Tabela specyfikacji to odpowiedź z API.** Najpierw renderuje się szkielet strony, potem żądanie do `/api/product/attributes` wypełnia tabelę. Crawler zatrzymuje się na szkielecie.
3. **Cena i dostępność są celowo po stronie klienta.** Rozsądne ze względu na cache. Zabójcze dla widoczności maszynowej, bo model, który nie widzi stanu magazynowego, nie poleci danej części.
4. **Zakładki i akordeony odraczają swoją treść.** Karty katalogowe, noty aplikacyjne, certyfikaty zgodności i linki do plików CAD są zwykle ładowane po kliknięciu. Crawler nigdy nie klika.
5. **Nieskończone przewijanie zastępuje paginację.** Od pięćdziesiątego pierwszego produktu w górę nie ma już żadnego URL, który crawler mógłby odwiedzić.

W sierpniu 2026 roku Partsgraph zbadał 984 domeny dystrybutorów i producentów na całym świecie — w Ameryce Północnej, Europie i Azji. Mediana wyniku widoczności dla AI wyniosła **50 na 100**, a **70% badanej grupy otrzymało ocenę D lub F**. Mniej więcej połowa nie potrafiła podać standardowemu klientowi niebędącemu przeglądarką ani jednej czytelnej strony katalogowej. Najsłabszym segmentem okazała się dystrybucja elektroniki z medianą 34.

## Jak sprawdzić, czy crawlery AI mogą odczytać mój katalog?

Rób to na własnym serwerze origin. Testowanie witryny konkurencji przez podszywanie się pod user-agenta crawlera daje wyniki fałszywie negatywne, bo korporacyjne systemy zarządzania botami weryfikują crawlery po źródłowym adresie IP, a nie po ciągu user-agent — podrobiony nagłówek z nierozpoznanego adresu zostanie zakwestionowany niezależnie od tego, co mówi robots.txt.

1. **Pobierz surowy HTML.** Wybierz swoją najcenniejszą pojedynczą stronę produktu.

```
curl -sS --compressed -o page.html -w "status=%{http_code} bytes=%{size_download}" "https://example.com/products/part-number"
```

2. **Poszukaj numeru katalogowego w bajtach.** Nie w przeglądarce — w pliku.

```
grep -c "MPN-12345" page.html
```

Jeśli zwróci to `0`, żaden crawler AI nie rozpozna, że ta strona dotyczy tej części.

3. **Poszukaj trzech wartości parametrycznych**, po których inżynier zwykle filtruje.

```
grep -oiE "operating temperature|tolerance|package|rohs|lifecycle" page.html | sort | uniq -c
```

4. **Policz bloki danych strukturalnych.**

```
grep -c "application/ld+json" page.html
```

Zero oznacza brak rekordu produktu czytelnego maszynowo. Jeden lub więcej oznacza, że warto go wyodrębnić i sprawdzić, czy faktycznie zawiera `sku`, `mpn`, `gtin`, `brand`, `offers` oraz kluczowe wpisy `additionalProperty`, a nie wyłącznie ścieżkę nawigacyjną.

5. **Porównaj z wyrenderowaną stroną.** Otwórz ten sam URL w przeglądarce z wyłączonym JavaScript. To, co zostanie, mniej więcej odpowiada temu, co dostaje crawler. Różnica między tym a normalną stroną to Twoja niewidoczność.

6. **Sprawdź całą ścieżkę, nie jedną stronę.** Powtórz test dla strony kategorii, strony wyników wyszukiwania, linku do karty katalogowej i pobrania pliku CAD. Crawler, który potrafi odczytać stronę produktu, ale nie może do niej dotrzeć z listingu kategorii dostępnego dla crawlerów, i tak utknie.

Strona, która przejdzie test, pokaże numer katalogowy dziesiątki razy, etykiety parametryczne obecne jako tekst i co najmniej jeden blok JSON-LD. Dla porównania: dobrze zbudowana strona produktu zwraca zwykle 60–200 KB HTML zawierającego pełną tabelę specyfikacji, a zepsuty szkielet SPA — 4–15 KB, w których nie ma nic poza odwołaniami do bundle'i.

## Jak to naprawić bez przepisywania całej witryny?

Nie musisz zmieniać platformy. Potrzebujesz tego, żeby bajty na serwerze origin zawierały fakty. Są cztery drogi i wcale się nie wykluczają.

| Podejście | Nakład pracy | Co naprawia | Główne ryzyko |
|---|---|---|---|
| Renderowanie po stronie serwera dla ścieżek produktowych | Wysoki | Wszystko, na stałe | Koszt zmiany platformy i ryzyko regresji |
| Prerendering / dynamic rendering | Średni | Treść w surowym HTML | Nieaktualne dane o cenie i stanie magazynowym w cache |
| JSON-LD renderowany serwerowo | Niski | Fakty czytelne maszynowo | Ignorowany, gdy treść strony nadal jest pusta |
| Kopia w Markdown i warstwa nakładki | Niski | Treść, dokumenty i dostęp dla agentów | Wymaga utrzymywania linków kanonicznych |

**Renderowanie po stronie serwera** dla ścieżek produktowych i kategorii to odpowiedź trwała. Jeśli działasz już na frameworku, który to wspiera, przeniesienie ścieżek katalogowych na komponenty serwerowe albo na generowanie statyczne z inkrementalną rewalidacją to zwykle kwestia tygodni, nie kwartałów, bo warstwa danych już istnieje — jest tylko wywoływana z niewłaściwej strony.

**Prerendering** to uczciwe rozwiązanie przejściowe. Wyrenderuj każdą stronę produktu raz — podczas builda albo według harmonogramu — buforuj HTML na brzegu sieci i podawaj go wszystkim. Serwuj ludziom i maszynom ten sam dokument; podstawianie crawlerom innej strony jest zarówno ryzykowne w świetle wytycznych, jak i w praktyce nieskuteczne, bo model zacytuje tę wersję, którą otrzymał.

**JSON-LD renderowany serwerowo** to zmiana o najwyższej dźwigni przy najmniejszym nakładzie pracy. Umieść go w HTML, który emituje serwer, a nie w tag managerze.

```
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "sku": "MPN-12345",
  "mpn": "MPN-12345",
  "name": "100 nF 50 V X7R 0603 ceramic capacitor",
  "brand": { "@type": "Brand", "name": "Example Components" },
  "additionalProperty": [
    { "@type": "PropertyValue", "name": "Capacitance", "value": "100 nF" },
    { "@type": "PropertyValue", "name": "Voltage rating", "value": "50 V" },
    { "@type": "PropertyValue", "name": "Dielectric", "value": "X7R" },
    { "@type": "PropertyValue", "name": "Operating temperature", "value": "-55 to +125 C" }
  ],
  "offers": {
    "@type": "Offer",
    "priceCurrency": "USD",
    "price": "0.042",
    "availability": "https://schema.org/InStock"
  }
}
</script>
```

**Kopia w Markdown** to najtańszy sposób, by strona stała się jednoznaczna. Udostępnij czysto tekstowy odpowiednik każdej strony produktu pod stabilnym, podlinkowanym URL, z tabelą specyfikacji zapisaną jako tabela Markdown. Klienty czysto tekstowe parsują to bez zarzutu, wygenerowanie tego z tego samego źródła danych kosztuje niemal nic, a Ty zyskujesz kanoniczną powierzchnię maszynową, która nie rozjeżdża się przy przebudowie front-endu. Uwaga: `llms.txt` to co innego — na rok 2026 żaden liczący się operator AI nie zobowiązał się do jego czytania, a zespół Search Relations w Google wprost odmówił jego poparcia. Kopie działają dlatego, że są zwykłymi, podlinkowanymi stronami.

**Nakładka** umieszcza wszystko powyższe przed istniejącą witryną, a nie wewnątrz niej. Usługa typu sidecar albo edge worker serwuje renderowane serwerowo strony czytelne dla agentów, JSON-LD, kopie w Markdown oraz hostowany endpoint MCP w Twojej własnej domenie, czytając z istniejącego systemu PIM. W samej witrynie dla klientów nie zmienia się nic. Takie podejście stosuje Partsgraph i tak samo buduje u siebie coraz więcej producentów: Microchip udostępnił w listopadzie 2025 roku bezpłatny publiczny serwer MCP dla swoich danych produktowych, a należący do ECIA serwis TrustedParts uruchomił w czerwcu 2026 roku usługę agenta AI do stanów magazynowych.

## Od czego zacząć, po kolei

1. Przeprowadź powyższy sześciostopniowy test na dziesięciu najważniejszych produktach i zapisz liczby bajtów.
2. Renderuj JSON-LD po stronie serwera na stronach produktów. To najmniejsza zmiana o największym mierzalnym efekcie.
3. Zadbaj, by każda specyfikacja, każdy link do karty katalogowej i każdy link do pliku CAD były obecne w pierwotnym HTML, nawet jeśli wersja interaktywna pozostanie po stronie klienta.
4. Nadaj każdej istotnej kombinacji filtrów parametrycznych prawdziwy, dostępny dla crawlerów, renderowany serwerowo URL.
5. Opublikuj kopię w Markdown dla każdego produktu i podlinkuj ją ze strony.
6. Dopiero potem martw się o pozycje, prompty i udział w odpowiedziach. Pobranie treści poprzedza cytowanie — nie ma czego optymalizować, dopóki treść nie znajdzie się w ciele odpowiedzi.

Mechanizm nie jest tu subtelny ani sporny. Model może zacytować wyłącznie to, co otrzymał, a otrzymał Twój surowy HTML. Cała reszta to krok renderowania, który nigdy się nie wydarzył.

*Chcesz wiedzieć, jak wypada Twój katalog? Bezpłatny grader widoczności dla AI od Partsgraph przeprowadza opisane w tym artykule testy na Twojej własnej domenie pod adresem [/audit](/audit).*

## Najczęstsze pytania

### Czy GPTBot renderuje kod JavaScript?

Nie. Vercel i MERJ ustalili, że GPTBot pobiera pliki JavaScript w około 11,5% swoich żądań, ale nigdy ich nie uruchamia. Treść wyciąga z HTML, który serwer zwraca w pierwszej odpowiedzi. Wszystko, co Twój bundle wstrzykuje do DOM po załadowaniu strony, jest dla niego niewidoczne.

### Dlaczego Google widzi moją aplikację jednostronicową, a ChatGPT nie?

Googlebot korzysta z usługi renderującej opartej na headless Chromium, więc wykonuje kod JavaScript i indeksuje powstały DOM. Gemini opiera się na tej samej infrastrukturze. OpenAI, Anthropic i Perplexity używają prostych klientów HTTP bez silnika przeglądarki, więc ta sama strona może świetnie rankować w Google i być całkowicie nieobecna w odpowiedzi AI.

### Czy prerendering albo dynamic rendering to naprawi?

Może tak — to uczciwe rozwiązanie przejściowe dla katalogu, którego nie da się szybko przenieść na inną platformę. Ryzyka to nieaktualne dane o cenie i stanie magazynowym w cache oraz serwowanie crawlerom strony istotnie różnej od tej, którą dostają użytkownicy. Zadbaj, aby prerenderowany HTML był semantycznie identyczny z renderowaną stroną, i ustaw krótkie okno rewalidacji dla pól zmiennych.

### Czy sam JSON-LD wystarczy?

Tylko wtedy, gdy znajduje się w HTML zwracanym przez serwer. JSON-LD wstrzykiwany przez tag managera albo skrypt po stronie klienta pojawia się już po tym, jak crawler zakończył pracę. Renderuj znacznik skryptu po stronie serwera i traktuj JSON-LD jako uzupełnienie czytelnej treści strony, a nie jej zamiennik.

### Jak sprawdzić to samodzielnie w mniej niż minutę?

Uruchom curl na URL produktu z włączoną kompresją, zapisz odpowiedź, a potem przeszukaj surowe bajty poleceniem grep pod kątem numeru katalogowego oraz dwóch–trzech wartości parametrycznych. Jeśli nie ma ich w pliku, a widać je w przeglądarce, buduje je JavaScript i żaden crawler AI nigdy ich nie zobaczy.

### Czy crawlery AI respektują moją mapę witryny?

Korzystają z niej niekonsekwentnie. Vercel i MERJ zmierzyli, że 34,82% pobrań wykonywanych przez ChatGPT kończy się błędem 404, wobec 8,22% w przypadku Googlebot. Wskazuje to raczej na wykrywanie linków z nieaktualnych źródeł niż na zdyscyplinowane przechodzenie mapy witryny. Poprawna mapa witryny z prawidłowymi wartościami lastmod pomaga, ale nie zrekompensuje stron, które nie zwracają żadnej treści.

### Czy dotyczy to również pobierania plików CAD, BIM i kart katalogowych?

Tak, i to w jeszcze większym stopniu. Jeśli link do pobrania jest generowany przez JavaScript, ukryty za stroną pośrednią albo rozwiązywany przez krótko żyjący podpisany URL, klient niebędący przeglądarką w ogóle nie jest w stanie za nim podążyć. Taki dokument równie dobrze mógłby nie istnieć.

## Źródła

1. [Vercel and MERJ, The rise of the AI crawler, December 2024](https://vercel.com/blog/the-rise-of-the-ai-crawler)
2. [Adobe Digital Insights, AI traffic and retail machine-readability, April 2026](https://business.adobe.com/blog/ai-traffic-surge-retail-sites-not-machine-readable)
3. [eCommerceNews, Adobe machine-readability scores by page type, April 2026](https://e-commerce.news/story/adobe-says-ai-retail-traffic-surges-as-readability-lags)
4. [TechCrunch, AI traffic to US retailers rose 393% in Q1, April 2026](https://techcrunch.com/2026/04/16/ai-traffic-to-us-retailers-rose-393-in-q1-and-its-boosting-their-revenue-too/)
5. [Forrester, The State Of Business Buying, 2026 (January 2026)](https://www.forrester.com/blogs/state-of-business-buying-2026/)
6. [Google Search Central, Google crawlers and user agents](https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers)
7. [OpenAI, Overview of OpenAI crawlers](https://developers.openai.com/api/docs/bots)
8. [Anthropic, Does Anthropic crawl data from the web?](https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler)
9. [Apple Support, About Applebot](https://support.apple.com/en-us/119829)
10. [Microchip Technology, MCP Server press release, November 2025](https://ir.microchip.com/news-events/press-releases/detail/1344/microchip-technology-unveils-model-context-protocol-mcp-server-to-power-ai-driven-product-data-access)
11. [ECIA, TrustedParts.com launches Inventory AI Agent Service, June 2026](https://www.ecianow.org/2026/06/11/trustedparts-com-launches-inventory-ai-agent-service/)
12. [Search Engine Journal, Google says llms.txt is speculative for now](https://www.searchenginejournal.com/google-says-llms-txt-is-purely-speculative-for-now/577576/)

## Other languages

- English: https://partsgraph.ai/blog/ai-crawlers-do-not-run-javascript/md
- Deutsch: https://partsgraph.ai/de/blog/ai-crawlers-do-not-run-javascript/md
- Français: https://partsgraph.ai/fr/blog/ai-crawlers-do-not-run-javascript/md
- Español: https://partsgraph.ai/es/blog/ai-crawlers-do-not-run-javascript/md
- Italiano: https://partsgraph.ai/it/blog/ai-crawlers-do-not-run-javascript/md
- Nederlands: https://partsgraph.ai/nl/blog/ai-crawlers-do-not-run-javascript/md
- Português: https://partsgraph.ai/pt/blog/ai-crawlers-do-not-run-javascript/md
- Svenska: https://partsgraph.ai/sv/blog/ai-crawlers-do-not-run-javascript/md
- Türkçe: https://partsgraph.ai/tr/blog/ai-crawlers-do-not-run-javascript/md
- 日本語: https://partsgraph.ai/ja/blog/ai-crawlers-do-not-run-javascript/md
- 한국어: https://partsgraph.ai/ko/blog/ai-crawlers-do-not-run-javascript/md
- 简体中文: https://partsgraph.ai/zh/blog/ai-crawlers-do-not-run-javascript/md

---

Partsgraph — the agent-ready parts data layer. Free AI-visibility grader: https://partsgraph.ai/pl/audit
