# Naver Blog Profile Scraper (네이버 블로그) (`hgservices/naver-blog-profile-scraper`) Actor

Scrape a Naver blogger's profile and the full list of their posts — nickname, subscribers, visitor counts, category tree, and every post with titles, dates and engagement. Built for influencer analysis.

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

## Pricing

from $2.00 / 1,000 post scrapeds

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/platform/actors/running/actors-in-store#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 Blog Profile Scraper (네이버 블로그)

**Scrape any [Naver Blog](https://blog.naver.com) creator's profile and their complete post archive in one run.** Give the Actor a blogger ID or blog URL and it returns the **profile** (blog name, nickname, subscriber count, total and daily visitor counts, official / power-blog badges, profile image) plus the **full list of their posts** crawled from the post directory (카테고리) — every post's title, URL, publish date, category, comment count and like (공감) count. Built for **influencer and creator analysis, competitor research, and content auditing**.

Because it runs on the Apify platform, you get scheduled runs, a REST API, webhooks and integrations (Google Sheets, Make, Zapier, Slack…), automatic proxy rotation through Korean IPs, and monitoring — no servers to manage.

### Why use Naver Blog Profile Scraper?

- **Influencer vetting** — quantify a blogger's reach (subscribers, visitor totals) and posting cadence before a partnership.
- **Competitor & market research** — see exactly what topics a brand's blog publishes, how often, and how much engagement each post gets.
- **Content auditing** — export a creator's entire back catalogue with categories and dates for a content inventory.
- **Trend tracking** — schedule the Actor to re-run and watch subscriber growth and new posts over time.
- **Bulk analysis** — feed a list of many bloggers and get one tidy record per creator.

### How to use Naver Blog Profile Scraper

1. Enter one or more **bloggers** — a bare ID (`naverofficial`), a `@handle`, or any blog URL (`https://blog.naver.com/naverofficial`, `https://m.blog.naver.com/naverofficial`, or even a link to a single post).
2. (Optional) Set **Max posts per blog** to cap how many posts are collected — defaults to `100` for a quick, cheap first run; set `0` for the entire archive.
3. (Optional) Turn **Scrape posts** off if you only want profiles + the category tree (fast and cheap).
4. Click **Start**. When the run finishes, open the **Output** tab and download the data as JSON, CSV, Excel, or HTML — or pull it from the API.

### Input

Configure the run in the **Input** tab (or via JSON / API). Key fields:

| Field                | Description                                                                                       | Default                      |
| -------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------- |
| `blogs`              | Blogger IDs or blog URLs, one per line. **Required.**                                             | —                            |
| `scrapePosts`        | Crawl the full post list from the post directory.                                                 | `true`                       |
| `maxPosts`           | Cap posts collected per blog (newest first). `0` = entire archive.                                | `100`                        |
| `includePostContent` | Fetch each post's full body text (one extra request per post — slower).                           | `false`                      |
| `outputMode`         | `postItems` = one item per post (+ a profile item); `blogItem` = one item per blog, posts nested. | `postItems`                  |
| `categoryNo`         | Restrict posts to a single category by its Naver `categoryNo`. `0` = all posts.                   | `0`                          |
| `includeCategories`  | Attach the blogger's category tree with per-category post counts.                                 | `true`                       |
| `language`           | `Accept-Language` hint. Korean is strongly recommended.                                           | `ko`                         |
| `maxConcurrency`     | Blogs processed in parallel.                                                                      | `3`                          |
| `proxyConfiguration` | Proxy for every request. Korean residential IPs recommended.                                      | Apify Proxy, RESIDENTIAL, KR |

Example input:

```json
{
    "blogs": ["naverofficial", "https://blog.naver.com/naver_diary"],
    "scrapePosts": true,
    "maxPosts": 100,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "KR" }
}
```

### Output

Results are written to the dataset in one of two shapes, chosen by `outputMode`:

- **`postItems` (default)** — one dataset item per **post** (`"type": "post"`, each stamped with its author's `blogId` / `blogName` / `nickName`), plus one **profile** item per blog (`"type": "profile"`). Best for spreadsheets and per-post analysis.
- **`blogItem`** — one item per **blog** (`"type": "blog"`) with all posts nested under a `posts` array. Best when you want the profile and its whole archive as a single object.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Example **profile** item (postItems mode):

```json
{
    "type": "profile",
    "blogId": "naverofficial",
    "blogUrl": "https://blog.naver.com/naverofficial",
    "blogName": "네이버 공식블로그",
    "nickName": "naverofficial",
    "officialBlog": true,
    "subscriberCount": 96330,
    "totalVisitorCount": 156848815,
    "postCount": 2595,
    "categoryCount": 13,
    "categories": [{ "categoryNo": 105, "categoryName": "서비스 인사이드", "postCnt": 1994, "isChild": false }]
}
```

Example **post** item (postItems mode; `content` present only when `includePostContent` is on):

```json
{
    "type": "post",
    "blogId": "naverofficial",
    "blogName": "네이버 공식블로그",
    "logNo": "224342736839",
    "url": "https://blog.naver.com/naverofficial/224342736839",
    "title": "네이버 프라이버시 챌린지에 참여하세요!",
    "briefContents": "AI 시대의 개인정보 보호를 함께 고민할 …",
    "content": "AI 시대의 개인정보 보호를 함께 고민할 대학(원)생 여러분을 초대합니다. …",
    "contentLength": 516,
    "categoryName": "이벤트/캠페인.zip",
    "addedAt": "2026-07-13T00:30:00.000Z",
    "commentCount": 2,
    "sympathyCount": 61,
    "thumbnailUrl": "https://mblogthumb-phinf.pstatic.net/…/03_.png"
}
```

#### Data fields

**Profile**

| Field                                     | Description                                      |
| ----------------------------------------- | ------------------------------------------------ |
| `blogId`                                  | Canonical Naver blog ID (resolved from aliases). |
| `blogUrl` / `mobileBlogUrl`               | Desktop and mobile blog URLs.                    |
| `blogName`                                | The blog's title.                                |
| `nickName` / `displayNickName`            | Author nickname(s).                              |
| `officialBlog` / `powerBlog`              | Naver status badges.                             |
| `subscriberCount`                         | Number of neighbours / subscribers (이웃).       |
| `totalVisitorCount` / `dayVisitorCount`   | Lifetime and today's visitor counts.             |
| `postCount` / `momentCount`               | Total posts and moments (모먼트).                |
| `profileImageUrl` / `mobileTitleImageUrl` | Profile and cover images.                        |
| `categories`                              | Category tree with per-category `postCnt`.       |

**Each post**

| Field                         | Description                             |
| ----------------------------- | --------------------------------------- |
| `logNo`                       | Naver's post ID.                        |
| `url` / `mobileUrl`           | Links to the post.                      |
| `title`                       | Post title.                             |
| `briefContents`               | Short text preview.                     |
| `content` / `contentLength`   | Full body text + length (opt-in).       |
| `categoryNo` / `categoryName` | The post's category.                    |
| `addedAt` / `addDate`         | Publish time (ISO 8601 / epoch ms).     |
| `commentCount`                | Number of comments.                     |
| `sympathyCount`               | Number of likes (공감).                 |
| `shareCount`                  | Number of shares.                       |
| `thumbnailUrl` / `thumbnails` | Post thumbnail image(s).                |
| `hasVideo`                    | Whether the post has a video thumbnail. |

### How much does it cost to scrape Naver blogs?

This Actor uses **pay-per-event** pricing: a small charge per blog profile resolved, plus a charge per post scraped. Cost therefore scales with output — a profile-only run (`scrapePosts` off) is cheapest, and you can cap spend on prolific bloggers with **Max posts per blog**. See the **Pricing** tab for current per-event rates; the Apify free tier is enough to try it out.

### Tips & advanced options

- **Profile-only, fast & cheap:** set `scrapePosts` to `false` to fetch just the profile and category tree.
- **Cap large archives:** some blogs have thousands of posts — set `maxPosts` to keep runs fast and predictable.
- **Focus a topic:** pass a `categoryNo` (find the values in each record's `categories` list) to scrape only one category.
- **Use Korean residential proxies:** Naver rate-limits datacenter and non-Korean IPs. The default (Apify Proxy, RESIDENTIAL, country KR) is strongly recommended; the Actor also self-throttles and retries on rate limits.

### FAQ, disclaimers & support

**Is scraping Naver Blog legal?** This Actor collects only **publicly available** information that anyone can view without logging in. You are responsible for how you use the data, including compliance with Naver's Terms of Service and applicable laws (such as GDPR / PIPA) when handling any personal data. Do not use it to collect private or sensitive information.

**Why is a blog missing from the output?** Blogs that don't exist, are private, or have been blocked return a not-found response and are skipped with a warning — the rest of the run continues.

**Does it fetch the full post body / images / comments?** Turn on **Include full post content** to get each post's full body **text** (`content`). Images are returned as thumbnail URLs, and comment threads are not fetched (only the comment count). Full-content mode makes one extra request per post, so it's slower — pair it with **Max posts per blog**. Let us know via the **Issues** tab if you need comment threads or inline media.

**Found a bug or need a custom solution?** Open a ticket on the **Issues** tab — feedback and feature requests are welcome.

# Actor input Schema

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

Naver blogger IDs or blog URLs — one per line. Accepts a bare ID (e.g. `naverofficial`), a `@handle`, or any blog URL: `https://blog.naver.com/naverofficial`, `https://m.blog.naver.com/naverofficial`, or a link to a single post (the blogger is taken from it).

## `scrapePosts` (type: `boolean`):

Crawl the blogger's full post list (from their post directory / 카테고리). Turn off to fetch profile + category tree only — fast and cheap.

## `maxPosts` (type: `integer`):

Cap the number of posts scraped per blog (newest first). Defaults to 100 to keep a first run small, fast, and cheap. Set to 0 to scrape the entire archive. You are billed per post scraped, so use this to control cost on prolific bloggers.

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

Fetch each post's full body text (the article content), not just the short preview. This makes an extra request per post, so runs are slower — combine with 'Max posts per blog' on large blogs.

## `outputMode` (type: `string`):

How results are stored. 'One item per post' emits a separate dataset item for every post (plus one profile item per blog) — best for spreadsheets and per-post analysis. 'One item per blog' emits a single record per blogger with all posts nested under a `posts` array.

## `categoryNo` (type: `integer`):

Restrict posts to a single category by its Naver categoryNo. Leave at 0 to scrape all posts (전체글). The available categoryNo values appear in each record's `categories` list.

## `includeCategories` (type: `boolean`):

Attach the blogger's full category tree (names, per-category post counts) to the output record.

## `language` (type: `string`):

Accept-Language hint sent to Naver. Korean is strongly recommended — Naver serves Korean content regardless, and non-Korean hints can trigger stricter bot checks.

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

Maximum blogs processed in parallel. Naver rate-limits aggressively and the Actor self-throttles, so keep this modest.

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

Proxy used for every request. Naver rate-limits datacenter and non-Korean IPs, so Korean residential proxies are strongly recommended. Defaults to Apify Proxy (RESIDENTIAL, country KR).

## Actor input object example

```json
{
  "blogs": [
    "naverofficial",
    "https://blog.naver.com/naver_diary"
  ],
  "scrapePosts": true,
  "maxPosts": 100,
  "includePostContent": false,
  "outputMode": "postItems",
  "categoryNo": 0,
  "includeCategories": true,
  "language": "ko",
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KR"
  }
}
```

# 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 = {
    "blogs": [
        "naverofficial"
    ],
    "maxPosts": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("hgservices/naver-blog-profile-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 = {
    "blogs": ["naverofficial"],
    "maxPosts": 100,
}

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

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

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

```

## CLI example

```bash
echo '{
  "blogs": [
    "naverofficial"
  ],
  "maxPosts": 100
}' |
apify call hgservices/naver-blog-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=hgservices/naver-blog-profile-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/kvYdAxtaEzUOidoYn/builds/MUkiG2Fervon0GODD/openapi.json
