diff --git a/app/routers/amazon.py b/app/routers/amazon.py index f79d5e9..1eb629b 100644 --- a/app/routers/amazon.py +++ b/app/routers/amazon.py @@ -31,7 +31,7 @@ class AmazonSearchProgress(BaseModel): @router.get("/search") async def search_amazon( q: str = Query(..., min_length=1, description="Terme de recherche"), - max_results: int = Query(20, ge=1, le=50, description="Nombre max de résultats"), + max_results: int = Query(50, ge=1, le=100, description="Nombre max de résultats"), ): """ Recherche de produits sur Amazon France. diff --git a/app/services/amazon_scraper_service.py b/app/services/amazon_scraper_service.py index 965e6c0..b0c6c52 100644 --- a/app/services/amazon_scraper_service.py +++ b/app/services/amazon_scraper_service.py @@ -277,7 +277,7 @@ class AmazonScraperService: pass @classmethod - async def scrape_search(cls, query: str, max_results: int = 20) -> list[AmazonProduct]: + async def scrape_search(cls, query: str, max_results: int = 50) -> list[AmazonProduct]: """ Scrape Amazon France search results diff --git a/app/services/tracking_scraper_service.py b/app/services/tracking_scraper_service.py index 73cabcc..520428c 100644 --- a/app/services/tracking_scraper_service.py +++ b/app/services/tracking_scraper_service.py @@ -175,7 +175,7 @@ class TrackingScraperService: if selector: await TrackingScraperService._wait_for_selector(page, selector) else: - await TrackingScraperService._auto_detect_price(page) + await TrackingScraperService._auto_detect_price(page, url) if config.smart_scroll: await TrackingScraperService._smart_scroll(page, scroll_pixels) @@ -336,8 +336,33 @@ class TrackingScraperService: logger.warning(f"Selector {selector} not found or timed out: {e}") @staticmethod - async def _auto_detect_price(page: Page): - logger.info("No selector provided. Attempting to find price element...") + async def _auto_detect_price(page: Page, url: str = ""): + logger.info("No selector provided. Attempting to find product area...") + + # Amazon-specific handling to ensure we capture the product, not reviews + if "amazon" in url.lower(): + logger.info("🛒 Amazon detected - targeting main product area") + amazon_selectors = [ + "#imgTagWrapperId", # Main image + "#main-image-container", # Main image container + "#productTitle", # Product title + "#ppd", # Product Page Desktop (main container) + "#centerCol", # Center column + ] + + for selector in amazon_selectors: + try: + if await page.locator(selector).count() > 0: + logger.info(f"Found Amazon product area: {selector}") + element = page.locator(selector).first + await element.scroll_into_view_if_needed() + # Scroll up a bit to ensure header is visible/good framing + await page.evaluate("window.scrollBy(0, -100)") + return + except Exception: + pass + + # Generic fallback: look for price try: price_locator = page.locator("text=/$[0-9,]+(\\.[0-9]{2})?/") if await price_locator.count() > 0: diff --git a/frontend/src/pages/AmazonSearch.jsx b/frontend/src/pages/AmazonSearch.jsx index 3a987c5..fe95ff9 100644 --- a/frontend/src/pages/AmazonSearch.jsx +++ b/frontend/src/pages/AmazonSearch.jsx @@ -37,7 +37,7 @@ export default function AmazonSearch() { // Construire l'URL avec les paramètres const params = new URLSearchParams({ q: query.trim(), - max_results: 20, + max_results: 50, }); // Créer l'EventSource pour SSE @@ -103,8 +103,8 @@ export default function AmazonSearch() { ))}