# Changelog of Playwright Scraper — Python, Any Website (`eszetael_lab/reliable-playwright-scraper`) Actor

- **URL**: https://apify.com/eszetael\_lab/reliable-playwright-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/eszetael\_lab/reliable-playwright-scraper.md

## Changelog

### 0.4 (2026-08-10) — przyczyna przekroczeń czasu, zmierzona na własnym przebiegu

- **Budżet strony jest teraz budżetem.** Nawigacja i czekanie na `waitUntil` brały własne domyślne
  limity Playwrighta (30 s + 30 s), niezwiązane z `requestTimeoutSecs` (45 s). Suma przekraczała
  budżet uchwytu, Crawlee zamykał stronę, wiszące wywołanie rzucało wyjątek **bez treści** (stąd
  `Retrying request ... due to: .` w dziennikach), szły trzy ponowienia — i tak do limitu przebiegu.
  Oba etapy dostają teraz udział budżetu strony (`page_budget_ms`), z zapasem na ekstrakcję.
- **Nawigacja kończy się na `domcontentloaded`**, a stan zamówiony przez klienta osiągamy po niej,
  na ograniczonym czasie. Pełna treść jak dotąd, gdy strona ładuje się normalnie; ułamek budżetu,
  gdy nie kończy się nigdy.
- **Niedoczekane strony są widoczne** — karta przebiegu podaje ich liczbę i co z tym zrobić.
  Uboższa treść nie ma prawa wyglądać identycznie jak kompletna.
- Zmierzone 10.08 na `docs.apify.com` (12 żądań, 4096 MB): `load` 158 s / 1194 MB, sam DOM 76 s /
  520 MB, blokowanie zasobów bez znaczenia (147 s). Porównanie rekord po rekordzie: `domcontentloaded`
  gubi treść na 2 z 10 adresów (−10,8% na stronie głównej) — dlatego czekanie zostało ograniczone,
  a nie skrócone.

### 0.2 (2026-07-23) — G4 panel round 1 fixes (empirycznie zweryfikowane vs crawlee 1.8.3)

- **ConcurrencySettings**: desired<=max (default desired=10 rzucał ValueError dla max<10 → limit
  cicho ignorowany → do 100 kontekstów Chromium → OOM na 4GB). Naprawione.
- **includeGlobs**: `Glob(g)` zamiast surowych stringów (crawlee robił AttributeError → feature 100%
  martwy, zero linków enqueue). Naprawione.
- **robots.txt**: natywny Crawlee `respect_robots_txt_file` — PRZED nawigacją (poprawnie), zamiast
  mojego buggy after-nav check. Usunięty robots.py (naprawia też httpx-poza-requirements).
- **FAIL-on-zero**: odpala też gdy WSZYSTKIE requesty padły sieciowo (site down/blocked) —
  `failed_request_handler`. Wcześniej "Scraped 0" wyglądało jak sukces.
- `crawler.stop()` na cap (nie ładuj kolejnych stron), guard push-loop, README (requestTimeoutSecs +
  model user-kodu). Testy 10/10 (page\_function).

### 0.1 (2026-07-23)

- First version: generic Playwright web crawler + user Python page function.
- Reliability (weaponize the 2.7★ incumbent): per-page error isolation, retries, deterministic
  timeouts, request cap. Transparent PPE (per-result, fail-closed) + free mode. FAIL-on-zero.
- Respects robots.txt / TDM reservation by default (legal condition). Link enqueueing via
  linkSelector + include globs. Proxy support.
