From 078fe5323f441afb292021fa8764434821704418 Mon Sep 17 00:00:00 2001 From: Vysyr Date: Mon, 31 Aug 2026 20:36:50 +0200 Subject: [PATCH] sync --- README.md | 4 +++- scraper.py | 22 +++++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2bc8f7b..d04d293 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,9 @@ CHROMIUM_PATH=/usr/bin/chromium gunicorn --workers 1 --threads 2 --bind 127.0.0. Na świat wystaw aplikację przez nginx/Caddy z HTTPS. Zostaw jeden worker: aplikacja celowo dopuszcza tylko jedno sprawdzenie naraz, by chronić RAM i CPU RPi. -Google może czasem pokazać niezalogowanej przeglądarce „ograniczony widok” i ukryć wszystkie opinie. Wtedy aplikacja zwraca błąd — nigdy nie zgaduje wartości z długości pasków i nie wymaga przechowywania konta Google. +Google może czasem pokazać niezalogowanej przeglądarce „ograniczony widok” i ukryć wszystkie opinie. Wtedy aplikacja zwraca błąd — nigdy nie zgaduje wartości z długości pasków. + +Jeśli ograniczony widok pojawia się stale, można utworzyć osobny profil Chromium, zalogować go ręcznie i ustawić `CHROMIUM_PROFILE_PATH`. Profil przechowuje sesję przeglądarki; aplikacja nadal nie zapisuje opinii. ## Testy diff --git a/scraper.py b/scraper.py index 10af142..fbb8da8 100644 --- a/scraper.py +++ b/scraper.py @@ -105,9 +105,23 @@ def get_rating_distribution(url: str) -> dict: launch = {"headless": True, "args": ["--disable-dev-shm-usage", "--no-first-run", "--disable-gpu"]} if os.environ.get("CHROMIUM_PATH"): launch["executable_path"] = os.environ["CHROMIUM_PATH"] - browser = playwright.chromium.launch(**launch) + profile_path = os.environ.get("CHROMIUM_PROFILE_PATH") + browser = None + if profile_path: + # A headless systemd service has no desktop keyring. Use this only + # with the dedicated, permission-restricted application profile. + launch["args"].append("--password-store=basic") + context = playwright.chromium.launch_persistent_context( + user_data_dir=profile_path, + locale="pl-PL", + viewport={"width": 1100, "height": 800}, + **launch, + ) + else: + browser = playwright.chromium.launch(**launch) + context = browser.new_context(locale="pl-PL", viewport={"width": 1100, "height": 800}) try: - page = browser.new_page(locale="pl-PL", viewport={"width": 1100, "height": 800}) + page = context.pages[0] if context.pages else context.new_page() page.goto(url, wait_until="domcontentloaded", timeout=30_000) _accept_cookies(page) _open_reviews(page) @@ -126,7 +140,9 @@ def get_rating_distribution(url: str) -> dict: average = round(sum(int(stars) * count for stars, count in ratings.items()) / total, 2) if total else 0 return {"total": total, "average": average, "ratings": ratings} finally: - browser.close() + context.close() + if browser: + browser.close() except ScrapeError: raise except PlaywrightTimeoutError: