Druni Perfume Prices Scraper (Spain, Promo & Stock) avatar

Druni Perfume Prices Scraper (Spain, Promo & Stock)

Pricing

from $2.00 / 1,000 priced product delivereds

Go to Apify Store
Druni Perfume Prices Scraper (Spain, Promo & Stock)

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

Steadfetch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

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 lastRunKey to compare against the previous run - price_changed flags 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.