rates/backend/services
jtricerolph bb37fcf501 Add hotel-page scraper backend with full room/rate plan extraction
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>
2026-07-09 23:08:03 +00:00
..
direct_profiles Add Rate Monitor app — Booking.com + direct booking engine competitor rates 2026-07-05 12:06:30 +00:00
scraper_backends Add hotel-page scraper backend with full room/rate plan extraction 2026-07-09 23:08:03 +00:00
__init__.py Add Rate Monitor app — Booking.com + direct booking engine competitor rates 2026-07-05 12:06:30 +00:00
booking_scraper.py Add hotel-page scraper backend with full room/rate plan extraction 2026-07-09 23:08:03 +00:00
central_settings.py Add Rate Monitor app — Booking.com + direct booking engine competitor rates 2026-07-05 12:06:30 +00:00
direct_scraper.py Extract shared proxy module; make it available to direct scraper; remove dead code 2026-07-05 22:55:24 +00:00
newbook_rates_client.py Port occupancy sync + category ordering from the forecasting version 2026-07-05 14:18:03 +00:00
proxy.py Fix proxy 407 round-trip causing 14s latency per page.goto() 2026-07-09 20:14:09 +00:00