From b75ad636dd5d64f14a09c5de88370361f65a8682 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Fri, 28 Nov 2025 23:57:51 +0100 Subject: [PATCH] feat: add product search orchestration service with direct, light scraper, and browserless methods --- app/services/search_service.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/services/search_service.py b/app/services/search_service.py index 4b6f66b..7665b38 100644 --- a/app/services/search_service.py +++ b/app/services/search_service.py @@ -137,8 +137,10 @@ async def search_products( results: list[SearchResultItem] = [] completed = 0 - # Créer un sémaphore pour limiter la concurrence + # Créer un sémaphore pour limiter la concurrence globale semaphore = asyncio.Semaphore(parallel_limit) + # Sémaphore spécifique pour Amazon (1 seul thread à la fois pour éviter le blocage) + amazon_semaphore = asyncio.Semaphore(1) async def process_url(search_result: direct_search_service.SearchResult) -> SearchResultItem | None: async with semaphore: @@ -176,7 +178,14 @@ async def search_products( # Fallback: Browserless + IA try: # Passer le navigateur partagé - result = await _scrape_with_browserless(url, site_name, domain, search_result.title, browser) + if "amazon" in domain.lower(): + async with amazon_semaphore: + # Petit délai supplémentaire entre les requêtes Amazon + await asyncio.sleep(2.0) + result = await _scrape_with_browserless(url, site_name, domain, search_result.title, browser) + else: + result = await _scrape_with_browserless(url, site_name, domain, search_result.title, browser) + return result except Exception as e: logger.error(f"Erreur scraping {url}: {e}")