Switches booking.com scraping from search-results page (Cloudflare-targeted) to individual hotel property pages (not CF-protected). Each page load returns all room types, all rate plan variants (room-only/B&B × refundable/non-ref × 1-2 adults), and availability counts. Key changes: - New PlaywrightHotelPageBackend: proxy reuse until block, rotate on CF/WAF - booking_scraper.py: _run_hotel_page_scrape(), scrape_hotel_date(), _scrape_hotels_concurrent() — sharded by hotel so one proxy session covers all dates for one hotel (looks human) - schema.sql: ADD COLUMN rate_plan_id, max_persons on booking_com_rates - competitors API: filter max_persons=2, order by rate_gross ASC as tiebreaker so DISTINCT ON returns cheapest 2-adult rate from latest batch Enable via Settings → Scraper Backend → playwright_hotel_page Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
22 lines
658 B
Python
22 lines
658 B
Python
"""
|
|
Scraper backends for booking.com rate scraping.
|
|
|
|
Provides pluggable backends to allow switching between:
|
|
- playwright_local: Direct Playwright (default)
|
|
- playwright_proxy: Playwright with rotating proxies (future)
|
|
- apify_backend: Apify scraping service (future)
|
|
"""
|
|
|
|
from .base import ScraperBackend, ScraperResult, HotelData, RateData, AvailabilityStatus
|
|
from .playwright_local import PlaywrightLocalBackend
|
|
from .playwright_hotel_page import PlaywrightHotelPageBackend
|
|
|
|
__all__ = [
|
|
'ScraperBackend',
|
|
'ScraperResult',
|
|
'HotelData',
|
|
'RateData',
|
|
'AvailabilityStatus',
|
|
'PlaywrightLocalBackend',
|
|
'PlaywrightHotelPageBackend',
|
|
]
|