import logging import re import time from typing import List, Dict, Any from app.extensions import db from app.models.lead import Lead from app.models.lead_interacao import LeadInteracao from app.utils.sanitizers import sanitize_phone, sanitize_cep from app.services.geocoding_service import GeocodingService logger = logging.getLogger(__name__) class ScraperService: @staticmethod def _extract_rating_and_reviews(detail_panel, text_fallback: str = "") -> tuple: """ Extrai a nota de avaliação (ex: 4.8) e o total de avaliações (ex: 150) específicos de cada estabelecimento no Google Maps. """ rating = 0.0 total_avaliacoes = 0 if detail_panel: # 1. Procurar elemento específico de nota (ex: ou ) star_elem = detail_panel.query_selector("[aria-label*='estrela'], [aria-label*='star'], span.ceYyJf, div.F7L8d") if star_elem: aria_txt = star_elem.get_attribute("aria-label") or star_elem.inner_text() m = re.search(r'([1-5][.,]\d)', aria_txt) if m: try: rating = float(m.group(1).replace(',', '.')) except ValueError: pass # 2. Procurar elemento específico de total de avaliações (ex: