# Naver Blog Scraper – Search, Full Text & Sponsored Post Check (`openharvest/naver-blog-scraper`) Actor

Naver Blog scraper: keyword search, blog feeds and post URLs with full text (Markdown), likes, comments, hashtags, images and blogger profiles. Flags sponsored posts, paid reviews (체험단, 원고료) and Naver's 내돈내산 badge. No login.

- **URL**: https://apify.com/openharvest/naver-blog-scraper.md
- **Developed by:** [Enes Bulanık](https://apify.com/openharvest) (community)
- **Categories:** Social media, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 post (search or feed row)s

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 Blog Scraper – Search, Full Text & Sponsored Post Check

Naver Blog scraper for Korean market research. Search posts by keyword, load the posts of any blog, or scrape single post URLs. You get the full post text in Markdown, likes, comments, hashtags, images and blogger profiles. Every post is checked for sponsorship: paid reviews (체험단, 원고료, 협찬), affiliate links and Naver's own 내돈내산 (self-purchased) badge. No login or API key needed.

**Price: $0.50 per 1,000 search results, $1.50 per 1,000 posts with full text.** Inputs that fail are free.

### What does Naver Blog Scraper do?

Naver Blog is the main place where Koreans read product reviews, restaurant visits and travel tips. This Actor reads the same public pages and JSON that the Naver Blog website and mobile app use, and returns clean rows:

- **Keyword search** – up to 1,000 posts per keyword (Naver's cap), sorted by relevance or date, with a date range filter
- **Blog feeds** – the newest posts of any blog, going back through its whole history, with likes and comment counts
- **Full post text** – plain text plus Markdown with images, links, tables, quotes, videos and map places (new SmartEditor ONE and older editors)
- **Engagement** – likes (공감) for every post, comment counts and image counts
- **Sponsorship check** – disclosure phrases (소정의 원고료, 제품을 제공받아, 협찬, 광고), campaign banners from review platforms, Coupang Partners and other affiliate notices, and Naver's verified 내돈내산 receipt badge with the purchased product names
- **Blogger profiles** – blog name, nickname, neighbor (subscriber) count, visitors today and in total, power-blog flag, topic and description

### Why use this Naver Blog scraper?

- **One Actor for the whole job.** Search, blog feeds, full text, likes, blogger profiles and sponsored-post detection in one run.
- **Pricing by depth.** $0.50 per 1,000 search rows and $1.50 per 1,000 full posts. Likes, sponsorship analysis and duplicates skipped across keywords cost nothing extra.
- **Sponsored-post detection.** Korean rules require bloggers to disclose paid reviews (the 2020 "뒷광고" rules). The Actor finds those disclosures in the text and in banner images, so you can separate genuine reviews from paid ones.
- **Fair billing.** Missing posts, private blogs and invalid inputs produce a free `error` row. If the full text of a post can't be loaded, you pay only the search-row price.
- **No personal contact data.** E-mail addresses and phone numbers are removed from all text.

### Use cases

- **K-beauty and consumer brands** – see what bloggers say about your product and your competitors, and how many reviews are paid.
- **Influencer and review agencies** – find bloggers by topic, compare neighbors, visitors and engagement, and check how often they post sponsored content.
- **Market and keyword research** – measure how much is written about a product, place or trend, and track it over time with a date filter.
- **Brand monitoring** – schedule a daily run on your brand keywords sorted by date.
- **Restaurants, travel and local business** – collect reviews of a place (맛집, 카페, 숙소) and the share that came from review campaigns.
- **AI and LLM pipelines** – Markdown output is ready for summarisation, sentiment analysis or RAG.

### How to scrape Naver Blog

1. Click **Try for free** / **Start**.
2. Enter one or more **Search keywords** (for example `선크림 추천`), and/or **Blogs**, and/or **Post URLs**.
3. Turn on **Include full post text** if you need the content. The sponsorship check is also more accurate with full text, because campaign banners are only visible in the post body.
4. Optionally set **Max posts**, **Sort by** and a date range.
5. Click **Start** and download the data as JSON, CSV, Excel or HTML, or connect it to Make, Zapier, n8n, Google Sheets or the Apify API.

### Input

| Field | Type | Description |
|---|---|---|
| `searchKeywords` | array | Keywords to search. Up to 1,000 posts per keyword. |
| `blogs` | array | Blog IDs or URLs (`forlongpole`, `https://blog.naver.com/forlongpole`). Returns the blog's posts and one profile row. |
| `postUrls` | array | Single post URLs. Always scraped with full text. |
| `maxPostsPerSource` | integer | Max posts per keyword and per blog. `0` = no limit. Default `50`. |
| `includeFullText` | boolean | Add full text, Markdown, hashtags, images, links and the full-text sponsorship check. Default `false`. |
| `sortBy` | string | `relevance` (default) or `date`. |
| `dateFrom` / `dateTo` | string | Date range: `2026-01-01` or relative (`7 days`, `3 months`). |
| `includeBlogProfiles` | boolean | Profile row for each blog in `blogs`. Default `true`. |
| `includeAuthorProfiles` | boolean | Profile row for every blogger found by your keyword searches. Default `false`. |
| `deduplicatePosts` | boolean | Save each post only once per run. Default `true`. |
| `proxyConfiguration` | object | Optional. Not needed normally. |

Example input:

```json
{
    "searchKeywords": ["선크림 추천", "강남 맛집"],
    "maxPostsPerSource": 100,
    "includeFullText": true,
    "sortBy": "date",
    "dateFrom": "30 days",
    "includeAuthorProfiles": true
}
```

### Output

Each row has a `type`: `post`, `blog` or `error`. Real sample output (shortened):

**Post with full text**

```json
{
    "type": "post",
    "source": "url",
    "blogId": "dalhh817",
    "logNo": "224423410100",
    "url": "https://blog.naver.com/dalhh817/224423410100",
    "title": "화잘먹 환절기 올리브영 1위 선크림! 올영세일 잘산템 백탁없는선크림 스킨1004 솔직 리뷰",
    "author": "달달see",
    "blogName": "달달see l 여행 맛집 큐레이션",
    "publishedAt": "2026-09-26T13:58:32.606Z",
    "categoryName": "BEAUTY 리뷰",
    "blogTopic": "패션·미용",
    "text": "이 게시글은 브랜드로부터\n소정의 제품과 원고료를 제공받았습니다.\n\n선세럼 후기 ...",
    "markdown": "이 게시글은 브랜드로부터\n소정의 제품과 원고료를 제공받았습니다.\n\n...\n\n> 스킨 1004 마다가스카르 센텔라 히알루 시카 워터핏 선세럼\n\n| | 목차 |\n| --- | --- |\n| 1 | 스킨 1004 선세럼 소개 |\n...",
    "charCount": 1753,
    "hashtags": ["#스킨1004", "#화잘먹템", "#선크림추천"],
    "commentCount": 0,
    "likeCount": 11,
    "imageCount": 15,
    "videoCount": 2,
    "imageUrls": ["https://mblogthumb-phinf.pstatic.net/MjAyNjA5MjZfMTI5/...png"],
    "links": ["https://oy.run/PgtpFEmsTsA9iX"],
    "sponsorshipStatus": "sponsored",
    "sponsoredDisclosure": true,
    "affiliateDisclosure": false,
    "selfPurchased": false,
    "selfPurchasedProducts": [],
    "sponsorSignals": ["manuscript-fee", "provided-by-brand", "received-product", "small-fee"],
    "sponsorEvidence": ["이 게시글은 브랜드로부터 소정의 제품과 원고료를 제공받았습니다. 선세럼 후기 백"],
    "sponsorBannerUrls": [],
    "sponsorCheckedOn": "fullText",
    "marketPost": false,
    "hasFullText": true,
    "editorVersion": "SE4"
}
```

**Blogger profile**

```json
{
    "type": "blog",
    "blogId": "forlongpole",
    "url": "https://blog.naver.com/forlongpole",
    "blogName": "포롱포롱 날아오르자",
    "nickname": "문어가되고싶어",
    "subscriberCount": 1211,
    "dayVisitorCount": 46,
    "totalVisitorCount": 87350,
    "powerBlog": false,
    "officialBlog": false,
    "topic": "국내여행",
    "description": "방문 감사합니다! ... 협업 관련은 비댓이나 [email removed]",
    "lastPostAt": "2026-10-08T18:04:42.000Z"
}
```

**Error (free)**

```json
{
    "type": "error",
    "blogId": "forlongpole",
    "logNo": "999999999999",
    "url": "https://blog.naver.com/forlongpole/999999999999",
    "errorCode": "POST_NOT_FOUND",
    "error": "The post does not exist, was deleted or is not public."
}
```

#### Sponsorship status values

| `sponsorshipStatus` | Meaning |
|---|---|
| `sponsored` | A disclosure phrase (원고료, 제공받아, 협찬, 광고, 체험단…) or a review-campaign banner was found |
| `affiliate` | Affiliate notice, e.g. Coupang Partners commission |
| `self-purchased-verified` | Naver's 내돈내산 receipt badge (Naver checked the purchase) |
| `self-purchased-claimed` | The blogger writes 내돈내산 / 협찬 아님, but Naver did not verify it |
| `no-disclosure-found` | No signal found |

The check is a heuristic. A paid post without any disclosure can't be detected. Banners are only visible in the full post, so turn on **Include full post text** for the most accurate result (`sponsorCheckedOn` shows which one was used). Posts without full text are checked on the title and the search snippet only.

The dataset has ready-made views: **Overview**, **Sponsored / paid reviews**, **Full text** and **Blogger profiles & errors**.

### Pricing

This Actor uses **pay-per-event** pricing. Platform usage is included.

| Event | Price | When it is charged |
|---|---|---|
| `post` | **$0.0005** per post ($0.50 / 1,000) | A post row without full text (search result or blog feed) |
| `post-full-text` | **$0.0015** per post ($1.50 / 1,000) | A post row with full text and Markdown |
| `blog-profile` | **$0.002** per blog | A blogger profile row |
| Errors, likes, duplicates | **Free** | |

Examples:

| Job | Cost |
|---|---|
| 1,000 search results for one keyword | **$0.50** |
| 100 posts with full text + sponsorship check | **$0.15** |
| 5 keywords × 200 full posts + profiles of 400 bloggers | $1.50 + $0.80 = **$2.30** |

Tip: set **Max cost per run** in the run options. The Actor stops cleanly when your budget is reached.

### Use with AI agents (MCP)

This Actor works as a tool in the Apify MCP server, so Claude, ChatGPT, Cursor and other MCP clients can call it. Example tool input an agent can send:

```json
{
    "searchKeywords": ["올리브영 선크림"],
    "maxPostsPerSource": 20,
    "includeFullText": true,
    "sortBy": "date"
}
```

Then ask the agent, for example: "Which sunscreen brands get the most sponsored reviews on Naver this month?"

### FAQ

**Do I need a Naver account?**
No. The Actor only reads public posts that anyone can open without logging in.

**Why at most 1,000 posts per keyword?**
Naver's search stops at 1,000 results for any keyword. To get more, split the period with `dateFrom` / `dateTo` (for example one run per month) or use more specific keywords.

**Does it scrape Naver Cafe?**
No. Naver Cafe posts mostly need a login. This Actor covers Naver Blog only.

**What about private or neighbor-only posts?**
They are skipped. A post URL that can't be opened returns a free `error` row.

**Are comments included?**
The comment count is included. Comment text is not, because it would contain other users' personal data.

**Why are e-mails and phone numbers shown as `[email removed]`?**
We don't output personal contact data. Use the blog URL to contact a blogger through Naver.

**Can I run it on a schedule?**
Yes. Use Apify Schedules with `sortBy: "date"` and `dateFrom: "1 day"` to collect new posts every day.

### Is it legal to scrape Naver Blog?

This Actor extracts only **publicly available** posts and profile data. It does not log in, does not open private posts and removes e-mail addresses and phone numbers. Blog posts are copyrighted by their authors: use the data for analysis and research, and do not republish full posts without permission. Make sure your use complies with applicable laws (for example the Korean Personal Information Protection Act and GDPR) and with Naver's terms. Do not use the data for spam. If you are unsure, consult a lawyer.

### Related actors

Other actors by the same developer:

- **Google Trends Scraper – Interest Over Time & Related Queries** – compare search interest for the products you found on Naver
- **Keyword Suggestions – Google, YouTube & Amazon Autocomplete** – find more keywords to search on Naver Blog
- **Google News Scraper – Full Article Text & Real Publisher URLs** – follow news coverage next to blog reviews
- **Shopify & WooCommerce Products Scraper – Any Store, Schema.org** – get prices of the products that bloggers review
- **YouTube Transcript Scraper – Captions, Subtitles & Video Data** – add video reviews to your research

### Support & feedback

Found a post that parses badly or a missing field? Open an issue in the **Issues** tab with the post URL.

# Actor input Schema

## `searchKeywords` (type: `array`):

Keywords to search on Naver Blog (Korean or any language), e.g. <code>선크림 추천</code> or <code>강남 맛집</code>. Each keyword returns up to 1,000 posts (Naver's limit). Leave empty if you only want blogs or post URLs.

## `blogs` (type: `array`):

Naver blog IDs or blog URLs, e.g. <code>forlongpole</code> or <code>https://blog.naver.com/forlongpole</code>. Returns the blog's newest posts (with likes and comment counts) and one profile row (neighbors, visitors, topic).

## `postUrls` (type: `array`):

Individual post URLs, e.g. <code>https://blog.naver.com/blogid/224394538527</code> (desktop, mobile and PostView.naver links all work). These are always scraped with full text.

## `maxPostsPerSource` (type: `integer`):

Maximum number of posts for each keyword and each blog. 0 = no limit (keyword searches stop at Naver's 1,000-result cap). You pay per post, so this also caps your cost.

## `includeFullText` (type: `boolean`):

Open every post and add the full text, Markdown, hashtags, images, links, places, comment count and full-text sponsorship analysis (charged as 'post-full-text' instead of 'post'). Strongly recommended for sponsored-post detection: disclosure banners are only visible in the full post.

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

Relevance (Naver's default ranking) or newest first.

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

Optional. Absolute date (YYYY-MM-DD) or relative period such as <code>7 days</code>, <code>3 months</code>. Applies to keyword searches and blog feeds.

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

Optional. Absolute date (YYYY-MM-DD) or relative period. Combine with 'Only posts newer than' to get a date range. Tip: split a long range into several runs to get more than 1,000 posts per keyword.

## `includeBlogProfiles` (type: `boolean`):

One row per blog with name, nickname, neighbor (subscriber) count, today's and total visitors, power-blog flag, topic and description. Charged as 'blog-profile'.

## `includeAuthorProfiles` (type: `boolean`):

Also add one profile row for every unique blog that appears in your keyword results - handy for finding influencers by topic. Charged as 'blog-profile'.

## `deduplicatePosts` (type: `boolean`):

Save each post only once per run, even if it matches several keywords. You are not charged for skipped duplicates.

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

Usually not needed. Enable only if you see many HTTP 403/429 warnings on very large runs.

## Actor input object example

```json
{
  "searchKeywords": [
    "선크림 추천",
    "강남 맛집"
  ],
  "blogs": [
    "https://blog.naver.com/forlongpole"
  ],
  "postUrls": [
    "https://blog.naver.com/dalhh817/224423410100"
  ],
  "maxPostsPerSource": 20,
  "includeFullText": true,
  "sortBy": "relevance",
  "includeBlogProfiles": true,
  "includeAuthorProfiles": false,
  "deduplicatePosts": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped posts, blogger profiles and error rows in the default dataset (JSON, CSV, Excel and more via the dataset export).

## `files` (type: `string`):

Records saved in the default key-value store, e.g. the run summary.

# 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 = {
    "searchKeywords": [
        "선크림 추천"
    ],
    "maxPostsPerSource": 20,
    "includeFullText": true,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("openharvest/naver-blog-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 = {
    "searchKeywords": ["선크림 추천"],
    "maxPostsPerSource": 20,
    "includeFullText": True,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("openharvest/naver-blog-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 '{
  "searchKeywords": [
    "선크림 추천"
  ],
  "maxPostsPerSource": 20,
  "includeFullText": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call openharvest/naver-blog-scraper --silent --output-dataset

```

## MCP server setup

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