# PcComponentes Scraper - Prices, Discounts, Variants & Reviews (`abotapi/pccomponentes-com-scraper`) Actor

Scrape PcComponentes (pccomponentes.com) products: current price plus strike-through reference-price discount, configuration variants with price and availability, brand, category, and reviews with rating. Search by keyword/category or paste product and listing links.

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

## Pricing

from $1.00 / 1,000 product 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 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

## PcComponentes Product Scraper

Pull product data from PcComponentes (pccomponentes.com), a Spanish computing and electronics retailer. Search by keyword, a real PcComponentes category, or paste product and listing links directly. Every record includes the current price, the strike-through reference price with computed discount when a product is genuinely marked down, and configuration variants with their own price and availability when you ask for full detail.

### Why This Scraper?

- **Was-price and discount, structured, never fabricated.** When a product is marked down against the site's own reference price, both prices are captured plus the computed discount amount and percentage. Full-price products simply carry `null` -- nothing is guessed.
- **Real narrowing, not a filter that quietly does nothing.** Brand narrows via the site's own path-based catalog navigation (or the site's own search facets for keyword search) and price sort reorders the full server-side result set -- both verified against the live site, not assumed from the input form.
- **Configuration variants.** Laptops, PCs and similar products return every configuration (RAM/storage/color/model) as its own variant, each with its own price and availability.
- **Reviews straight from the product page.** Overall rating, rating count, and the product's own most recent written reviews (author, date, rating, body) -- not a third-party review vendor.
- **Two ways in.** Keyword or category search with real site filters (brand, price range, discount-only, sort), or paste any product/listing link and continue pagination automatically.
- **Optional export to your apps.** Send results into Notion, Linear, Airtable, or any Apify MCP connector alongside the dataset.

### Data You Get

| Field | Example value |
|---|---|
| productId / sku | `123456` |
| name | `Sample Laptop 15.6" / 16GB / 512GB` |
| brand | `SampleBrand` |
| category | `Portátiles` |
| url | `https://www.pccomponentes.com/sample-laptop-15-6-16gb-512gb` |
| price / currency | `469.99`, `EUR` |
| originalPrice / discountAmount / discountPercent | `589.99`, `120.00`, `20.3` |
| isOnSpecial | `true` |
| onlineAvailable | `true` |
| image / images | `["https://thumb.pccomponentes.com/sample/image.jpg"]` |
| description | full product description text |
| variants | `[{"axis": "Memoria Ram", "name": "32 GB RAM", "url": "https://www.pccomponentes.com/sample-laptop-32gb", "price": 519.99, "available": true}]` |
| rating / reviewCount | `4.19`, `187` |
| reviews.averageRating / reviews.ratingCount / reviews.totalReviewCount | `4.19`, `187`, `123` |
| reviews.items\[] | `[{"rating": 5, "body": "Sample review text.", "author": "Sample User", "date": "2026-06-05"}]` |

> Sample shape: values above are illustrative placeholders, not from a live product.

### How to Use

**1. Keyword search, first page, with reviews (default):**

```json
{
  "mode": "search",
  "searchTerm": "portatil gaming",
  "maxItems": 20
}
```

**2. Category browse, filtered to a brand, discounted items only, sorted by price:**

```json
{
  "mode": "search",
  "category": "portatiles",
  "brands": ["Lenovo"],
  "specialsOnly": true,
  "sortBy": "PRICE_ASC",
  "maxItems": 50,
  "maxPages": 5
}
```

**3. Full product detail (variants + description) and reviews for a pasted product link:**

```json
{
  "mode": "url",
  "urls": ["https://www.pccomponentes.com/sample-laptop-15-6-16gb-512gb"],
  "fetchDetails": true,
  "fetchReviews": true
}
```

**4. Paste a category listing and keep paginating forward:**

```json
{
  "mode": "url",
  "urls": ["https://www.pccomponentes.com/monitores"],
  "maxItems": 100,
  "maxPages": 10
}
```

### Input Parameters

| Parameter | Type | Description |
|---|---|---|
| `mode` | string | `search` or `url`. |
| `searchTerm` | string | Keyword (search mode only; uses the site's own product search). |
| `category` | string | A real PcComponentes category path, e.g. `portatiles`, `monitores`, `placas-base` (search mode only; ignored when `searchTerm` is set). |
| `brands` | array | Exact brand names to keep (search mode only). |
| `minPrice` / `maxPrice` | number | EUR price band to keep (search mode only). |
| `specialsOnly` | boolean | Keep only products currently showing a genuine discount against the site's own reference price (search mode only). |
| `sortBy` | string | `RELEVANCE`, `PRICE_ASC`, `PRICE_DESC`, `DISCOUNT`, `TOP_RATED`, or `NEWEST` -- applies to category browsing only; keyword search always ranks by the site's own relevance (no server-side sort exists for it on this site). |
| `urls` | array | Product or category listing URLs to scrape (url mode only). |
| `fetchDetails` | boolean | Fetch full product detail (description, EAN/reference, category, image gallery, configuration variants). |
| `fetchReviews` | boolean | Fetch the product's own reviews. |
| `maxReviewsPerProduct` | integer | Cap on written reviews per product; the product page itself only ever surfaces a recent subset. |
| `maxPages` | integer | Cap on result pages per search/category/URL entry; empty = unlimited. |
| `maxItems` | integer | Cap on total products returned; `0` = unlimited. |
| `proxy` | object | Apify proxy configuration. Works on every plan by default. |
| `mcpConnectors` | array | Optional MCP connectors to export results into (Notion, Linear, Airtable, Apify). |
| `notionParentPageUrl` | string | Notion connector only: page under which item pages are created. |
| `maxNotifyListings` | integer | Cap on items exported to each connector per run. Does not affect the dataset. |

### Output Example

```json
{
  "productId": "123456",
  "sku": "SAMPLEBRAND1234",
  "name": "Sample Laptop 15.6\" / 16GB / 512GB",
  "brand": "SampleBrand",
  "category": "Portátiles",
  "url": "https://www.pccomponentes.com/sample-laptop-15-6-16gb-512gb",
  "price": 469.99,
  "currency": "EUR",
  "originalPrice": 589.99,
  "discountAmount": 120.00,
  "discountPercent": 20.3,
  "isOnSpecial": true,
  "onlineAvailable": true,
  "image": "https://thumb.pccomponentes.com/sample/image.jpg",
  "description": "Sample product description as shown on the site.",
  "variants": [
    { "axis": "Memoria Ram", "name": "32 GB RAM", "url": "https://www.pccomponentes.com/sample-laptop-32gb", "price": 519.99, "available": true }
  ],
  "rating": 4.19,
  "reviewCount": 187,
  "reviews": {
    "averageRating": 4.19,
    "ratingCount": 187,
    "totalReviewCount": 123,
    "items": [
      { "rating": 5, "body": "Sample review text.", "author": "Sample User", "date": "2026-06-05" }
    ]
  }
}
```

> Sample shape: values above are illustrative placeholders, not from a live product.

### A note on reviews and prices

Reviews come directly from the product page itself, not a third-party review vendor -- the page only ever surfaces its most recent written reviews, while the overall rating, `ratingCount` (every star rating given) and `reviews.totalReviewCount` (ratings that came with written text) reflect the full history; these are genuinely two different site-reported counts, not a duplicate. `originalPrice` reflects the site's own reference price and is only ever populated when it is genuinely higher than the current price -- a full-price product always carries `null` there, never a fabricated discount.

### Send results into your apps (MCP connectors)

Optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it in the `mcpConnectors` field. Each connector receives a condensed, human-readable summary per product (name plus key fields), while the complete record always stays in the Apify dataset. For Notion, set `notionParentPageUrl` to the page the item pages should be created under, and use `maxNotifyListings` to cap how many items are exported per connector per run. Supported connectors: Notion, Linear, Airtable, and Apify. Leave the field empty to skip; it never changes the dataset output.

### A note on plans

The default connection works on every Apify plan, including the free tier. A residential proxy connection is optional and only worth turning on for very large or sustained runs; when a run falls back to a lower-reliability connection, the run log will note it.

# Actor input Schema

## `mode` (type: `string`):

'search' finds products by keyword and/or a real pccomponentes.com category (e.g. 'portatiles', 'placas-base'), with real site filters and sort. 'url' scrapes any product or category listing page URL you paste, walking pagination forward automatically.

## `searchTerm` (type: `string`):

Free-text keyword, e.g. 'portatil gaming' or 'monitor 27 pulgadas'. Uses the site's own product search. Leave empty and use Category below to browse a category instead.

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

A real pccomponentes.com category path exactly as it appears in the site's own URLs, e.g. 'portatiles', 'monitores', 'placas-base'. Ignored when Search keyword is set (keyword search and category browsing are two different site features).

## `brands` (type: `array`):

Only return products from these brands, e.g. 'Lenovo', 'HP', 'Asus'. Match the exact brand name as shown on the site. Leave empty for all brands.

## `minPrice` (type: `number`):

Only return products priced at or above this amount, in euros.

## `maxPrice` (type: `number`):

Only return products priced at or below this amount, in euros.

## `specialsOnly` (type: `boolean`):

Only return products currently showing a genuine strike-through discount against the site's own reference price (verified live against real price data -- never a guess). Combines with the keyword/category above.

## `sortBy` (type: `string`):

pccomponentes.com's own sort order, verified live to reorder the full server-side result set when browsing a Category. Keyword search always ranks by the site's own relevance (no server-side price sort exists for keyword search on this site), so this is ignored whenever Search keyword is set.

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

Paste one or more pccomponentes.com product pages or category listing pages. Pagination continues forward automatically from any ?page= already in the URL. Filter fields above are ignored in this mode.

## `fetchDetails` (type: `boolean`):

Adds full description, EAN/reference, category breadcrumb, complete image gallery, and every configuration variant (each with its own price and availability) from the product page. Current price, was-price/discount, rating and card image are already included without this toggle.

## `fetchReviews` (type: `boolean`):

Fetch the product's own reviews (not a third-party vendor): overall rating, total rating count, and the page's most recent individual written reviews (rating, body, author, date) -- pccomponentes.com itself only ever surfaces up to its 15 most recent written reviews per product; the rating and counts reflect the full history. Products with no reviews simply return an empty list.

## `maxReviewsPerProduct` (type: `integer`):

Cap on written reviews fetched per product when 'Fetch reviews' is on, up to the site's own per-page limit.

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

Stop after this many result pages per search/category/URL entry. Leave empty for no page limit -- the run stops at Max products total.

## `maxItems` (type: `integer`):

Hard cap on total products returned across every search/category/URL entry. 0 = unlimited (still bounded by Max pages per search).

## `proxy` (type: `object`):

The default connection works on every Apify plan, including the free tier. A residential connection is optional and only needed for very large or sustained runs.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerm": "portatil",
  "brands": [],
  "specialsOnly": false,
  "sortBy": "RELEVANCE",
  "urls": [
    "https://www.pccomponentes.com/portatiles"
  ],
  "fetchDetails": false,
  "fetchReviews": true,
  "maxReviewsPerProduct": 10,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (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 = {
    "mode": "search",
    "searchTerm": "portatil",
    "brands": [],
    "urls": [
        "https://www.pccomponentes.com/portatiles"
    ],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/pccomponentes-com-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 = {
    "mode": "search",
    "searchTerm": "portatil",
    "brands": [],
    "urls": ["https://www.pccomponentes.com/portatiles"],
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/pccomponentes-com-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 '{
  "mode": "search",
  "searchTerm": "portatil",
  "brands": [],
  "urls": [
    "https://www.pccomponentes.com/portatiles"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/pccomponentes-com-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/jSCiaq1kaLX5nS5Px/builds/Uo6uCj0e4k3zLl38f/openapi.json
