# IOL Scraper (`dadhalfdev/iol-scraper`) Actor

Scrape IOL.pt, Portugal's leading news portal, into clean structured JSON. Extract up to 200 articles with title, full text, dates, authors, tags & images. Choose from News, Sport, Lifestyle, Health & more. Built for RAG, AI agents, media monitoring & trend analysis. Export JSON, CSV or API.

- **URL**: https://apify.com/dadhalfdev/iol-scraper.md
- **Developed by:** [Marco Rodrigues](https://apify.com/dadhalfdev) (community)
- **Categories:** News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## 📰 IOL News Scraper

Scrape the latest articles from [IOL](https://www.iol.pt/) — one of Portugal's largest news portals — and turn them into clean, structured data for agents, RAG systems, dashboards, and media monitoring workflows.

Choose a category (`News`, `Sport`, `Lifestyle`, and more) and scrape up to **200 articles** with titles, descriptions, full article text, dates, authors, tags, images, and section metadata. The actor paginates through category listing pages and extracts structured content from each article page.

### 💡 Perfect For

- **🤖 AI Agents:** Give agents fresh Portuguese news context with direct `url`, `content`, and `tags` fields.
- **📚 RAG Pipelines:** Index article text, summaries, metadata, and source URLs so assistants can answer questions about recent IOL coverage with citations.
- **📰 Media Monitoring:** Track breaking news, sports, lifestyle, health, travel, and other topics across IOL sections.
- **📈 Trend Analysis:** Compare publication dates, categories, sub-categories, and tags to spot recurring themes and coverage patterns.
- **⚙️ Automation Workflows:** Feed new article metadata into Slack bots, Discord alerts, newsletters, spreadsheets, or internal agent workflows.

### ✨ Why This Actor Matters

AI agents and data pipelines need structured, machine-readable news — not raw HTML. IOL publishes a wide range of Portuguese content across many sections, but extracting consistent fields like full article text, publish dates, and tags from listing pages alone is unreliable.

This actor uses Playwright to browse category listings, collect article URLs, and extract normalized data from each article page — including JSON-LD metadata, Open Graph tags, and cleaned paragraph content.

### 📦 What's Inside The Data?

For every article, the actor returns:

- **Core metadata:** `url`, `title`, `description`, `content`
- **Dates:** `published_date`, `modified_date`
- **Authorship:** `author_name`, `publisher`
- **Classification:** `category`, `sub_category`, `tags`
- **Media:** `image_url`

### 🚀 Quick Start

1. Open the actor on Apify or run it locally.
2. Choose the `category` you want to scrape (default: `News`).
3. Set `number_of_articles` to how many articles you want, up to **200**.
4. Start the actor and export the results as JSON, CSV, Excel, or through the Apify API.

### 🧑‍💻 Tech Details

**Input Example:**

```json
{
  "category": "News",
  "number_of_articles": 100
}
````

The actor maps each category to its IOL listing URL and paginates through pages until enough article URLs are collected:

- `News` -> `https://www.iol.pt/noticias`
- `Sport` -> `https://www.iol.pt/desporto`
- `All` -> `https://www.iol.pt/universo-iol` (uses "ver mais" and `?pagina=` pagination)
- `Latest` -> `https://www.iol.pt/ultimas`
- `Most Viewed` -> `https://www.iol.pt/maisVistos`
- `Discoveries` -> `https://www.iol.pt/descobertas`

**Output Example:**

```json
{
  "url": "https://www.iol.pt/.../20260623/6a3a49fed34edcee7c6598c7",
  "title": "O terror dos ácaros e alérgenos: o aspirador de colchões com luz UV da Hoover caiu para os 73€ no Prime Day",
  "description": "Avaliado com nota excelente de 4,4 estrelas, este modelo leve é perfeito para limpar sofás, camas e até estofos do carro",
  "content": "Este artigo pode conter links afiliados*\n\nO Prime Day já arrancou e esta pode ser uma das melhores oportunidades...",
  "published_date": "2026-06-23T10:07:00.000+01:00",
  "modified_date": "2026-06-23T10:07:16.629+01:00",
  "author_name": "IOL",
  "publisher": "Notícias de hoje - IOL",
  "category": "All",
  "sub_category": "Descobertas",
  "image_url": "https://img.iol.pt/preset/68e510f0d34ee0c2fed0f8a1/og/iol",
  "tags": [
    "Hoover hmc5 aspirador colchões preço",
    "Aspirador com luz uv para ácaros",
    "Melhor aspirador para sofás e estofos"
  ]
}
```

**Parameters:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `category` | string | No | IOL section to scrape: `All`, `News`, `Sport`, `TV`, `Lifestyle`, `Celebrities`, `Health`, `Travel`, `Tips`, `Money`, `Recipes`, `Pets`, `Latest`, `Most Viewed`, or `Discoveries`. Default: `News`. |
| `number_of_articles` | integer | No | Number of articles to collect from the listing. Min 1, max 200, default 100. |

# Actor input Schema

## `number_of_articles` (type: `integer`):

Maximum number of IOL articles to scrape from the selected category.

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

IOL category section to scrape.

## Actor input object example

```json
{
  "number_of_articles": 100,
  "category": "News"
}
```

# Actor output Schema

## `overview` (type: `string`):

Table view of scraped IOL articles using the dataset 'overview' view.

## `results` (type: `string`):

All scraped IOL articles from the default dataset without view transformation.

# 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("dadhalfdev/iol-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("dadhalfdev/iol-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 '{}' |
apify call dadhalfdev/iol-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "IOL Scraper",
        "description": "Scrape IOL.pt, Portugal's leading news portal, into clean structured JSON. Extract up to 200 articles with title, full text, dates, authors, tags & images. Choose from News, Sport, Lifestyle, Health & more. Built for RAG, AI agents, media monitoring & trend analysis. Export JSON, CSV or API.",
        "version": "0.1",
        "x-build-id": "Uyrc9vcmTbtuIUOs6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dadhalfdev~iol-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dadhalfdev-iol-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/dadhalfdev~iol-scraper/runs": {
            "post": {
                "operationId": "runs-sync-dadhalfdev-iol-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/dadhalfdev~iol-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-dadhalfdev-iol-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": {
                    "number_of_articles": {
                        "title": "Number of articles",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum number of IOL articles to scrape from the selected category.",
                        "default": 100
                    },
                    "category": {
                        "title": "Category",
                        "enum": [
                            "All",
                            "News",
                            "Sport",
                            "TV",
                            "Lifestyle",
                            "Celebrities",
                            "Health",
                            "Travel",
                            "Tips",
                            "Money",
                            "Recipes",
                            "Pets",
                            "Latest",
                            "Most Viewed",
                            "Discoveries"
                        ],
                        "type": "string",
                        "description": "IOL category section to scrape.",
                        "default": "News"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
