Files
Priceflow/verify_bm_extraction.py
T

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())