Scarnox · Blog

Monitoring cen przez web scraping: praktyczny przewodnik

Monitoring cen polega na sprawdzaniu ceny produktu na zestawie stron według harmonogramu i zapisywaniu tego, co widzisz, żeby móc porównywać w czasie. Sklepy detaliczne, marketplace'y i analitycy wszyscy z tego korzystają. Scraping cen jest też jednym z najczęstszych miejsc, w których scraper trafia na captcha, więc warto dobrze zaprojektować ten system. Ten przewodnik omawia, co monitorować, jak parsować liczby ze stron, które nigdy nie miały być parsowane, jak przechowywać zmiany i wysyłać alerty oraz jak trzymać się reguł strony podczas pracy.

Zacznij od źródła, z którego wolno ci korzystać

Zanim napiszesz jakikolwiek kod, sprawdź, czy strona oferuje oficjalny sposób pozyskania danych: feed produktów, API lub program partnerski. Są bardziej niezawodne niż scraping i usuwają większość ryzyka prawnego i technicznego. Scraping to rozwiązanie awaryjne dla publicznych stron, gdzie nie ma oficjalnej drogi, a regulamin i robots.txt nadal obowiązują. Przegląd prawny omawia ogólne pytania.

Architektura w pięciu częściach

Solidny monitor ma pięć części. Trzymanie ich osobno ułatwia debugowanie:

  1. Harmonogram. Decyduje, które strony produktów odwiedzić i kiedy. Rozkładaj wizyty na cały dzień zamiast sprawdzać wszystko w tej samej minucie.
  2. Pobieracz. Pobiera stronę, z umiarkowanym tempem, ponowieniami i cache.
  3. Parser. Wyciąga cenę, kontekst waluty i status dostępności.
  4. Magazyn. Zapisuje każdą obserwację ze znacznikiem czasu, żebyś miał historię.
  5. Alerter. Porównuje nową wartość z poprzednią i powiadamia, gdy przekroczy próg, który ustawiłeś.

Parsuj ceny z chaotycznych stron

Ceny pojawiają się w wielu postaciach: z separatorami tysięcy, z przecinkiem dziesiętnym, z etykietą przed liczbą albo rozbite na kilka elementów. Utrzymuj mały parser i testuj go na prawdziwych przykładach. Oto wersja, która zakłada popularny format z przecinkami jako separatorem tysięcy i kropką jako separatorem dziesiętnym. Inne formaty normalizuj przed wywołaniem.

import re
from decimal import Decimal, InvalidOperation

PRICE_PATTERN = re.compile(r"\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|\d+(?:\.\d{1,2})?")

def parse_price(text: str) -> Decimal | None:
    """Zwróć pierwszą liczbę w tekście jako Decimal, albo None."""
    match = PRICE_PATTERN.search(text.replace(" ", " "))
    if not match:
        return None
    try:
        return Decimal(match.group(0).replace(",", ""))
    except InvalidOperation:
        return None

print(parse_price("Now 1,249.50 in stock"))  # Decimal('1249.50')
print(parse_price("Sold out"))               # None

Używaj Decimal, a nie float, do wszystkiego, co będziesz porównywać albo sumować. Zaokrąglenia zmiennoprzecinkowe potrafią sprawić, że dwie równe ceny wyglądają inaczej. Trzymaj surowy tekst obok sparsowanej wartości, żebyś mógł później naprawić błąd parsera bez ponownego pobierania każdej strony.

Przechowuj historię i wykrywaj zmiany

Pojedyncza cena to migawka. Wartość monitora to historia. Zapisuj jeden wiersz na obserwację: ID produktu, źródło, znacznik czasu, sparsowaną wartość i surowy tekst. Wtedy alerting to proste porównanie z poprzednim wierszem. Alertuj tylko przy istotnych zmianach, na przykład przy spadku większym niż ustalony procent albo gdy produkt przestaje być dostępny, żebyś nie był zalewany szumem.

Obsługuj warianty i zestawy

Strona produktu często pokazuje kilka cen: jedną za rozmiar lub kolor, cenę zestawu, cenę dla członków albo cenę, która pojawia się dopiero po wyborze. Zdecyduj, co monitor ma zapisywać, zanim zaczniesz budować. Częste podejście to zapisywanie identyfikatora wariantu obok ceny, tak żeby zmiana jednego rozmiaru nie wyglądała jak zmiana całego produktu. Uważaj na ceny „od” i przekreślone ceny oryginalne, bo parser, który złapie złą liczbę, wywoła fałszywe alerty. Zapisuj tekst etykiety obok każdej wartości, żebyś mógł sprawdzić, co zostało odczytane, gdy alert wygląda podejrzanie.

Harmonogramuj z umiarem

Sprawdzaj każdy produkt w odstępie zgodnym z tym, jak często jego cena naprawdę się zmienia. Produkt zmieniający cenę codziennie nie potrzebuje sprawdzania co godzinę. Dodaj losowe opóźnienie do każdej wizyty, ogranicz liczbę żądań na stronę na godzinę i cache'uj wyniki na wybrany odstęp. Te nawyki utrzymują niskie obciążenie i spójność danych.

Kiedy strona cię blokuje

Strony cen są częstym celem zautomatyzowanego dostępu, więc możesz zobaczyć blokadę, limit żądań albo captcha. Cofaj się, gdy zobaczysz 429 lub 503, i przestań odwiedzać stronę, która konsekwentnie cię odrzuca. Jeśli captcha pojawi się na stronie, którą wolno ci automatyzować, typ captcha obsługiwany dziś w Scarnox to PopularCaptcha. Przewodnik PopularCaptcha w Pythonie pokazuje przepływ tokena. Przeczytaj scrapowanie bez blokad, zanim dodasz więcej mechanizmów, bo samo tempo zwykle rozwiązuje więcej niż dodatkowe narzędzie.

Niektóre strony renderują ceny w JavaScripcie. Dla nich postępuj zgodnie z podejściem z scrapowania stron JavaScript.

Scrapuj odpowiedzialnie

Dalsze kroki

Zacznij z darmowym kredytem próbnym, bez karty: załóż konto i wypróbuj przepływ PopularCaptcha na stronie, którą wolno ci automatyzować. Aktualne stawki znajdziesz na stronie cennika.