# Lookfantastic Product Search Scraper (`stealth_mode/lookfantastic-product-search-scraper`) Actor

Scrape product listings from Lookfantastic.com search and category pages instantly. Collect names, brands, prices, discounts, variants, and more — perfect for price monitoring, market research, and competitor analysis in the beauty industry.

- **URL**: https://apify.com/stealth\_mode/lookfantastic-product-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Lookfantastic.com Product Scraper: Extract Beauty Search Results at Scale

---

### What Is Lookfantastic.com?

Lookfantastic.com is one of Europe's largest online beauty retailers, offering thousands of products across skincare, makeup, haircare, and wellness categories. Its extensive catalog and frequent promotional activity make it a valuable source of competitive intelligence for brands, retailers, and analysts.

Manually tracking product listings, prices, and promotional data across hundreds of category pages is impractical. The **Lookfantastic.com Product Search Scraper** automates this entirely — extracting structured product data from any search or category URL in minutes.

---

### Overview

The **Lookfantastic Product Scraper** collects product data directly from category and search result pages on Lookfantastic.com. It is built for:

- **E-commerce analysts** monitoring pricing and discount trends
- **Brand managers** auditing how their products appear in listings
- **Retailers** benchmarking competitor assortment and promotions
- **Data scientists** building beauty market datasets
- **Developers** feeding product data into aggregators or recommendation engines

The scraper supports bulk URL input, configurable item limits, and graceful error handling — making it suitable for both one-off exports and recurring data pipelines.

---

### Input Format

The scraper accepts a simple JSON configuration:

```json
{
  "urls": [
    "https://www.lookfantastic.com/c/health-beauty/make-up/view-all-make-up/?pageNumber=1"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 200
}
````

#### Field Descriptions

| Field | Type | Default | Description |
|---|---|---|---|
| `urls` | array | — | One or more Lookfantastic category or search result page URLs. Supports single entry or bulk list. |
| `ignore_url_failures` | boolean | `true` | When enabled, the scraper continues running if individual URLs fail, rather than stopping the entire run. Recommended for bulk jobs. |
| `max_items_per_url` | integer | `20` | Maximum number of products to collect per URL. Set higher (e.g., `200`) to capture full category pages. |

#### Tips for Building Good Input URLs

- Navigate to any **category page** (e.g., `/c/health-beauty/make-up/`) or **search results page** on Lookfantastic.com
- Use pagination parameters (`?pageNumber=2`, `?pageNumber=3`) to scrape across multiple pages
- Avoid URLs that require login or session tokens to render products
- Affiliate tracking parameters (e.g., `?awc=...`) in the URL do not affect scraper behavior and can be left in or removed

***

### Output Format

#### Sample Output Record

```json
{
  "item_id": 10785711,
  "item_name": "NARS Radiant Creamy Concealer",
  "item_list_id": "",
  "item_list_name": "Shop All Makeup",
  "url": "/p/nars-cosmetics-radiant-creamy-concealer-various-shades/10785711/",
  "brand": "NARS",
  "price": "29.5",
  "value": "28.0",
  "discount": "1.50",
  "index": 9,
  "variant": "Chantilly",
  "item_list": "Shop All Makeup",
  "promo": "Save 5% + Extra 5% off | Use Code: EXTRA",
  "total_variants": 27,
  "from_url": "https://www.lookfantastic.com/c/health-beauty/make-up/view-all-make-up/?awc=6712_1780290720_fa4c13a245d5b3af63b12e963e2ed76f&pageNumber=2"
}
```

Each scraped product returns a flat record with 14 fields covering identity, pricing, promotion, and variant data:

#### Product Identity

| Field | Meaning |
|---|---|
| `Item ID` | Unique internal product identifier used by Lookfantastic (typically a numeric SKU) |
| `Item Name` | Full product name as displayed on the listing (e.g., *Charlotte Tilbury Pillow Talk Lipstick*) |
| `URL` | Direct link to the product detail page on Lookfantastic.com |
| `Brand` | Brand name associated with the product (e.g., *The Ordinary*, *Fenty Beauty*) |
| `Variant` | Specific variant shown in the listing (e.g., shade, size, or formula) |
| `Total Variants` | Total number of variants available for this product across the site |

#### Pricing & Value

| Field | Meaning |
|---|---|
| `Price` | Current selling price displayed to the user (may reflect sale or promotional pricing) |
| `Value` | Original or full retail value before any discount is applied |
| `Discount` | Discount amount or percentage applied to the product, if any |

#### List & Category Context

| Field | Meaning |
|---|---|
| `Item List ID` | Internal identifier for the product list or category page the item was found on |
| `Item List Name` | Human-readable name of the list or category (e.g., *View All Make-Up*) |
| `Item List` | Structured reference combining list ID and name for downstream data mapping |
| `Index` | Position of the product within the listing page (1-based), useful for ranking analysis |

#### Promotional Data

| Field | Meaning |
|---|---|
| `Promo` | Any active promotional label or campaign tag associated with the product (e.g., *3 for 2*, *20% off*) |

> **Note:** Field values above are illustrative examples only. Actual values depend on live site data at the time of scraping.

***

### How to Use

1. **Find your target URL** — Browse Lookfantastic.com and navigate to the category or search results page you want to extract. Copy the full URL from your browser.
2. **Paste into `urls`** — Add one or multiple URLs to the `urls` array. Use the Bulk Edit option for large lists.
3. **Set item limit** — Adjust `max_items_per_url` based on how many products appear per page (typically 24–200).
4. **Enable failure tolerance** — Keep `ignore_url_failures: true` for multi-URL runs to avoid interruptions from isolated errors.
5. **Run and export** — Start the scraper and download results as JSON, CSV, or Excel when complete.

**Common issues:**

- If a URL returns fewer items than expected, verify the page loads product cards without requiring user interaction (e.g., no age gate or login wall)
- For paginated categories, create separate URL entries per page (e.g., `?pageNumber=1`, `?pageNumber=2`)
- Affiliate parameters in URLs (`?awc=...`) are harmless and do not need to be stripped

***

### Use Cases & Business Value

- **Price monitoring:** Track how Lookfantastic prices and discounts evolve across categories over time
- **Promotional intelligence:** Identify which products are currently under promotion and what offer types are active
- **Assortment analysis:** Map a full category to understand brand distribution, variant depth, and listing position
- **Ranking research:** Use the `Index` field to analyze product placement and visibility within category pages
- **Feed enrichment:** Supplement internal product databases with live pricing and variant data from a major retailer

***

### Conclusion

The **Lookfantastic.com Product Search Scraper** turns any category or search page into a clean, structured product dataset — with pricing, discounts, promotional tags, and variant details captured in a single run. Whether you are tracking competitors, auditing listings, or building a beauty market dataset, this scraper delivers reliable data without manual effort.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.lookfantastic.com/c/health-beauty/make-up/view-all-make-up/?awc=6712_1780290720_fa4c13a245d5b3af63b12e963e2ed76f&pageNumber=1"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.lookfantastic.com/c/health-beauty/make-up/view-all-make-up/?awc=6712_1780290720_fa4c13a245d5b3af63b12e963e2ed76f&pageNumber=1"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/lookfantastic-product-search-scraper").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 = {
    "urls": ["https://www.lookfantastic.com/c/health-beauty/make-up/view-all-make-up/?awc=6712_1780290720_fa4c13a245d5b3af63b12e963e2ed76f&pageNumber=1"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/lookfantastic-product-search-scraper").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 '{
  "urls": [
    "https://www.lookfantastic.com/c/health-beauty/make-up/view-all-make-up/?awc=6712_1780290720_fa4c13a245d5b3af63b12e963e2ed76f&pageNumber=1"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/lookfantastic-product-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stealth_mode/lookfantastic-product-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Lookfantastic Product Search Scraper",
        "description": "Scrape product listings from Lookfantastic.com search and category pages instantly. Collect names, brands, prices, discounts, variants, and more — perfect for price monitoring, market research, and competitor analysis in the beauty industry.",
        "version": "0.0",
        "x-build-id": "JwT2JCu8vJxob455T"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~lookfantastic-product-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-lookfantastic-product-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/stealth_mode~lookfantastic-product-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-lookfantastic-product-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/stealth_mode~lookfantastic-product-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-lookfantastic-product-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "urls": {
                        "title": "URLs of the product search list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
