feat: Replace DuckDuckGo with direct site search

- Remove duckduckgo-search dependency (unreliable results)
- Add direct_search_service.py that scrapes sites' search pages directly
- Add search_url and product_link_selector fields to SearchSite model
- Add beautifulsoup4 and lxml for HTML parsing
- Update schemas with new fields
- Add database migration for new columns

Direct search is more reliable as it queries each site's own search
functionality instead of relying on external search engines.
This commit is contained in:
Claude committed 2025-11-22 15:00:49 +00:00
1 parent 6f5b50a372
commit 3b095801c5
7 files changed
+379 -198

No files matched your search

+15 -9
View File
@@ -53,15 +53,21 @@ def run_migrations():
conn.commit()
logger.info("search_sites table created")
else:
# 2. Add price_selector column if missing
result = conn.execute(text(
"SELECT 1 FROM information_schema.columns WHERE table_name = 'search_sites' AND column_name = 'price_selector'"
))
if not result.fetchone():
logger.info("Adding price_selector column to search_sites...")
conn.execute(text("ALTER TABLE search_sites ADD COLUMN price_selector VARCHAR(512)"))
conn.commit()
logger.info("price_selector column added")
# 2. Add missing columns
columns_to_add = [
("price_selector", "VARCHAR(512)"),
("search_url", "VARCHAR(1024)"),
("product_link_selector", "VARCHAR(512)"),
]
for col_name, col_type in columns_to_add:
result = conn.execute(text(
f"SELECT 1 FROM information_schema.columns WHERE table_name = 'search_sites' AND column_name = '{col_name}'"
))
if not result.fetchone():
logger.info(f"Adding {col_name} column to search_sites...")
conn.execute(text(f"ALTER TABLE search_sites ADD COLUMN {col_name} {col_type}"))
conn.commit()
logger.info(f"{col_name} column added")
@asynccontextmanager