# Naver Web, Blog, Cafe & News Results Scraper (`vexaloom-labs/naver-web-blog-cafe-and-news-results-scraper`) Actor

Search Naver's web, blog, cafe, or news results for a Korean or any-language query, and get back title, URL, domain, snippet, and source name for each organic result, filterable by keyword or domain.

- **URL**: https://apify.com/vexaloom-labs/naver-web-blog-cafe-and-news-results-scraper.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** News, SEO tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Naver SERP Harvester: Web, Blog, Cafe, News, Image & Video

Search **Naver** and collect the exact results a Korean reader sees: web documents, blog posts, cafe posts, news articles, images, videos, integrated result blocks and autocomplete suggestions. Every row carries the query that produced it, its position, the result link, a clean title and a normalized publish date whenever Naver prints one, plus a vertical-specific set of fields. No login, cookies or proxy setup is required.

### What this actor does

- **Eight modes:** `webSearch`, `blogSearch`, `cafeSearch`, `newsSearch`, `imageSearch`, `videoSearch`, `integratedSearch`, `autocomplete`
- **Batch queries:** pass one or many queries; duplicates and blank entries are removed, and the same result found twice is emitted once
- **Rank and provenance:** every row has `query`, `resultType`, `rank`, `page` and the search page it came from
- **Filters:** relevance or newest-first sorting, date windows, paid-result control, and optional full blog/news content
- **Clean output:** exact destination URLs, normalized dates with a precision label, thumbnails, image dimensions, video duration and views, place details, and AI-briefing text and sources
- **Empty fields are omitted** — you will not see nulls, empty strings or empty arrays in the dataset

### Output per result

Every normal row:

- `recordType` — `searchResult`; failed queries produce `error`
- `resultType` — `web`, `blog`, `cafe`, `news`, `image`, `video`, `place`, `aiBriefing`, `ad` or `suggestion`
- `query`, `mode`, `rank`, `page`
- `title`, `url`, `resultUrl` (same value), `domain`, `sourceName`, `snippet`
- `thumbnailUrl`
- `date` — the raw date text Naver prints
- `publishedAt` — ISO 8601 timestamp normalized to Korea time
- `publishedAtPrecision` — `exact`, `date` or `relative`
- `publishedAtRaw` — the date token used for normalization
- `serpUrl`, `sourceUrl` — the search page that produced the row
- `scrapedAt` — ISO 8601 collection timestamp

Mode-specific additions:

- **Web:** `isAiSource` when the result is flagged as an AI source
- **Blog:** `blogId`, `logNo`, `isAd` for paid placements
- **Cafe:** `cafeName`, `cafeUrl`, `articleId`, `tags[]`, `commentCount`
- **News:** `naverNewsUrl`, `pressUrl`, `officeId`, `articleId`, `section`, `sectionId`, `isRelated` for cluster articles
- **Image:** `imageId` (also `imgId`), `imageUrl`, `originalUrl`, `width`, `height`, `section`, `author`
- **Video:** `duration`, `durationSeconds`, `views`, `videoId`, `platform`, `profileUrl`
- **Place:** `placeId`, `category`, `rating`, `reviewCount`
- **AI briefing:** `aiBriefing` with `text`, `generatedAt` and `sources[]` (each with title, URL, platform and publish time)
- **Autocomplete:** `suggestion`, plus `answer` when Naver returns an answer box
- **Full content:** `content`, `contentLength`, `images[]` when `includeContent` is on and the source exposes a body

A failed query adds one error row with `recordType: "error"`, `errorType`, `message`, `sourceUrl`, `scrapedAt` and `query`.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `webSearch` | `webSearch` / `blogSearch` / `cafeSearch` / `newsSearch` / `imageSearch` / `videoSearch` / `integratedSearch` / `autocomplete` |
| `searchQueries` | array | `["비비바"]` | One or more Korean or any-language queries (legacy `searchQuery` and `query` keys are still accepted) |
| `maxItems` | integer | `100` | Hard cap on all normal rows across every query (1–10,000) |
| `maxItemsPerQuery` | integer | `100` | Hard cap per query (1–1,000) |
| `maxPagesPerQuery` | integer | `10` | Page ceiling for paginated modes (1–50) |
| `sortBy` | string | `relevance` | `relevance` or `date`; blog, cafe, news, image and video modes |
| `dateRange` | string | `any` | `any` / `1d` / `1w` / `1m` / `6m` / `1y`; blog, cafe, news, image and video modes |
| `includeAds` | boolean | `true` | Keep paid blog placements and integrated-search ads, flagged `isAd` |
| `includeContent` | boolean | `false` | Fetch blog/news bodies, authors and inline images (one extra request per result) |
| `includeSerpFeatures` | boolean | `true` | Include place cards and AI briefings in `integratedSearch` |
| `containsKeyword` | string | – | Keep results whose title, snippet, domain, source name, cafe name or suggestion contains this text |
| `domain` | string | – | Keep results from this host or suffix, e.g. `blog.naver.com` |

#### Example: newest blog posts with full bodies

```json
{
    "mode": "blogSearch",
    "searchQueries": ["비비바", "서울 맛집"],
    "maxItems": 200,
    "maxItemsPerQuery": 100,
    "maxPagesPerQuery": 5,
    "sortBy": "date",
    "dateRange": "1m",
    "includeAds": false,
    "includeContent": true
}
```

#### Example: cafe discussion from the past week

```json
{
    "mode": "cafeSearch",
    "searchQueries": ["제주도 여행"],
    "maxItems": 100,
    "sortBy": "date",
    "dateRange": "1w"
}
```

#### Example: news and image monitoring for a brand

```json
{
    "mode": "newsSearch",
    "searchQueries": ["BTS", "삼성전자"],
    "maxItems": 300,
    "maxPagesPerQuery": 10,
    "sortBy": "date"
}
```

#### Example: integrated page with places and AI briefing

```json
{
    "mode": "integratedSearch",
    "searchQueries": ["비트코인 전망"],
    "maxItems": 50,
    "includeAds": false,
    "includeSerpFeatures": true
}
```

#### Example: autocomplete ideas

```json
{
    "mode": "autocomplete",
    "searchQueries": ["비비", "서울 맛집"],
    "maxItems": 20
}
```

### Use cases

- **Korean SEO and rank tracking** — record which pages and blogs rank for a query, in relevance or newest-first order, with stable ranks and exact URLs
- **Brand and news monitoring** — batch a company or product name, restrict to a date window, and keep publisher, section, headline, snippet and publish time
- **Content and RAG datasets** — collect full blog and news bodies with authors, images and normalized timestamps
- **Local and place research** — pull the place pack from integrated results with ratings, review counts, categories and map links
- **Visual and video research** — collect images with original dimensions and videos with duration, views, channel and platform
- **Keyword discovery** — expand seed terms with Naver autocomplete suggestions

### FAQ

**Do I need a Naver account, cookies or a proxy?** No. The actor collects public Naver result pages without login, cookies or any proxy configuration.

**Why does `webSearch` return only a handful of rows?** Naver's web-document section on the integrated page currently shows roughly 2–17 documents per query and does not paginate. Use `integratedSearch` to also capture places, ads and AI briefings, or the dedicated blog, cafe, news, image and video modes for deeper verticals.

**How deep can the verticals go?** It depends on the query. Broad Korean queries can return hundreds of blog, cafe, news, image or video rows; narrow or very recent queries return fewer. The actor stops when Naver runs out of results, when a page repeats, or when your `maxPagesPerQuery` / `maxItems` limits are reached. No rows are invented to fill a quota.

**Are paid results included?** Only when `includeAds` is on. Paid blog placements and integrated-search ads are marked `isAd`, and you can switch them off.

**What does `includeContent` add?** For blog and news rows it fetches the post or article body, inline image URLs, the author where available, and an exact publish time. Some posts are media-only or paywalled; those rows keep their card data and simply omit the missing content fields.

**Why are some publish dates relative?** Naver often prints labels such as `3주 전` or `11시간 전`. Those rows keep the raw label in `date` / `publishedAtRaw`, get a computed `publishedAt`, and are marked `publishedAtPrecision: "relative"` so you can treat them differently from exact timestamps.

**Why is there no cafe body or comment text?** Naver does not expose cafe bodies or comment threads on public search pages. Cafe rows include the card fields Naver prints, including the comment count.

**Why do some image links look like redirects?** Naver's image tab returns signed bridge links for shopping and clip results. They are the official destination Naver serves at collection time; some merchant or short-link tokens expire later, so keep `imageUrl` / `originalUrl` when you need the media itself.

**What is `integratedSearch`?** It collects the blocks on Naver's main result page: web documents, paid ads, place cards and the AI briefing when Naver generates one. Place and AI rows can be turned off with `includeSerpFeatures`.

**Can I search several queries at once?** Yes. Each row records the query that found it, and a result found by two queries is emitted only once.

**Is this affiliated with Naver?** No. This is an independent actor that reads Naver's public search results; it is not endorsed by or affiliated with NAVER Corporation.

# Actor input Schema

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

Which Naver result surface to collect.

## `searchQueries` (type: `array`):

One or more Korean or any-language queries, e.g. `비비바` or `서울 맛집`. Duplicates and blank entries are removed. (Legacy `searchQuery` and `query` keys are still accepted.)

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

Hard cap on all normal result records across every query (error records are extra).

## `maxItemsPerQuery` (type: `integer`):

Hard cap on normal result records produced by each query.

## `maxPagesPerQuery` (type: `integer`):

Page ceiling for paginated modes (blog, cafe, news, image, video). Collection also stops when Naver runs out of results.

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

Relevance or newest first. Applies to blog, cafe, news, image and video modes; web and integrated modes use Naver's default order.

## `dateRange` (type: `string`):

Only return results published inside this window. Applies to blog, cafe, news, image and video modes; web and integrated modes do not support a date filter.

## `includeAds` (type: `boolean`):

Keep paid blog placements and integrated-search ads, marked with `isAd`. (Blog and integrated modes.)

## `includeContent` (type: `boolean`):

Fetch the post or article body, inline images and author for blog and news results. One extra request per result; unavailable bodies are omitted. (Blog and news modes.)

## `includeSerpFeatures` (type: `boolean`):

Include place cards and AI briefing blocks from the integrated results page, when Naver shows them. (Integrated mode.)

## `containsKeyword` (type: `string`):

Only keep results whose title, snippet, domain, source name, cafe name or suggestion contains this text (case-insensitive).

## `domain` (type: `string`):

Only keep results from this domain (exact host or suffix, e.g. `naver.com` or `blog.naver.com`).

## Actor input object example

```json
{
  "mode": "webSearch",
  "searchQueries": [
    "비비바"
  ],
  "maxItems": 3,
  "maxItemsPerQuery": 3,
  "maxPagesPerQuery": 1,
  "sortBy": "relevance",
  "dateRange": "any",
  "includeAds": true,
  "includeContent": false,
  "includeSerpFeatures": true
}
```

# Actor output Schema

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

Dataset containing all collected Naver search results and any query error records.

# 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": "webSearch",
    "searchQueries": [
        "비비바"
    ],
    "maxItems": 3,
    "maxItemsPerQuery": 3,
    "maxPagesPerQuery": 1,
    "sortBy": "relevance",
    "dateRange": "any",
    "includeAds": false,
    "includeContent": false,
    "includeSerpFeatures": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/naver-web-blog-cafe-and-news-results-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": "webSearch",
    "searchQueries": ["비비바"],
    "maxItems": 3,
    "maxItemsPerQuery": 3,
    "maxPagesPerQuery": 1,
    "sortBy": "relevance",
    "dateRange": "any",
    "includeAds": False,
    "includeContent": False,
    "includeSerpFeatures": False,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/naver-web-blog-cafe-and-news-results-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 '{
  "mode": "webSearch",
  "searchQueries": [
    "비비바"
  ],
  "maxItems": 3,
  "maxItemsPerQuery": 3,
  "maxPagesPerQuery": 1,
  "sortBy": "relevance",
  "dateRange": "any",
  "includeAds": false,
  "includeContent": false,
  "includeSerpFeatures": false
}' |
apify call vexaloom-labs/naver-web-blog-cafe-and-news-results-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/naver-web-blog-cafe-and-news-results-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/fXexRpaALarFERLPr/builds/Rd3z6T4JbPlEIBdK3/openapi.json
