# Naver News Scraper (`searchapi/naver-news-scraper`) Actor

Scrape news search results from Naver (South Korea's #1 search engine). Extracts article titles, snippets, sources, publication dates, and image galleries. Supports pagination, source filters, and Korean date parsing — ideal for news aggregation and brand monitoring in the Korean market.

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

## Pricing

from $1.99 / 1,000 search results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## Naver News Scraper

Fast, structured extraction of public Naver News search results. Version 3 uses direct HTML requests and Cheerio instead of launching a browser, so normal searches complete in seconds while preserving Naver pagination, proxy support, sessions, retries, sorting, date controls, and safe failure handling.

### Input modes

- `query`: one Naver News search.
- `queries`: multiple searches. Records are selected round-robin so one query cannot consume the full global limit.
- `startUrls`: public `https://search.naver.com/search.naver` URLs containing `where=news` and a non-empty `query`.

These modes may be combined. Duplicate article IDs are removed; an article found by multiple searches receives `matchedQueries` and `queryPositions`.

Useful controls include `sortBy` (`relevance`, `newest`, or `oldest`), `startDate`, `endDate`, `categories`, publisher include/exclude lists, `titleContains`, pagination limits, concurrency, retries, timeouts, and Apify/custom proxy configuration.

```json
{
  "queries": ["인공지능", "로봇"],
  "sortBy": "newest",
  "maxItems": 20,
  "maxPages": 2,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

`GOOGLE_SERP` is intentionally rejected because that proxy group supports Google HTTP requests, not Naver.

### Output

Records contain only observed or deterministic fields. Core fields include:

- stable `id`, `articleId`, and `pressId`;
- publisher article `url` and `naverUrl`;
- `title`, `snippet`, `publisher`, publisher profile/domain;
- ISO `publishedAt`, original `publishedAtRaw`, and date precision;
- Naver section/category when present;
- direct publisher image and publisher logo URLs when present;
- highlighted search terms;
- query, per-query and global positions, page, search URL, sort order, locale, and scrape timestamp.

Optional values are omitted when unavailable—no fabricated favicon, zero-count, false-status, placeholder, null, empty string, array, or object fields are emitted. Relative publication labels such as `2일 전` are converted to ISO timestamps and marked approximate.

### Local validation

```bash
npm ci
npm test
apify run --purge --input-file qa-inputs/local-single.json
npm run validate:dataset
npm run audit:dataset
```

Additional bounded inputs cover multi-query fairness, pagination, filters, no-results, invalid input, and cloud proxy validation.

### Blocking and safety

The Actor uses a consistent desktop HTTP profile, cookie-persistent sessions, bounded retries, and optional Apify/custom proxies. HTTP status and content type are validated before parsing. Recognized no-result pages produce an empty dataset. Access-denied, challenge, or unexpected markup fails closed and is never stored as data. The Actor does not solve or bypass CAPTCHAs, authentication, paywalls, or access controls.

# Actor input Schema

## `query` (type: `string`):

A phrase to search on Naver News.

## `queries` (type: `array`):

Optional additional phrases. Results are selected fairly across all queries.

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

Optional public search.naver.com URLs containing where=news and query parameters.

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

Naver's result order.

## `startDate` (type: `string`):

Optional earliest publication date in YYYY-MM-DD format.

## `endDate` (type: `string`):

Optional latest publication date in YYYY-MM-DD format.

## `categories` (type: `array`):

Optional Naver section filters applied to extracted records.

## `includeSources` (type: `array`):

Keep publisher names containing any of these values (case-insensitive).

## `excludeSources` (type: `array`):

Remove publisher names containing any of these values (case-insensitive).

## `titleContains` (type: `string`):

Optional local headline substring filter.

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

Global maximum across all queries after deduplication.

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

Each page normally contains about 10 news articles.

## `maxConcurrency` (type: `integer`):

Maximum number of Naver result pages requested concurrently.

## `maxRequestRetries` (type: `integer`):

Bounded retries for temporary network, proxy, rate-limit, or server failures.

## `requestTimeoutSecs` (type: `integer`):

Maximum processing time allowed for each search page request.

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

Supports no proxy, Apify Proxy, country selection, groups, or custom proxy URLs. GOOGLE\_SERP is not valid for Naver.

## Actor input object example

```json
{
  "query": "인공지능",
  "queries": [],
  "startUrls": [],
  "sortBy": "relevance",
  "categories": [],
  "includeSources": [],
  "excludeSources": [],
  "maxItems": 50,
  "maxPages": 5,
  "maxConcurrency": 10,
  "maxRequestRetries": 3,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "query": "인공지능",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("searchapi/naver-news-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 = {
    "query": "인공지능",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("searchapi/naver-news-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "query": "인공지능",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call searchapi/naver-news-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,searchapi/naver-news-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mjS3Vh65wtftfk4NW/builds/3nmpS1baHi5H7WF2W/openapi.json
