# Naver Scraper — Blog, Cafe & News Posts from Korea (`tortuga/naver-scraper`) Actor

Scrape Naver Blog and Naver Cafe posts by keyword or URL: full text, author nickname, blog/cafe name, date, images, tags, likes and comments, plus Naver News results. No login.

- **URL**: https://apify.com/tortuga/naver-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** Social media, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 post with full texts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Scraper — Blog, Cafe & News Posts from Korea

Scrape Naver Blog and Naver Cafe posts by keyword or URL: full text, author nickname, blog/cafe name, date, images, tags, likes and comments, plus Naver News results. No login.

Naver Scraper searches **Naver Blog (네이버 블로그)**, **Naver Cafe (네이버 카페)** and **Naver News (네이버 뉴스)**, Korea's largest search portal, the way Naver's own pages do, and returns clean JSON: post URL and ID, title, snippet, the **full post text**, all images, hashtags, the author's nickname as shown, the blog or cafe name, the publish date, and the like, comment and view counts Naver shows. Search by keyword with relevance or newest-first sorting and a date range, or paste blog and cafe URLs to get single posts or the newest posts of a blog, a cafe or a cafe board. Export to JSON, CSV or Excel, or use the API from Python, Node, n8n, Make or Google Sheets. You pay only for the items you get.

### What data does Naver Scraper extract?

Every item has a `type`: `blog`, `cafe` or `news`.

#### Blog and cafe posts

| Field | Description |
|---|---|
| `id`, `postId`, `url` | Stable ID (`blog:<blogId>:<logNo>`, `cafe:<cafe>:<articleId>`), Naver's post number and the post URL |
| `title`, `snippet` | Title and the search snippet (highlights removed) |
| `text`, `textLength` | Full post text with line breaks (with **Include full post text**) |
| `authorName` | The author's nickname as Naver shows it |
| `blogId`, `blogName`, `blogUrl`, `category` | Blog posts: blog ID, blog title, blog home and the blog category |
| `cafeId`, `cafeUrl`, `cafeName`, `boardName` | Cafe posts: cafe ID, address, name and the board (menu) the article is in |
| `publishedAt`, `publishedText` | Publish time in ISO 8601, Korean time (`2026-10-03T02:33:06+09:00`); `publishedText` is the label shown in search (`19시간 전`, `2026.07.30.`) |
| `thumbnail`, `imageUrls` | Cover image and every photo in the post |
| `tags` | The post's hashtags / tags |
| `likes` | Blog likes (공감) and cafe likes where Naver shows them |
| `commentsCount`, `views`, `shares` | Comment count; cafe view count; blog share count (blog URLs) |
| `selfPurchased` | Blog posts Naver marks as "paid with my own money" (내돈내산) |
| `isMembersOnly` | Cafe article that Naver opens to search visitors although the board is for members |
| `searchKeyword`, `rank` | The keyword that found the post and its position in Naver's results |
| `contentFetched`, `contentError` | Whether the full text was read, and why not when it failed |
| `scrapedAt` | When the item was collected |

#### News results

| Field | Description |
|---|---|
| `title`, `snippet` | Headline and summary from Naver News search |
| `source`, `sourceUrl` | Press (언론사) name and its Naver press page |
| `url`, `naverNewsUrl` | The article on the publisher's site and its Naver News copy (when the press has one) |
| `publishedAt`, `publishedText` | Publish day (ISO) and the label shown (`3시간 전`, `2026.01.24.`) |
| `thumbnail`, `searchKeyword`, `rank` | Article photo, keyword and position |

### How to scrape Naver Blog posts

1. Enter one or more **Search terms** (Korean works best, e.g. `제주도 맛집`).
2. Keep **Sources** on Naver Blog (add Naver Cafe and Naver News if you want them too).
3. Choose **Sort** (relevance or newest first) and, optionally, **Published from / until**.
4. Set **Max results per search** and **Max items**, then click **Start**.

Each blog post comes with its full text, photos, tags, category, comment count and like count. Naver itself shows at most about 1,000 results per keyword; split a big topic into several keywords or date ranges to collect more.

### Input example

```json
{
  "searchTerms": ["제주도 맛집", "성수동 카페"],
  "sources": ["blog", "cafe", "news"],
  "sort": "date",
  "dateFrom": "2026-10-01",
  "maxResultsPerSearch": 100,
  "maxItems": 600,
  "includeContent": true
}
```

```json
{
  "startUrls": [
    { "url": "https://blog.naver.com/yemongrass/224429963597" },
    { "url": "https://blog.naver.com/yemongrass" },
    { "url": "https://cafe.naver.com/jejutip" }
  ],
  "maxResultsPerSearch": 50
}
```

### Output example

```json
{
  "type": "blog",
  "id": "blog:yemongrass:224429963597",
  "postId": "224429963597",
  "url": "https://blog.naver.com/yemongrass/224429963597",
  "title": "제주도 맛집&카페 추천 리스트 13곳 공유 지도 내돈내산",
  "snippet": "제주도 여행을 앞두고 맛집과 카페리스트를 찾아보고 계실 분들을 위해 ...",
  "text": "제주도 여행을 앞두고\n맛집과 카페리스트를\n찾아보고 계실 분들을 위해\n...",
  "textLength": 4777,
  "authorName": "예몬드",
  "blogId": "yemongrass",
  "blogName": "여행에 감성과 꿀팁 한 스푼 Yemontrip",
  "blogUrl": "https://blog.naver.com/yemongrass",
  "category": "제주도",
  "publishedAt": "2026-10-03T02:33:06+09:00",
  "thumbnail": "https://blogthumb.pstatic.net/MjAyNjEwMDNfNDQg/...png?type=s2",
  "imageUrls": ["https://mblogthumb-phinf.pstatic.net/MjAyNjEwMDNfNDQg/...png?type=w800"],
  "tags": ["제주도맛집", "제주맛집추천", "제주여행"],
  "likes": 16,
  "commentsCount": 15,
  "selfPurchased": false,
  "searchKeyword": "제주도 맛집",
  "rank": 1,
  "contentFetched": true,
  "scrapedAt": "2026-10-11T12:00:00Z"
}
```

```json
{
  "type": "cafe",
  "id": "cafe:jejutip:2668761",
  "url": "https://cafe.naver.com/jejutip/2668761",
  "title": "제주도 맛집 인정!",
  "text": "애월에서 해산물 요리를 한상 푸짐하게 즐길 수 있는 곳을 서치하다가 ...",
  "authorName": "해피럭키데이",
  "cafeId": 10456178,
  "cafeUrl": "https://cafe.naver.com/jejutip",
  "cafeName": "[느영나영] 제주도여행 대표카페 제주맛집 렌터카 숙소 여행지도",
  "boardName": "┌🎤 제주여행 Q & A",
  "publishedAt": "2026-09-02T16:05:39+09:00",
  "views": 2408,
  "commentsCount": 4,
  "tags": ["제주도맛집", "제주광해애월"],
  "contentFetched": true
}
```

```json
{
  "type": "news",
  "id": "news:020:0003752795",
  "title": "“우리 골목 우리가 살린다”… 제주 골목상권 7곳 선정",
  "source": "서울신문",
  "url": "https://www.seoul.co.kr/news/...",
  "naverNewsUrl": "https://n.news.naver.com/mnews/article/081/...",
  "publishedAt": "2026-10-05",
  "publishedText": "1주 전",
  "snippet": "..."
}
```

### How to scrape Naver Cafe posts without logging in

Pick the **Naver Cafe** source and enter keywords. Naver Search lists cafe articles from public cafes and from boards that cafes open to search; the Actor reads each article exactly as a logged-out visitor who clicks the search result sees it: full text, images, tags, nickname, board, views and comment count. You can also paste a cafe address (`https://cafe.naver.com/<cafe>`) or a board URL to get its newest articles. Articles that Naver only shows to cafe members are not read: from a cafe URL they come back without text (`contentError: "members only"`), and members-only article URLs are skipped. No account, cookie or password is ever used.

### Can I search Naver News too?

Yes. Add **Naver News** to **Sources**. Each result has the headline, press name, publish day, snippet, the publisher's URL and, when the press publishes on Naver, the `naverNewsUrl`. News items are search-level results (no article body) and cost less than full blog/cafe posts.

### How to get all posts of a Naver blog

Paste the blog's address (`https://blog.naver.com/<blogId>`) into **Blog or cafe URLs**, or a category list URL with `categoryNo`, and set **Max results per search** to how many of the newest posts you want. Blog lists come with likes, comment and share counts for every post; **Include full post text** adds the text, photos and tags.

### Monitor changes on a schedule

Turn on **Only new posts** and set **Sort** to newest first to get a feed of new blog posts, cafe articles and news for your keywords, blogs or cafes. Each run remembers what earlier runs of the same input returned and outputs only posts it has not seen before; posts already seen are skipped before their pages are opened, so they cost no requests and are not charged. Save the input as a task and add a Schedule in Apify (for example every morning); give each watch its own **Monitoring key** if several schedules use the same keywords. Every output item has `changeType: "new"`; likes, views and comment counts are not tracked, so `previousValues` does not appear.

### What does it cost?

Pay per item, no start fee: a blog or cafe post with its full text is charged as a `post`, a search-level item (a news result, or a post when **Include full post text** is off) as a cheaper `result`. Platform usage is small because the Actor uses Naver's own JSON endpoints over datacenter proxies (about one request per post).

### Is it legal to scrape Naver?

The Actor collects only what Naver shows to anyone without an account: public blog posts, cafe articles open to non-members or to search visitors, and news search results. It never logs in, and it skips members-only cafe content and private or neighbours-only blog posts. Author nicknames, blog and cafe names are exported as Naver displays them; no emails, phone numbers or private profile data are collected. You are responsible for how you use the data and for complying with Naver's terms and applicable law (including Korea's Personal Information Protection Act).

### Support

Found a bug or need a field? Open an issue in the **Issues** tab; it is usually answered within a day.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on Naver, one per line, in Korean or any language (e.g. `제주도 맛집`, `아이폰 17 후기`). Each keyword is searched in every source picked below.

## `sources` (type: `array`):

Where to search: Naver Blog posts, Naver Cafe posts and/or Naver News articles.

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

Optional Naver Blog / Cafe URLs. A post URL (`https://blog.naver.com/<id>/<number>`, `https://cafe.naver.com/<cafe>/<number>`) gives that post; a blog home (`https://blog.naver.com/<id>`, also with `categoryNo`) or a cafe / cafe board URL gives its newest posts. Cafe articles that need a membership are skipped.

## `sort` (type: `string`):

Order of search results: Naver's relevance ranking or newest first. Use newest first for monitoring.

## `dateFrom` (type: `string`):

Only posts published on or after this day (YYYY-MM-DD, Korean time). Applied by Naver for searches and while reading blog/cafe URLs.

## `dateTo` (type: `string`):

Only posts published on or before this day (YYYY-MM-DD, Korean time).

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

Open each blog/cafe post for its full text, all images, tags, comment count, category or board (and cafe views). One extra request per post; such posts are charged as `post`. Off: search-level data only (title, snippet, author, date, thumbnail, likes), charged as `result`. News results are always search-level.

## `maxResultsPerSearch` (type: `integer`):

How many results to read for each keyword in each source (and for each blog/cafe URL). Naver shows at most about 1,000 per keyword.

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

Overall cap on dataset items for the whole run, so the cost stays predictable.

## `onlyNewOrChanged` (type: `boolean`):

Remember which posts and articles earlier runs of this input returned and output only new ones. Use with a Schedule and Sort = newest first; posts already seen are not charged and their pages are not opened again.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input

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

Apify Proxy (datacenter is enough for Naver) spreads requests over several IPs.

## Actor input object example

```json
{
  "searchTerms": [
    "제주도 맛집"
  ],
  "sources": [
    "blog",
    "cafe"
  ],
  "startUrls": [],
  "sort": "relevance",
  "includeContent": true,
  "maxResultsPerSearch": 50,
  "maxItems": 100,
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchTerms": [
        "제주도 맛집"
    ],
    "sources": [
        "blog",
        "cafe"
    ],
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/naver-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 = {
    "searchTerms": ["제주도 맛집"],
    "sources": [
        "blog",
        "cafe",
    ],
    "startUrls": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/naver-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 '{
  "searchTerms": [
    "제주도 맛집"
  ],
  "sources": [
    "blog",
    "cafe"
  ],
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/naver-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tortuga/naver-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/Vy3yX44k0FASy4NX7/builds/IB0VLbU2dYwCFwrvB/openapi.json
