Druni Perfume Prices Scraper (Spain, Promo & Stock)
Pricing
from $2.00 / 1,000 priced product delivereds
Druni Perfume Prices Scraper (Spain, Promo & Stock)
Structured Druni (Spain perfumery) product rows as JSON: current price, crossed-out promo price, brand, category, bottle size and stock; one row per size variant. Monitor mode (lastRunKey) flags price changes; unchanged products are not billed. HTTP-only, no login, pay per delivered row.
Pricing
from $2.00 / 1,000 priced product delivereds
Rating
0.0
(0)
Developer
Steadfetch
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
Spain Perfume Prices Scraper (EAN, Promo, Stock)
Structured, schema-validated prices for the Spain perfumery market: give it public product pages and it returns one row per product (per bottle size for variant products) with the current price, the crossed-out regular price on promotions, the EAN when the page exposes it, bottle size and availability. The storefront offers neither a catalogue download nor an API - this Actor turns the public product pages into comparable data. HTTP only: no browser, no login, no CAPTCHAs.
What it does
This section summarizes the run contract; the exact row shape is below.
Example output
- Input: product page URLs (or bare slugs) from the storefront, plus optional monitor mode.
- Output: one dataset row per priced product:
{"retailer": "druni","brand": "SHAKIRA","name": "Rojo Elixir","category": "Perfumes > Fragancias Low Cost > Fragancias Mujer","url": "https://www.druni.es/rojo-elixir-shakira-eau-parfum-mujer","price_eur": 19.95,"old_price_eur": null,"in_promo": false,"size_ml": 80,"availability": "in_stock","first_seen_at": "2026-10-26T12:00:00.000Z","last_seen_at": "2026-10-26T12:00:00.000Z","price_changed": false}
- Variant products (one fragrance sold in 30/50/100 ml) emit one row per size with each size's own price, so catalogues stay comparable by size.
- Monitor mode: set
lastRunKeyto compare against the previous run -price_changedflags re-pricings, unchanged products are reported as run notes and billed 0.
Pricing
2.50 USD per 1,000 priced products (apify-default-dataset-item), plus the Apify default run-start event (apify-actor-start). Pages without a public price and unchanged monitor checks are never pushed, so they are never billed.
Works on the Apify free plan: with the 5 USD monthly credit, about 1,999 priced products can be delivered per month (N = floor((5.00 - 0.00005) / 0.0025)).
Measured cost basis (2026-10-26, local run, 256 MB slice): the example run (2 pages, 4 rows) took 4.0 s wall (about 0.0001 USD of platform compute); at scale the 2 s request pacing dominates - 1,000 priced products are about 435 pages and 25 minutes, roughly 0.03 USD of compute per 1,000 products. The 2.50 USD/1k price keeps a ~80x margin over measured cost. Competitor anchor: the perfumery cluster leads sell at 2.35 USD/1k (20 monthly users) with no Spain-coverage equivalent - see the demand sheet behind this Actor.
Why input-driven discovery
The storefront renders its category listings client-side (verified 2026-10-26: the static category HTML contains only sponsored cards; ?p=2, XHR, browser-grade TLS and archived snapshots all show the same). Product pages, in contrast, are fully static. The Actor therefore takes explicit product URLs - where to find them: browse the public category pages in any browser. Each run fetches only the pages you list, which keeps runs fast, cheap and polite (2 s minimum interval between requests).
Legality & politeness
- Only public catalogue pages: no login, no paywall, no CAPTCHA solving, no personal data.
- robots.txt respected: every request passes a hardcoded allow-list (clean product pages + sitemap endpoints); filtered, sessionized and application paths are structurally unreachable from the code.
- The source's edge rejects non-browser User-Agent strings (HTTP 406, verified), so the client sends a standard browser User-Agent. All requests are polite (>=2 s spacing, retries with backoff) and identified as automated traffic by behaviour; no anti-bot circumvention beyond the User-Agent header is used.
- Source ToS (purchase conditions, checked 2026-10-26) contains no clause forbidding automated reading of public catalogue pages.
FAQ
Does it need proxies or a browser? No. Product pages are static HTML; the Actor is HTTP + Cheerio only.
Why does my category URL not work? Category pages are input-driven by design (see above). Pass product page URLs, for example https://www.druni.es/rojo-elixir-shakira-eau-parfum-mujer or the bare slug.
How fresh are the prices? As fresh as the run: every run fetches the pages again and re-parses the live price.
What does availability mean? in_stock, out_of_stock, preorder or unknown, mapped from the page's structured data.
Is one row one billed item? Yes - and only rows with an extracted price are emitted. Empty results are recorded as run notes, free.
Maintenance
Maintained by Steadfetch and tested daily: a scheduled run with the example input is validated against the output schema every day, and the source is re-checked for structural changes.
This Actor bills per delivered row only. Watchdog-style Actors that bill a check even when nothing changed use the reserved monitor-check event instead (see the repo CONTRIBUTING guide); that pattern does not apply here because the source exposes no server-side listing to watch.
Tested daily
This Actor is enrolled in the Steadfetch daily QA: a scheduled run with the example input is validated against the output schema every day. See the Tested daily note on the Apify Store listing.