# Delia Whisky Scraper (`scrapyspider/delia-whiskey-scraper-germany`) Actor

Scrape whisky product data from Delia Whisky. Extract prices, availability, age statements, tasting notes, product specifications, images, and manufacturer details in structured JSON. Supports collection pages and automatic pagination.

- **URL**: https://apify.com/scrapyspider/delia-whiskey-scraper-germany.md
- **Developed by:** [ScrapySpider](https://apify.com/scrapyspider) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

### What does this Delia Whisky scraper do?

**Scrape deliawhisky.de whisky data** from the [Delia Whisky new arrivals collection](https://deliawhisky.de/en/collections/neuheiten-whisky) and turn it into clean, structured product records ready for analysis, monitoring, or catalog enrichment. This Apify Actor uses **PuppeteerCrawler** to paginate through all listing pages, visit every product detail page, and extract product names, age statements, prices, price per liter, stock status, image galleries, tasting-note descriptions, technical product details (flat key-value pairs from the product table), and manufacturer/importer information.

Because it runs on the **Apify platform**, you can schedule runs, access results through API endpoints, export data to JSON/CSV/Excel, plug it into Make or Zapier, rotate proxies when needed, and monitor runs without building your own scraping infrastructure.

### Why use this Actor to scrape deliawhisky.de whisky data?

This Actor is useful when you need **German whisky shop product data** in a repeatable format.

Common use cases:

- Track new whisky releases and limited bottlings
- Monitor **price changes** and **availability** over time
- Build product catalogs for e-commerce, affiliate, or comparison sites
- Enrich whisky databases with bottle specs such as ABV, cask type, region, and bottle size
- Collect product descriptions and tasting notes for content workflows
- Feed downstream BI, alerts, or inventory research pipelines

The Actor normalizes key values such as `availability` into `in_stock` / `out_of_stock`, extracts `age_years` from the product title (with fallback to description text and the details table), and returns all product images and descriptive content in a machine-friendly structure.

### How to use this Actor to scrape Delia Whisky data

1. Open the Actor on Apify and go to the **Input** tab.
2. Add the collection URL you want to scrape. The main target is `https://deliawhisky.de/en/collections/neuheiten-whisky`.
3. Optionally set `maxPages` or `maxResults` to limit the run scope.
4. Start the run manually or schedule it for automatic monitoring.
5. Wait for the run to finish and open the **Output** tab.
6. Review the dataset online or download it in JSON, HTML, CSV, or Excel.
7. Use the Apify API or integrations to send the whisky data to your own systems.

### Input

The Actor starts from one or more collection URLs.

Example input:

```json
{
    "startUrls": [
        {
            "url": "https://deliawhisky.de/en/collections/neuheiten-whisky"
        }
    ],
    "maxPages": 0,
    "maxResults": 0,
    "maxRequestsPerCrawl": 0
}
````

#### Input fields

- `startUrls` — One or more Delia Whisky collection URLs to start from. In most cases, use the new arrivals / whisky collection page shown above.
- `maxPages` — Maximum number of listing pages to scrape. Use `0` for unlimited pagination.
- `maxResults` — Maximum number of product detail pages to scrape. Use `0` for unlimited results.
- `maxRequestsPerCrawl` — Optional Crawlee safety cap for total requests during the run.

If you only want the latest products, keep the default collection and set `maxPages` or `maxResults` to constrain the run size.

### Output

Each dataset item represents one whisky product detail page. You can download the dataset in various formats such as **JSON, HTML, CSV, or Excel**.

Example output item:

```json
{
    "url": "https://deliawhisky.de/en/products/ardnamurchan-ad-2025-px-sherry-cask",
    "canonical_url": "https://deliawhisky.de/en/products/ardnamurchan-ad-2025-px-sherry-cask",
    "product_id": "5021944131228",
    "name": "Ardnamurchan AD/2025 PX Sherry Cask 56.9% 0.7l",
    "age_years": null,
    "price": "€ 79.90",
    "price_per_liter": "€ 114.14 / Liter",
    "availability": "in_stock",
    "images": ["https://deliawhisky.de/cdn/shop/files/ardnamurchan-px-sherry.jpg"],
    "description": "Tasting Notes\n\nRich PX sherry influence with dried fruits and spice.",
    "Distillery/Brand": "Ardnamurchan",
    "Bottling": "2025",
    "Alcohol Content": "56.9%",
    "Cask Type": "PX Sherry Cask",
    "Bottle Size": "0.7 Liter",
    "Country of Origin": "Scotland",
    "Region": "Highlands",
    "Type": "Single Malt Whisky",
    "Coloring": "No",
    "Chill Filtering": "No",
    "GTIN": "5021944131228",
    "manufacturer_importer": "Rolf Kaspar GmbH, Ruhrallee 59, 45138 Essen, Germany",
    "scraped_at": "2026-05-30T07:00:00.000Z",
    "timestamp_utc": "2026-05-30T07:00:00.000Z",
    "last_seen_utc": "2026-05-30T07:00:00.000Z"
}
```

### Data table for extracted whisky data fields

| Field                   | Type           | Description                                                                                        |
| ----------------------- | -------------- | -------------------------------------------------------------------------------------------------- |
| `url`                   | string         | Product page URL as loaded by the crawler                                                          |
| `canonical_url`         | string         | Canonical URL from the `<link rel="canonical">` tag                                               |
| `product_id`            | string | null | Product GTIN extracted from the product details table                                              |
| `name`                  | string         | Product title as shown on the product page                                                         |
| `age_years`             | number | null | Age statement extracted from the title, description, or details table (e.g. `12` from `12 Years`) |
| `price`                 | string         | Regular product price                                                                              |
| `price_per_liter`       | string         | Price per liter shown on the page                                                                  |
| `availability`          | string         | Normalized availability: `in_stock` or `out_of_stock`                                             |
| `images`                | string\[]       | Array of product image URLs                                                                        |
| `description`           | string         | Full product description (headings and paragraphs joined with blank lines)                         |
| *(detail table fields)* | string         | All rows from the product details table as flat key-value fields (e.g. `Distillery/Brand`, `Cask Type`, `GTIN`, etc.) |
| `manufacturer_importer` | string | null | Manufacturer or importer name and address                                                          |
| `scraped_at`            | string         | ISO 8601 UTC timestamp of when the item was scraped                                                |
| `timestamp_utc`         | string         | ISO 8601 UTC timestamp of first scrape (same as `scraped_at`)                                      |
| `last_seen_utc`         | string         | ISO 8601 UTC timestamp of last scrape                                                              |

### How much does it cost to scrape deliawhisky.de?

This Actor uses a **browser crawler**, so cost depends on how many pages you scrape, how often you run it, and whether proxy usage is needed. For a single Delia Whisky collection, the run is typically lightweight because the catalog size is limited compared with large marketplaces.

To keep costs low:

- Start with a single collection URL
- Run only as often as your monitoring needs require
- Use `maxPages` or `maxResults` to limit scope for test runs
- Export and diff results instead of over-scraping

If you are on the Apify free tier, small test runs are usually enough to validate the setup before scaling up.

### Tips for scraping deliawhisky.de whisky data efficiently

- Use the new arrivals collection for the most relevant release monitoring
- Schedule the Actor daily or hourly if you need stock or price alerts
- Store historical runs and compare `availability` and `price` changes across runs using `timestamp_utc` and `last_seen_utc`
- The detail table fields (e.g. `Region`, `Cask Type`, `Alcohol Content`) are flat top-level fields — filter and group them directly in your downstream system
- Review `images` arrays if you need gallery coverage for listings or content generation
- If the site structure changes, check a recent run first before making business decisions from the data

### FAQ, disclaimers, and support

**Is this Actor only for whisky?**\
It is designed for Delia Whisky product pages and is optimized for the whisky product data structure found on the target site.

**Can I use the data commercially?**\
Make sure your use complies with the target website's terms, applicable law, and your own internal compliance requirements.

**Will every detail field always be present?**\
No. Fields such as age statement, bottling year, or specific technical details vary by product. Fields not present on a given product page will be `null` or absent.

**Where can I get help or request improvements?**\
Please use the Actor's **Issues** tab on Apify or the linked repository issue tracker. If you need a custom scraper, data pipeline, or schema extension, a tailored solution can be built on top of this Actor.

# Actor input Schema

## `startUrls` (type: `array`):

URLs to start scraping from (collection pages). Defaults to the Neuheiten Whisky collection.

## `maxPages` (type: `integer`):

Maximum number of listing pages to scrape (0 or omitted = unlimited)

## `maxResults` (type: `integer`):

Maximum number of products to scrape (0 or omitted = unlimited)

## `proxyConfiguration` (type: `object`):

Proxy settings to use for scraping.

## `maxRequestsPerCrawl` (type: `integer`):

Maximum number of pages to crawl. Set to 0 for unlimited.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://deliawhisky.de/en/collections/neuheiten-whisky"
    }
  ],
  "maxPages": 1,
  "maxResults": 1,
  "proxyConfiguration": {},
  "maxRequestsPerCrawl": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://deliawhisky.de/en/collections/neuheiten-whisky"
        }
    ],
    "maxPages": 1,
    "maxResults": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapyspider/delia-whiskey-scraper-germany").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 = {
    "startUrls": [{ "url": "https://deliawhisky.de/en/collections/neuheiten-whisky" }],
    "maxPages": 1,
    "maxResults": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapyspider/delia-whiskey-scraper-germany").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 '{
  "startUrls": [
    {
      "url": "https://deliawhisky.de/en/collections/neuheiten-whisky"
    }
  ],
  "maxPages": 1,
  "maxResults": 1
}' |
apify call scrapyspider/delia-whiskey-scraper-germany --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapyspider/delia-whiskey-scraper-germany",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Delia Whisky Scraper",
        "description": "Scrape whisky product data from Delia Whisky. Extract prices, availability, age statements, tasting notes, product specifications, images, and manufacturer details in structured JSON. Supports collection pages and automatic pagination.",
        "version": "0.0",
        "x-build-id": "1crpzgYGFhvEOsYvY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapyspider~delia-whiskey-scraper-germany/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapyspider-delia-whiskey-scraper-germany",
                "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/scrapyspider~delia-whiskey-scraper-germany/runs": {
            "post": {
                "operationId": "runs-sync-scrapyspider-delia-whiskey-scraper-germany",
                "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/scrapyspider~delia-whiskey-scraper-germany/run-sync": {
            "post": {
                "operationId": "run-sync-scrapyspider-delia-whiskey-scraper-germany",
                "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": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "URLs to start scraping from (collection pages). Defaults to the Neuheiten Whisky collection.",
                        "default": [
                            {
                                "url": "https://deliawhisky.de/en/collections/neuheiten-whisky"
                            }
                        ],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxPages": {
                        "title": "Max Pages",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of listing pages to scrape (0 or omitted = unlimited)",
                        "default": 0
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of products to scrape (0 or omitted = unlimited)",
                        "default": 0
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings to use for scraping.",
                        "default": {}
                    },
                    "maxRequestsPerCrawl": {
                        "title": "Max Requests Per Crawl",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of pages to crawl. Set to 0 for unlimited.",
                        "default": 0
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
