Product Requirements Document (PRD)
rpscrape Enhanced Fork - "rpscrape-pro"
Verzia: 1.0
Dátum: 2025-12-09
Status: In Development
Tento PRD definuje požiadavky na vylepšený fork projektu rpscrape s dôrazom na produkčnú stabilitu, profesionálny debugging, anti-ban ochranu a reálne použitie.
Vytvoriť produkčne-ready nástroj na scraping koňských dostihových dát, ktorý:
Funguje spoľahlivo bez manuálneho zásahu
Loguje všetky operácie pre debugging
Chráni sa pred IP banmi a detekciou
Automaticky sa zotavuje z chýb
1.3 Non-Goals (Čo NEROBÍME)
Web UI/Dashboard (nie je potrebné)
Multi-tenancy (jednouzívateľský nástroj)
Real-time streaming (batch processing stačí)
Komplexné ML predikcie (mimo scope)
FR-001: Scraping historických dát
ID
Požiadavka
Priorita
FR-001.1
Scrapovať výsledky pretekkov podľa regiónu
P0
FR-001.2
Scrapovať výsledky podľa závodiská
P0
FR-001.3
Scrapovať výsledky podľa dátumu/rozsahu
P0
FR-001.4
Filtrovať podľa typu (flat/jumps)
P0
FR-001.5
Inkrementálny scraping (len nové dáta)
P1
FR-002: Scraping racecards
ID
Požiadavka
Priorita
FR-002.1
Scrapovať aktuálne závodné karty
P0
FR-002.2
Získať detaily o koňoch a jazdcoch
P0
FR-002.3
Získať Betfair odds (ak dostupné)
P1
ID
Požiadavka
Priorita
FR-003.1
Export do CSV
P0
FR-003.2
Export do JSON
P0
FR-003.3
Export do gzip komprimovaného formátu
P1
FR-003.4
Konfigurovateľné polia exportu
P1
2.2 Non-funkčné požiadavky
ID
Požiadavka
Metrika
NFR-001.1
Úspešnosť scrapingu
>95% requestov úspešných
NFR-001.2
Automatické zotavenie z chýb
100% transient errors handled
NFR-001.3
Žiadna strata dát pri páde
Checkpointing každých 100 záznamov
ID
Požiadavka
Metrika
NFR-002.1
Rýchlosť scrapingu
Min 1 request/sekundu (bezpečná)
NFR-002.2
Pamäťová efektivita
Max 500MB RAM pre 10K záznamov
NFR-002.3
Concurrent connections
Konfigurovateľné 1-10
NFR-003: Bezpečnosť (Anti-Ban)
ID
Požiadavka
Metrika
NFR-003.1
Rotácia User-Agents
Min 50 rôznych UA
NFR-003.2
Rate limiting
Konfigurovateľné, default 1 req/s
NFR-003.3
Random delays
0.5-2s jitter medzi requestami
NFR-003.4
Session management
Automatická rotácia sessions
NFR-003.5
Proxy support
Voliteľná podpora proxy
ID
Požiadavka
Metrika
NFR-004.1
Structured logging
100% operácií logovaných
NFR-004.2
Log levels
DEBUG/INFO/WARNING/ERROR/CRITICAL
NFR-004.3
Log persistence
Rotované logy, max 100MB
NFR-004.4
Traceable requests
Každý request má unique ID
NFR-004.5
Performance metrics
Čas, success rate, data volume
3. TECHNICKÁ ŠPECIFIKÁCIA
┌─────────────────────────────────────────────────────────────┐
│ LOGGING PIPELINE │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Logger │────▶│ Processor │────▶│ Handler │ │
│ │ (source) │ │ (enrichment)│ │ (output) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ Processors: Handlers: │
│ • add_timestamp • Console (colored) │
│ • add_log_level • File (JSON lines) │
│ • add_request_id • File (human readable) │
│ • add_context • Rotating file handler │
│ • exception_info │
│ │
└─────────────────────────────────────────────────────────────┘
{
"timestamp" : " 2025-12-09T14:32:15.123456Z" ,
"level" : " INFO" ,
"logger" : " rpscrape.http_client" ,
"request_id" : " req_abc123" ,
"event" : " request_completed" ,
"url" : " https://www.racingpost.com/..." ,
"status_code" : 200 ,
"duration_ms" : 234 ,
"retry_count" : 0 ,
"context" : {
"region" : " gb" ,
"year" : 2024 ,
"race_type" : " flat"
}
}
Level
Použitie
DEBUG
Detailné info pre vývoj (selektory, raw data)
INFO
Normálne operácie (request start/end, records saved)
WARNING
Potenciálne problémy (retry, missing data)
ERROR
Chyby ktoré neprekazili operáciu
CRITICAL
Fatálne chyby vyžadujúce ukončenie
┌─────────────────────────────────────────────────────────────┐
│ ANTI-BAN SYSTEM │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Request Pipeline │ │
│ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │
│ │ │ Rate │─▶│ UA │─▶│Header│─▶│Delay │─▶│ Send │ │ │
│ │ │Limit │ │Rotate│ │Inject│ │Jitter│ │ │ │ │
│ │ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Response Pipeline │ │
│ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │
│ │ │ Ban │─▶│Captch│─▶│ Rate │─▶│ Log │ │ │
│ │ │Detect│ │Detect│ │ Adapt│ │ │ │ │
│ │ └──────┘ └──────┘ └──────┘ └──────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
3.2.2 User-Agent Rotation
Pool 50+ reálnych browser User-Agents
Weighted random selection (novšie browsery častejšie)
Konzistentný UA počas session
Platform-appropriate UAs (Windows, Mac, Linux)
3.2.3 Request Headers
STEALTH_HEADERS = {
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8' ,
'Accept-Language' : 'en-GB,en;q=0.9,en-US;q=0.8' ,
'Accept-Encoding' : 'gzip, deflate, br' ,
'Cache-Control' : 'no-cache' ,
'Pragma' : 'no-cache' ,
'Sec-Ch-Ua' : '"Not_A Brand";v="8", "Chromium";v="120"' ,
'Sec-Ch-Ua-Mobile' : '?0' ,
'Sec-Ch-Ua-Platform' : '"Windows"' ,
'Sec-Fetch-Dest' : 'document' ,
'Sec-Fetch-Mode' : 'navigate' ,
'Sec-Fetch-Site' : 'none' ,
'Sec-Fetch-User' : '?1' ,
'Upgrade-Insecure-Requests' : '1' ,
}
3.2.4 Rate Limiting Strategy
Scenár
Delay
Jitter
Normal
1.0s
±0.5s
After 429
30s
±10s
After error
5s
±2s
Burst detected
60s pause
-
Signál
Akcia
HTTP 403/429
Pause 60s, rotate session
CAPTCHA detected
Log + pause + alert
Empty response
Retry 3x, then skip
Connection reset
Backoff, check IP
3.3 Resilient HTTP Client
RETRY_CONFIG = {
'max_attempts' : 5 ,
'backoff_base' : 2 , # seconds
'backoff_max' : 60 , # seconds
'backoff_jitter' : True ,
'retry_on_status' : [500 , 502 , 503 , 504 , 520 , 521 , 522 , 523 , 524 ],
'retry_on_exception' : [
'ConnectionError' ,
'Timeout' ,
'SSLError' ,
'ChunkedEncodingError' ,
]
}
Stav
Podmienka
Akcia
CLOSED
Normal operation
Requesty prechádzajú
OPEN
5 failures in 60s
Všetky requesty blokované
HALF-OPEN
Po 120s v OPEN
Testovací request
3.4 Data Validation (Pydantic)
class RaceResult (BaseModel ):
race_id : str
date : date
course : str
race_name : str
distance_furlongs : float = Field (ge = 0 )
going : str
race_class : Optional [int ] = Field (None , ge = 1 , le = 7 )
prize_money : Optional [Decimal ] = Field (None , ge = 0 )
class Config :
extra = 'ignore' # Ignoruj neznáme polia
@validator ('distance_furlongs' , pre = True )
def parse_distance (cls , v ):
# Robustná konverzia
...
4.1 Fáza 1: Foundation (Týždeň 1)
4.2 Fáza 2: Core Fixes (Týždeň 2)
4.3 Fáza 3: Enhancement (Týždeň 3)
4.4 Fáza 4: Production Ready (Týždeň 4)
Metrika
Cieľ
Meranie
Scraping success rate
>95%
Úspešné/Celkové requesty
Ban rate
<1%
Ban events/Session
Recovery rate
100%
Auto-recovered/Total errors
Data completeness
>98%
Fields populated/Expected
Mean time to debug
<5 min
Log → Root cause time
Riziko
Pravdepodobnosť
Dopad
Mitigácia
Racing Post zmení HTML
Vysoká
Vysoký
Fallback selektory, alerting
IP ban
Stredná
Vysoký
Rate limiting, proxy support
API rate limits
Stredná
Stredný
Adaptive rate limiting
Data format changes
Stredná
Stredný
Pydantic validation + logging
[scraping ]
rate_limit = 1.0 # requests per second
max_concurrent = 3
timeout = 30
max_retries = 5
[anti_ban ]
rotate_user_agent = true
random_delay_min = 0.5
random_delay_max = 2.0
session_lifetime = 300 # seconds
[logging ]
level = " INFO"
file = " logs/rpscrape.log"
format = " json"
max_size_mb = 50
backup_count = 5
[export ]
format = " csv"
compress = false
output_dir = " data/"
# Základný scraping
rpscrape scrape --region gb --year 2024 --type flat
# S debug logovaním
rpscrape scrape --region gb --year 2024 --log-level DEBUG
# Racecards
rpscrape racecards --date today --region gb
# Resume po páde
rpscrape scrape --resume --checkpoint-file .checkpoint
# Dry run (test bez scrapingu)
rpscrape scrape --region gb --year 2024 --dry-run
Dokument schválený: 2025-12-09
Ďalšia revízia: Po Fáze 1