diff --git a/backend/services/scraper_backends/playwright_local.py b/backend/services/scraper_backends/playwright_local.py index 710e6d2..660ec84 100644 --- a/backend/services/scraper_backends/playwright_local.py +++ b/backend/services/scraper_backends/playwright_local.py @@ -550,6 +550,22 @@ class PlaywrightLocalBackend(ScraperBackend): await self.rotate_session() await asyncio.sleep(random.uniform(1.0, 2.0)) + # All proxy attempts exhausted — fall back to direct connection. The + # server's own IP may be cleaner than the proxy pool currently assigned. + if self._proxy_enabled(): + logger.warning( + f"All {max_attempts} proxy attempt(s) failed for {check_in} — " + "falling back to direct connection" + ) + saved_proxy = self.proxy_config + self.proxy_config = {} + await self.rotate_session() # closes proxy browser so next _ensure_context starts fresh + try: + result = await self._scrape_once( + location, check_in, check_out, adults, pages, dest_id, location_params) + finally: + self.proxy_config = saved_proxy + return result async def _scrape_once(