diff --git a/backend/services/booking_scraper.py b/backend/services/booking_scraper.py index 7a1e48a..32e8cc8 100644 --- a/backend/services/booking_scraper.py +++ b/backend/services/booking_scraper.py @@ -318,7 +318,7 @@ async def scrape_hotel_date( backend: 'PlaywrightHotelPageBackend', batch_id: uuid.UUID, adults: int = 2, - max_retries: int = 2, + max_retries: int = 4, ) -> Dict[str, Any]: """ Scrape all rate plans for one hotel on one date via the hotel page backend. diff --git a/backend/services/scraper_backends/playwright_hotel_page.py b/backend/services/scraper_backends/playwright_hotel_page.py index 387ccbb..b7ecb4d 100644 --- a/backend/services/scraper_backends/playwright_hotel_page.py +++ b/backend/services/scraper_backends/playwright_hotel_page.py @@ -298,7 +298,11 @@ class PlaywrightHotelPageBackend(ScraperBackend): logger.warning(f"goto timeout for {hotel_url} {check_in}: {e}") if not page_loaded: - return ScraperResult(success=False, blocked=False, error_message='page load timeout') + # Treat as a retryable block — DataImpulse endpoints are intermittently + # broken (EOF after CONNECT); rotating to a fresh context hits a different + # endpoint and usually succeeds within 1-2 retries. + await self._rotate_context() + return ScraperResult(success=False, blocked=True, block_reason='page load timeout') # Wait for the room table (prices render via JS after DOM) room_table_appeared = False