mirror of
https://github.com/R0m1k3/Priceflow.git
synced 2026-10-12 01:39:25 +02:00
92 lines
3.6 KiB
Python
92 lines
3.6 KiB
Python
import asyncio
|
|
import logging
|
|
import sys
|
|
from playwright.async_api import async_playwright
|
|
from app.services.ai_price_extractor import AIPriceExtractor
|
|
from app.services.improved_search_service import ImprovedSearchService
|
|
from app.core.search_config import SITE_CONFIGS
|
|
|
|
# Configure logging
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
async def verify_bm():
|
|
async with async_playwright() as p:
|
|
browser = await p.chromium.launch(headless=True)
|
|
page = await browser.new_page()
|
|
|
|
# 1. Perform Search to get a product URL
|
|
logger.info("--- Step 1: Searching for 'Chaise pliante pu creme' on B&M ---")
|
|
# Use specific search to find the problematic product
|
|
search_url = "https://bmstores.fr/module/ambjolisearch/jolisearch?s=Chaise+pliante+pu+creme"
|
|
await page.goto(search_url)
|
|
await page.wait_for_load_state("networkidle")
|
|
|
|
# Take screenshot of search results
|
|
await page.screenshot(path="bm_search_results.png")
|
|
logger.info("Screenshot saved: bm_search_results.png")
|
|
|
|
# Get first product link
|
|
product_link = await page.get_attribute("a.thumbnail.product-thumbnail", "href")
|
|
if not product_link:
|
|
logger.error("No product found in search")
|
|
return
|
|
|
|
if not product_link.startswith("http"):
|
|
product_link = "https://www.bmstores.fr" + product_link
|
|
|
|
logger.info(f"Testing Product URL: {product_link}")
|
|
|
|
# 2. Go to Product Page
|
|
await page.goto(product_link)
|
|
await page.wait_for_load_state("networkidle")
|
|
await page.screenshot(path="bm_product_page.png")
|
|
logger.info("Screenshot saved: bm_product_page.png")
|
|
|
|
# 3. Dump HTML snippet (price area)
|
|
content = await page.content()
|
|
logger.info(f"HTML Content Length: {len(content)}")
|
|
|
|
# Check for 12.95
|
|
if "12,95" in content or "12.95" in content:
|
|
logger.info("✅ Price 12.95 found in raw HTML")
|
|
else:
|
|
logger.warning("❌ Price 12.95 NOT found in raw HTML")
|
|
|
|
# 4. Test JSON-LD
|
|
logger.info("\n--- Step 2: Testing JSON-LD ---")
|
|
json_ld_scripts = await page.query_selector_all('script[type="application/ld+json"]')
|
|
for i, script in enumerate(json_ld_scripts):
|
|
text = await script.inner_text()
|
|
logger.info(f"JSON-LD #{i}: {text[:500]}...")
|
|
|
|
# 5. Test CSS Selectors
|
|
logger.info("\n--- Step 3: Testing CSS Selectors ---")
|
|
selectors = [
|
|
'.price-current', '.prix-actuel', '.sale-price', '.promo-price',
|
|
'.price', '[data-testid="price"]', '[itemprop="price"]', '.product-price',
|
|
'.current-price-value'
|
|
]
|
|
for sel in selectors:
|
|
elements = await page.query_selector_all(sel)
|
|
for el in elements:
|
|
text = await el.inner_text()
|
|
logger.info(f"Selector '{sel}': {text.strip()}")
|
|
|
|
# 6. Test AI Extraction
|
|
logger.info("\n--- Step 4: Testing AI Extraction (Gemma 3) ---")
|
|
title = await page.title()
|
|
|
|
# Ensure API key is available
|
|
import os
|
|
if not os.getenv("OPENROUTER_API_KEY"):
|
|
logger.warning("OPENROUTER_API_KEY not set in env, AI might fail")
|
|
|
|
ai_price = await AIPriceExtractor.extract_price(content, title)
|
|
logger.info(f"AI Extracted Price: {ai_price}")
|
|
|
|
await browser.close()
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(verify_bm())
|