Jak znaleźć API na stronie, która go nie ma
Większość stron, które chcesz monitorować (ceny konkurencji, oferty, kursy), nie ma publicznego API. Mają za to coś prawie tak samo dobrego: własne, wewnętrzne API, którego strona używa, żeby załadować dane bez przeładowania całej podstrony. Ono nie jest udokumentowane ani promowane — ale jest publicznie dostępne, bo Twoja przeglądarka i tak je odpytuje za każdym razem, gdy wchodzisz na stronę.
Krok 1 — DevTools, zakładka Network
Otwórz stronę docelową, wciśnij F12 (albo Cmd+Option+I na Macu), przejdź do zakładki Network, odśwież stronę i filtruj po Fetch/XHR. To ukrywa obrazki, style i skrypty — zostają tylko właściwe zapytania o dane. Na liście szukaj żądań, których nazwa sugeruje dane, nie zasoby: products, api, graphql, search, liczby przypominające ID.
Krok 2 — Sprawdź odpowiedź, nie tylko żądanie
Kliknij podejrzane żądanie → zakładka Response. Jeśli widzisz czysty JSON z cenami/nazwami/ID — trafiłeś. Zanotuj: pełny URL, metodę (GET/POST), nagłówki (szczególnie Authorization, ciasteczka sesji, niestandardowe nagłówki typu X-Api-Key) i parametry zapytania (to, co po ? w URL — strona, limit, filtr).
Krok 3 — Odtwórz zapytanie poza przeglądarką
Najszybszy test: kliknij żądanie prawym przyciskiem w DevTools → Copy as cURL, wklej do terminala. Jeśli działa i dostajesz ten sam JSON — masz gotowy szkielet klienta. Stąd już prosta droga do Pythona:
import requests
r = requests.get(
"https://przyklad.pl/api/products",
params={"page": 1, "limit": 100},
headers={"User-Agent": "Mozilla/5.0"},
)
data = r.json()
print(len(data["items"]), "produktów")
🔴 Pułapki, na które realnie trafiłem
- Limit stronicowania, który cicho ucina wynik. Jedno z API, na którym pracowałem, przy parametrze
limit powyżej 200 zwracało pustą listę zamiast błędu — wyglądało, jakby produktów nie było, a to była po prostu przekroczona, nieudokumentowana granica. Zawsze sprawdzaj faktyczną liczbę zwróconych rekordów, nie zakładaj, że brak błędu = sukces.
- Soft-404. Publiczne SPA (Single Page App) często zwraca HTTP 200 dla każdego adresu, łącznie z nieistniejącymi — walidację robi dopiero JavaScript w przeglądarce. Jeśli sprawdzasz istnienie zasobu przez sam kod HTTP, będziesz się mylić. Waliduj po treści odpowiedzi (czy JSON ma oczekiwane pola), nie po samym statusie.
- Cloudflare i podobne zabezpieczenia. Część API jest za ochroną przed botami — zwykły
requests dostanie 403. Wtedy potrzebny jest headless przeglądarki (Playwright) zamiast prostego klienta HTTP — droższe w utrzymaniu, ale wciąż legalne i dużo tańsze niż płatne API tam, gdzie w ogóle istnieje.
Granica legalności
To technika czytania publicznie dostępnych danych, nie omijania zabezpieczeń czy logowania. Jeśli dane wymagają zalogowania jako konkretny użytkownik albo API jawnie tego zabrania w regulaminie — to inna sytuacja. Zdrowy rozsądek: jeśli dane są widoczne bez logowania w zwykłej przeglądarce, odpytywanie tego samego publicznego endpointu programem zamiast klikaniem nie zmienia tego, co jest publiczne.