From 5d7f872dae09c86dbc92d025dbf296467e31effd Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Sat, 29 Nov 2025 17:28:59 +0100 Subject: [PATCH] feat: Add new search service for multi-site product search and item detail scraping. --- app/core/search_config.py | 8 ++---- app/services/search_service.py | 52 +++++++++++++++++++++++++--------- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/app/core/search_config.py b/app/core/search_config.py index 1046641..7fc6450 100644 --- a/app/core/search_config.py +++ b/app/core/search_config.py @@ -82,11 +82,9 @@ SITE_CONFIGS = { "name": "Action", "search_url": "https://www.action.com/fr-fr/search/?q={query}", "product_selector": "a.group[href^='/fr-fr/p/']", - "search_url": "https://www.amazon.fr/s?k={query}", - "product_selector": "div[data-asin]:not([data-asin='']) h2 a", - "wait_selector": "[data-component-type='s-search-result']", - "category": "E-commerce", - "requires_proxy": True, + "wait_selector": "a.group[href^='/fr-fr/p/']", + "category": "Discount", + "requires_proxy": False, }, "cdiscount.com": { "name": "Cdiscount", diff --git a/app/services/search_service.py b/app/services/search_service.py index 77ac364..779cce4 100644 --- a/app/services/search_service.py +++ b/app/services/search_service.py @@ -356,15 +356,19 @@ def update_site(db: Session, site_id: int, site_data: dict[str, Any]) -> SearchS return site def seed_default_sites(db: Session) -> int: - """Initialise la base de données avec les sites configurés""" + """Initialise ou met à jour la base de données avec les sites configurés""" + updated_count = 0 created_count = 0 - existing_domains = {site.domain.lower().replace("www.", "") for site in db.query(SearchSite).all()} + + # Get all existing sites mapped by domain + existing_sites = { + site.domain.lower().replace("www.", ""): site + for site in db.query(SearchSite).all() + } for domain, config in SITE_CONFIGS.items(): clean_domain = domain.lower().replace("www.", "") - if clean_domain in existing_domains: - continue - + site_data = { "name": config.get("name", domain), "domain": domain, @@ -376,16 +380,36 @@ def seed_default_sites(db: Session) -> int: "is_active": True, } - try: - site = SearchSite(**site_data) - db.add(site) - db.commit() - created_count += 1 - except Exception as e: - db.rollback() - logger.error(f"Erreur création site {domain}: {e}") + if clean_domain in existing_sites: + # Update existing site + site = existing_sites[clean_domain] + changed = False + for key, value in site_data.items(): + if getattr(site, key) != value: + setattr(site, key, value) + changed = True + + if changed: + try: + db.commit() + updated_count += 1 + logger.info(f"Site mis à jour: {domain}") + except Exception as e: + db.rollback() + logger.error(f"Erreur mise à jour site {domain}: {e}") + else: + # Create new site + try: + site = SearchSite(**site_data) + db.add(site) + db.commit() + created_count += 1 + logger.info(f"Nouveau site créé: {domain}") + except Exception as e: + db.rollback() + logger.error(f"Erreur création site {domain}: {e}") - return created_count + return created_count + updated_count def reset_sites_to_defaults(db: Session) -> int: """Réinitialise tous les sites"""