# Cosmetics Druni App (`kaidev/cosmetics-druni-app`) Actor

This Apify actor scrapes product information from Druni’s makeup category. It fetches details such as product names, categories, subcategories, prices, and URLs. The actor supports subcategory aliasing, input validation, and uses PuppeteerCrawler for reliable data extraction.

- **URL**: https://apify.com/kaidev/cosmetics-druni-app.md
- **Developed by:** [Kaidev](https://apify.com/kaidev) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Druni Cosmetics Scraper

This Apify Actor extracts **cosmetics and makeup products** from **Druni.es** with detailed product information including prices, descriptions, ingredients and beauty tips.

It's designed for **market research, price monitoring, product cataloging and competitive analysis** in the cosmetics industry.

***

### Features

- **Comprehensive Product Data**: Extract product titles, brands, prices, descriptions, ingredients and beauty tips
- **Smart Category Navigation**: Support for 9 main categories and 50+ subcategories
- **Price Monitoring**: Track current prices, old prices and discount percentages
- **Automatic Pagination**: Navigate through all product pages automatically
- **Robust Error Handling**: Built-in retry logic and fallback selectors
- **Proxy Support**: Built-in Apify Proxy integration for reliable scraping

***

### Supported Categories

#### Main Categories

- **Eyes** (ojos) - Mascaras, eyeliners, eyeshadows, eyebrows, primers
- **Face** (rostro) - Foundations, primers, powders, blushes, contouring
- **Nails** (uñas) - Nail polishes, removers, treatments, accessories
- **Lips** (labios) - Lipsticks, glosses, lip liners, volumizers
- **Accessories** (complementos) - Brushes, sponges, organizers, mirrors
- **Palettes** (paletas) - Eyeshadow palettes, blush palettes, contouring sets
- **Cases** (maletines) - Makeup cases and organizers
- **Sets** (estuches-sets) - Makeup sets and collections
- **New Arrivals** (novedades) - Latest products
- **Body Care** (corporal) - Body cosmetics

#### Subcategories

Each main category includes multiple specific subcategories for precise targeting.

***

### Input Configuration

The scraper accepts the following input parameters:

```json
{
  "category": "ojos",
  "subcategory": "mascaras-pestanas",
  "minimumPrice": 0,
  "maximumPrice": 100
}
```

OR

```json
{
  "category": "maletines",
  "subcategory": "",
  "minimumPrice": 0,
  "maximumPrice": 15
}
```

| Field | Type | Description | Required | Default |
|-------|------|-------------|----------|---------|
| `category` | String | Main product category | ✅ | - |
| `subcategory` | String | Specific subcategory | ❌ | "" (all subcategories) |
| `minimumPrice` | number | \[Filter] Minimum price. | ❌ | - |
| `maximumPrice` | number | \[Filter] Maximum price. Must be provided if `minimumPrice` is set. | ❌ | - |

#### Available Categories

**Eyes (ojos)**

- Mascara de pestañas (mascaras-pestanas)
- Delineadores de Ojos (delineadores-eyeliners)
- Sombras de Ojos (sombras)
- Cejas (cejas)
- Prebases para Ojos (prebases\_ojos)
- Primer de Pestañas (primer-pestanas)
- Pestañas Postizas (pestanas-postizas)

**Face (rostro)**

- Bases de Maquillaje (bases)
- Prebases de Maquillaje (prebases\_rostro)
- Polvos de Maquillaje (polvos)
- Coloretes (coloretes\_rostro)
- Contorno Maquillaje (contouring-contorno)
- Bronceadores (bronceadores)
- Correctores de Maquillaje (correctores\_rostro)
- Iluminadores Maquillaje (iluminadores)
- Fijadores Maquillaje (fijadores)
- BB cream (bb-cream)
- CC cream (cc-cream)

**Nails (uñas)**

- Lacas y Esmaltes Uñas (lacas-esmaltes)
- Quitaesmaltes (quitaesmaltes)
- Tratamientos para Uñas (tratamientos)
- Accesorios para Uñas (accesorios)
- Uñas Postizas (postizas)
- Base Coat & Top Coat (top-base-coat)
- Lámparas Led (lamparas-led)
- Pegatinas para Uñas (pegatinas)

**Lips (labios)**

- Pintalabios (pintalabios)
- Gloss de Labios (gloss)
- Perfiladores de Labios (perfiladores)
- Voluminizadores (voluminizador)
- Prebases (prebases)

**Accessories (complementos)**

- Brochas y Pinceles (brochas-pinceles)
- Esponjas de Maquillaje (esponjas)
- Organizadores (organizadores)
- Neceseres (neceseres)
- Rizador de Pestañas (rizador-pestanas)
- Espejos maquillaje (espejos)
- Sacapuntas (sacapuntas)

**Palettes (paletas)**

- Sombras de Ojos (sombras-ojos)
- Coloretes (coloretes\_paletas)
- Contouring (contouring)
- Labios (labios)
- Correctores (correctores\_paletas)
- Profesional (profesionales)
- Baratas (low-cost)

***

### Form Selection

<img width="800" height="auto" alt="Admin dashboard example" src="form_option.png">

***

### Output

Results are stored in the Apify Dataset and can be downloaded as JSON, CSV, Excel, or other formats.

#### Product Data Structure

```json
{
  "category": "ojos",
  "subcategory": "mascaras-pestanas",
  "url": "https://www.druni.es/mascara-pestañas-example",
  "brand": "L'Oréal",
  "title": "Volume Million Lashes Mascara",
  "finalPrice": "12,95 €",
  "oldPrice": "15,95 €",
  "discountPercentage": "19%",
  "description": "Máscara de pestañas que proporciona volumen y longitud...",
  "beautyTips": "Aplica desde la raíz hasta las puntas...",
  "ingredients": "Aqua, Paraffinum Liquidum, Cera Carnauba...",
  "date": "2024-01-15T10:30:00.000Z"
}
```

#### Output Fields

| Field | Type | Description |
|-------|------|-------------|
| `category` | String | Main product category |
| `subcategory` | String | Product subcategory |
| `url` | String | Product page URL |
| `brand` | String | Product brand/manufacturer |
| `title` | String | Product name |
| `finalPrice` | String | Current selling price |
| `oldPrice` | String | Original price (if on sale) |
| `discountPercentage` | String | Discount percentage |
| `description` | String | Product description |
| `beautyTips` | String | Beauty application tips |
| `ingredients` | String | Product ingredients list |
| `date` | String | Scraping timestamp |

***

### Technical Details

#### Architecture

- **Framework**: Crawlee + Puppeteer
- **Language**: TypeScript
- **Platform**: Apify Actor
- **Browser**: Headless Chrome via Puppeteer

#### Performance

- **Concurrency**: 5 parallel requests
- **Retry Logic**: Built-in error handling and retries
- **Proxy Support**: Apify Proxy integration

#### Error Handling

- Robust selector fallbacks
- Comprehensive error logging
- Graceful failure handling
- Automatic retry mechanisms

***

### Resources

- [Crawlee Documentation](https://crawlee.dev/docs)
- [Apify Platform Guide](https://crawlee.dev/docs/guides/apify-platform)
- [Apify SDK for JavaScript](https://docs.apify.com/sdk/js)
- [Apify Dataset Storage](https://docs.apify.com/sdk/js/docs/guides/result-storage#dataset)
- [Join Apify Community on Discord](https://discord.com/invite/jyEM2PRvMU)

***

### License

ISC License

# Actor input Schema

## `category` (type: `string`):

Select your category

## `subcategory` (type: `string`):

Select your sub category

## `minimumPrice` (type: `integer`):

Minimum price value filter.

## `maximumPrice` (type: `integer`):

Maximum price value filter

## Actor input object example

```json
{
  "category": "maletines",
  "subcategory": "",
  "minimumPrice": 0,
  "maximumPrice": 15
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("kaidev/cosmetics-druni-app").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("kaidev/cosmetics-druni-app").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call kaidev/cosmetics-druni-app --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kaidev/cosmetics-druni-app",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/P48t4S5MF0JWEZ7Mm/builds/B8g7E77fCxnREyOCK/openapi.json
