# Naver Blog Search Scraper (네이버 블로그 검색) (`hgservices/naver-blog-search-scraper`) Actor

Search Naver Blog by keyword and extract every matching post — title, snippet, author, publish date, thumbnails, 내돈내산 flag, and optional full body text, hashtags, likes and comments. Filter by date. Export as JSON, CSV, or Excel.

- **URL**: https://apify.com/hgservices/naver-blog-search-scraper.md
- **Developed by:** [Harish Garg](https://apify.com/hgservices) (community)
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 scraped posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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 Blog Search Scraper (네이버 블로그 검색)

**Search [Naver Blog](https://section.blog.naver.com) by keyword and extract the matching posts** — **title, snippet, author, publish date, thumbnails** and the **내돈내산 (self-purchased) flag**. Turn on full content to also get the **full body text, images, hashtags, likes (공감) and comment count** of each post. Filter by date, sort by relevance or newest, and collect **more than 1,000 posts per keyword**.

Export the posts as JSON, CSV, Excel, XML or HTML, or read them from the API.

No Naver account. No login. No coding needed.

### What does Naver Blog Search Scraper do?

Type the keywords that you would search on Naver Blog (네이버 블로그 검색). For each keyword, the scraper returns the matching posts in Naver's order:

- **Post data** — title, search snippet, desktop and mobile post URL, publish date, thumbnails, and whether the post has a video.
- **Author data** — nickname, blog name, blog URL and profile image.
- **내돈내산 flag** — `selfPurchased: true` when Naver labels the post as bought with the author's own money (not sponsored).
- **Blog Market flag** — `isMarketPost: true` for a Naver Blog Market (블로그마켓) sales post.
- **Full content (optional)** — the full body text and HTML, every image in the post, hashtags (해시태그), likes (공감) with the count of each reaction type, and the comment count.
- **More than 1,000 posts per keyword** — Naver Blog search shows at most 1,000 posts for a keyword. This scraper can collect thousands of posts for one keyword.
- **Many keywords in one run** — each keyword is searched separately, and each post is tagged with its keyword and rank.

### Use cases

- **Market and consumer research** — Naver Blog is where Koreans write product reviews, restaurant visits and travel stories. Collect what people say about a brand, a product or a place.
- **Influencer marketing** — Find the bloggers who write about your keyword. See which posts are 내돈내산 and which are not.
- **SEO for the Korean market** — See which posts rank for a keyword on Naver Blog. Study their titles, hashtags and length.
- **Trend and brand monitoring** — Sort by newest and run the scraper every day to follow a topic or a brand.
- **NLP, LLM and RAG datasets** — Collect clean Korean text by topic for sentiment analysis, classification or AI pipelines.

### How to scrape Naver Blog in Apify Console

1. Click **Try for free** and sign in to Apify. A free account is enough.
2. In **Search keywords**, add one keyword per line, for example `캠핑` or `강남 맛집`.
3. Set **Max posts per keyword**. The default is 100.
4. Optional: select **Newest first**, set a date range, or turn on **Include full post content**.
5. Click **Start**.
6. Open the **Output** tab. View the posts as a table, or download them as JSON, CSV, Excel, XML or HTML.

### Input

| Field                | Type     | Default     | Description                                                                                                                               |
| -------------------- | -------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `keywords`           | string\[] | —           | The search keywords, one per line. Korean keywords match best. Each keyword is searched separately. Required                              |
| `maxResults`         | integer  | `100`       | The most posts to return for each keyword. It can be more than 1,000. `0` = all posts                                                     |
| `sortBy`             | string   | `relevance` | `relevance` (정확도순, Naver's default order) or `newest` (최신순)                                                                        |
| `dateFrom`           | string   | —           | Only posts published on or after this date (Korea time). A date such as `2026-01-01`, or a period such as `7 days`, `2 weeks`, `3 months` |
| `dateTo`             | string   | —           | Only posts published on or before this date (Korea time). Same formats as `dateFrom`. Empty = up to today                                 |
| `includePostContent` | boolean  | `false`     | Also get the full body text and HTML, images, hashtags, likes and comment count of each post. Runs are slower                             |

#### Input examples

**The 100 most relevant posts for one keyword**

```json
{
    "keywords": ["캠핑"]
}
```

**The newest posts of the last 30 days for two keywords, with full content**

```json
{
    "keywords": ["캠핑", "강남 맛집"],
    "maxResults": 200,
    "sortBy": "newest",
    "dateFrom": "30 days",
    "includePostContent": true
}
```

**All posts for a keyword in one month**

```json
{
    "keywords": ["아이폰 17 후기"],
    "maxResults": 0,
    "dateFrom": "2026-09-01",
    "dateTo": "2026-09-30"
}
```

### Output

You get one row for each post that a keyword finds, tagged with the keyword and the post's rank. Example with full content:

```json
{
    "keyword": "캠핑",
    "rank": 1,
    "blogId": "kasakyu",
    "logNo": "224423813746",
    "url": "https://blog.naver.com/kasakyu/224423813746",
    "mobileUrl": "https://m.blog.naver.com/kasakyu/224423813746",
    "title": "당일캠핑하기 좋은 화성 청려수련원 숲속캠크닉 후기",
    "snippet": "초보 캠퍼로써 당일캠핑하러 가끔씩 가던 캠핑장이 있는데요 아침부터 저녁까지만 텐트를 치고 ...",
    "nickName": "1서어주니8",
    "blogName": "준&코 가족일상",
    "blogUrl": "https://blog.naver.com/kasakyu",
    "profileImageUrl": "https://blogpfthumb-phinf.pstatic.net/.../KakaoTalk_20260208_205943.jpg?type=s1",
    "publishedAt": "2026-09-27T05:15:00.000Z",
    "thumbnailUrl": "https://blogthumb.pstatic.net/.../숲속캠크닉.jpg?type=s2",
    "thumbnails": ["https://blogthumb.pstatic.net/.../숲속캠크닉.jpg?type=s2"],
    "hasVideo": false,
    "selfPurchased": true,
    "isMarketPost": false,
    "content": "내돈내산 인증\n방문\n새싹동산 청려수련원\n경기도 화성시 동탄구 중동 273-2 ...",
    "contentHtml": "<div class=\"se-component ...\">...</div>",
    "contentLength": 3145,
    "images": ["https://mblogthumb-phinf.pstatic.net/.../01.jpg?type=w800"],
    "imageCount": 38,
    "tags": ["청려수련원", "화성캠핑", "당일캠핑", "경기도캠핑"],
    "commentCount": 12,
    "sympathyCount": 19,
    "reactions": { "like": 19 },
    "contentStatus": "ok",
    "scrapedAt": "2026-10-11T12:31:54.696Z"
}
```

The fields from `content` to `contentStatus` are in the output only when **Include full post content** is on.

#### Output fields

| Field                             | Description                                                                                                                                      |
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| `keyword`, `rank`                 | The keyword that found the post, and the post's position in that keyword's results                                                               |
| `blogId`, `logNo`                 | The blogger's ID and the post's number                                                                                                           |
| `url`, `mobileUrl`                | The desktop and mobile post URLs                                                                                                                 |
| `title`, `snippet`                | The post title and the search snippet, as plain text                                                                                             |
| `nickName`, `blogName`, `blogUrl` | The author's nickname, blog name and blog URL                                                                                                    |
| `profileImageUrl`                 | The author's profile image                                                                                                                       |
| `publishedAt`                     | The publish time (ISO 8601, UTC)                                                                                                                 |
| `thumbnailUrl`, `thumbnails`      | The first thumbnail, and all the thumbnails that Naver shows for the post                                                                        |
| `hasVideo`                        | `true` when the post has a video                                                                                                                 |
| `selfPurchased`                   | `true` when Naver labels the post 내돈내산 (bought with the author's own money)                                                                  |
| `isMarketPost`                    | `true` for a Naver Blog Market (블로그마켓) sales post                                                                                           |
| `content`, `contentHtml`          | The full body text (clean) and the body HTML. Full content only                                                                                  |
| `contentLength`                   | The number of characters in `content`. Full content only                                                                                         |
| `images`, `imageCount`            | The image URLs in the post, and their number. Full content only                                                                                  |
| `tags`                            | The post hashtags. Full content only                                                                                                             |
| `commentCount`                    | The number of comments. Full content only                                                                                                        |
| `sympathyCount`, `reactions`      | The total likes (공감), and the count of each reaction type. Full content only                                                                   |
| `contentStatus`                   | `ok`, `empty`, `not_found` (deleted or private post), `fetch_failed` or `budget_reached` (the run's maximum cost was reached). Full content only |
| `scrapedAt`                       | When the post was scraped (UTC)                                                                                                                  |

### Use Naver Blog Search Scraper with the Apify API

Run the scraper and read the results from any programming language with the [Apify API](https://docs.apify.com/api/v2). Get your API token in Apify Console under **Settings → API & Integrations**, and replace `<YOUR_API_TOKEN>` below.

**HTTP (cURL)** — run the scraper and get the posts in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/hgservices~naver-blog-search-scraper/run-sync-get-dataset-items?format=json" \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{ "keywords": ["캠핑", "강남 맛집"], "maxResults": 50, "sortBy": "newest" }'
```

Change `format=json` to `format=csv` or `format=xlsx` to get a spreadsheet. This call waits up to 5 minutes. For large runs, start the run with `POST /v2/acts/hgservices~naver-blog-search-scraper/runs`, and read the dataset when the run finishes.

**JavaScript / Node.js**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('hgservices/naver-blog-search-scraper').call({
    keywords: ['강남 맛집'],
    maxResults: 100,
    sortBy: 'newest',
    dateFrom: '7 days',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const post of items) {
    console.log(post.rank, post.publishedAt, post.title, post.url);
}
```

**Python** (`apify-client` 3.0 or later) — find the 내돈내산 reviews for a product, with the most-liked posts first:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("hgservices/naver-blog-search-scraper").call(run_input={
    "keywords": ["아이폰 17 후기"],
    "maxResults": 300,
    "includePostContent": True,
})
if run is None:
    raise RuntimeError("The run was not found.")

posts = [
    post
    for post in client.dataset(run.default_dataset_id).iterate_items()
    if post["selfPurchased"]
]
posts.sort(key=lambda post: post.get("sympathyCount") or 0, reverse=True)

for post in posts[:10]:
    print(post["sympathyCount"], post["title"], post["url"])
```

### Use Naver Blog data in Claude, ChatGPT and other AI assistants

This scraper works as a tool for AI assistants through the [Apify MCP server](https://mcp.apify.com/). Your assistant can find the scraper, read its input options, run it, and use the posts in its answer.

**Claude (claude.ai or Claude Desktop)** — Go to **Settings → Connectors**, add a custom connector, and enter `https://mcp.apify.com`. Sign in to Apify when Claude asks.

**Claude Code**

```bash
claude mcp add --transport http apify https://mcp.apify.com
```

**ChatGPT** — Turn on **Developer mode** in **Settings → Apps & Connectors → Advanced settings**. Then create a connector with the MCP server URL `https://mcp.apify.com`.

**Cursor, VS Code and other MCP clients** — Add `https://mcp.apify.com` as a remote MCP server. To give the assistant only this scraper, use `https://mcp.apify.com?tools=hgservices/naver-blog-search-scraper`.

Then ask in plain language:

> Use the Naver Blog Search Scraper to get the 50 newest Naver Blog posts about 강남 맛집, and list the restaurants that people mention most.

> Search Naver Blog for 다이슨 에어랩 후기 with full content. Summarize what the 내돈내산 reviewers like and dislike, in English.

> Find the Naver bloggers who wrote about 제주 캠핑 in the last 3 months, and make a table of their blog names, post titles and likes.

### Integrations and scheduling

Connect the scraper to the tools that you already use with [Apify integrations](https://apify.com/integrations): **Google Sheets, Slack, Zapier, Make, n8n, Airbyte, Keboola** and more. Use **webhooks** to call your own endpoint when a run finishes.

Use **Schedules** in Apify Console to run the scraper automatically. For example, sort by **Newest first**, set **Published from** to `1 day`, and run the scraper every day to get each day's new posts about your brand.

### Good to know

- **More than 1,000 posts.** Set **Max posts per keyword** above 1,000, or to `0` for all posts. On very popular keywords (for example `캠핑`), one day can have more than 1,000 posts. Then you get up to 1,000 posts for each day.
- **Fast runs without full content.** The search data (title, snippet, author, date, 내돈내산 flag) comes fast. Turn on full content only when you need the body text, hashtags or likes.
- **One post, many keywords.** When two keywords find the same post, the post is in the output once for each keyword, with that keyword's rank.
- **Korea time.** The date range uses Korea Standard Time (KST), as Naver does. `publishedAt` is in UTC.

### Related Actors

- **[Naver Blog Post Scraper](https://apify.com/hgservices/naver-blog-post-scraper)** — the full content of Naver Blog posts by URL.
- **[Naver Blog Profile Scraper](https://apify.com/hgservices/naver-blog-profile-scraper)** — a blogger's profile, follower and visitor counts, and full post list.
- **[Naver Blog Rank Tracker](https://apify.com/hgservices/naver-blog-rank-tracker)** — the Naver search rank of your blog posts for your keywords.
- **[Naver Blog Sponsored Post Detector](https://apify.com/hgservices/naver-blog-sponsored-post-detector)** — find out which top posts for a keyword are sponsored.
- **[Naver Search Scraper](https://apify.com/hgservices/naver-search-scraper)** — every block of the Naver 통합검색 page, with ads, place, cafés, news and more.

### FAQ

**Do I need a Naver account?**
No. You need only an Apify account. The scraper uses the public Naver Blog search, with the same results that every visitor sees.

**Can I get more than 1,000 posts for a keyword?**
Yes. Naver Blog search itself shows at most 1,000 posts for a keyword, but this scraper can go further. Set **Max posts per keyword** above 1,000, or to `0` for all posts.

**Does it get the comment text?**
No. It gets the number of comments. Use **Include full post content** to get `commentCount`.

**What about deleted or private posts?**
Naver search can still show a post that its author deleted or made private. With full content on, such a post gets `contentStatus: "not_found"`, and the search data is still in the row.

**Can I search in English?**
Yes, but most Naver Blog posts are in Korean, so Korean keywords find many more posts.

**Is it legal to scrape Naver Blog?**
The scraper collects only publicly available posts and never signs in. You are responsible for using the data in line with Naver's Terms of Service and the laws that apply to you, including personal-data laws.

### Support

Did you find a bug, or do you need a field that is not here? Open an issue on the **Issues** tab. Custom solutions are available on request.

This scraper is not affiliated with or endorsed by Naver.

# Actor input Schema

## `keywords` (type: `array`):

What you would type into Naver Blog search — one keyword per line, e.g. 캠핑, 강남 맛집, 아이폰 17 후기. Korean keywords match best. Each keyword is searched separately and its posts are tagged with the keyword.

## `maxResults` (type: `integer`):

The most posts to return for each keyword. It can be more than 1,000 (the limit of Naver's own search page). Set to 0 for all posts. You are billed per post, so use this to control cost.

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

Result order. 'Relevance' is Naver's default ranking (정확도순); 'Newest' lists the latest posts first (최신순).

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

Only posts published on or after this date (Korea time). Use a date like 2026-01-01, or a relative period like '7 days' or '3 months' to count back from today. Leave empty for no lower limit.

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

Only posts published on or before this date (Korea time). Use a date like 2026-01-31, or a relative period like '1 day'. Leave empty for up to today.

## `includePostContent` (type: `boolean`):

Fetch each post's full body text and HTML, in-body images, hashtags, likes (with the reaction breakdown) and comment count — not just the search snippet. Runs are slower, and each delivered body is billed as a separate 'post-details' event.

## Actor input object example

```json
{
  "keywords": [
    "캠핑"
  ],
  "maxResults": 100,
  "sortBy": "relevance",
  "includePostContent": false
}
```

# 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 = {
    "keywords": [
        "캠핑"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hgservices/naver-blog-search-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 = { "keywords": ["캠핑"] }

# Run the Actor and wait for it to finish
run = client.actor("hgservices/naver-blog-search-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 '{
  "keywords": [
    "캠핑"
  ]
}' |
apify call hgservices/naver-blog-search-scraper --silent --output-dataset

```

## MCP server setup

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