Superset of the base Fragrantica.com Scraper — every base input, output field
and behaviour is preserved — plus:
🧬 1-hop neighbour enrichment: each perfume's "people who like this also
like" / "reminds me of" recommendations are freshly fetched and their real
main-accords + note pyramid extracted (overwrites the bare recommendation
cards).
🏆 Dupe / similarity scoring: deterministic notes-Jaccard + accord-cosine
overlap → overlapScore (0–1) and dupeScore (0–100), ranked similarityGraph
and topDupe per perfume. No AI.
🔑 Dynamic Algolia key harvest: the live secured search key (toAbby) and
app-id are harvested from the site at runtime — the previously hardcoded key
expired 2026-05-25, so search now keeps working across monthly key rotations.
New inputs: resolveSimilar, similarSource, maxSimilarPerItem,
includeSimilarChildren. New views: Dupes & Similarity, Similar Perfume Rows.
🛠️ Fetch engine swapped impit → curl_cffi (impersonate="chrome"): the
base's impit engine is now Cloudflare-403-blocked on Fragrantica (both http2
and http3); curl_cffi passes the JA3/HTTP2 fingerprint check. Static HTTP +
Algolia layers only; the Playwright browser layer is unchanged.