# Naver Blog Search Scraper (`devilscrapes/naver-blog-search-scraper`) Actor

Search Naver's blog tab by keyword and get one row per post: post URL, blogId, logNo, title, snippet, blog name, publish date and thumbnail. Korean keywords supported, deep paging up to 600 posts per query, ads skipped. Export to JSON or CSV.

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

## Pricing

Pay per event

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

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## Naver Blog Search Scraper

**💰 $2.00 / 1 000 results**  ·  pay only for results  ·  no credit card to try

*We do the dirty work so your dataset stays clean.* 😈

Search Naver's blog tab by keyword and get one row per post: URL, blogId, title, snippet, blog name, date and thumbnail.

</div>

***

### 🎯 What this scrapes

Naver has no public search API for its blog tab. This Actor takes one or more keywords (Korean or any UTF-8 text), runs the Naver blog search and writes one dataset row per blog post: post URL, `blogId`, `logNo`, title, snippet, blog name, blog URL, publish date and thumbnail. Ads are skipped, duplicate posts are removed, and every keyword is paged automatically up to the cap you set (600 posts per keyword at most).

Only public search-result metadata is collected. Post bodies, comments and likes are not part of the output.

### 🔥 Features

- 🔎 **Korean keywords work out of the box.** Queries are sent as UTF-8, one search per keyword.
- 📄 **Deep paging.** Up to 600 posts per keyword (20 pages), 30 posts per page, de-duplicated by `blogId` + `logNo`.
- 🚫 **Ads are skipped.** Only organic blog posts become rows.
- 🛡️ **We rotate browser fingerprints** so Naver sees a real browser, not a script.
- 🌐 **We rotate proxies** through Apify Proxy with a fresh session on every block.
- 🔁 **We retry with exponential backoff** on `408 / 429 / 5xx` and honour `Retry-After`. Up to 5 attempts per page.
- 🧱 **One bad keyword never sinks the run.** Rows already collected are kept and the status message says where a keyword stopped.
- 🧊 **Clean, typed rows** with ISO-8601 timestamps and stable post IDs.
- 💰 **You pay only for results that land.**

### 💡 Use cases

- **SEO research.** See which blogs and posts show up for a Korean keyword.
- **Brand and product monitoring.** Track what bloggers write about a product, place or topic.
- **Market research.** Build Korean-language corpora of post titles and snippets from public search results.
- **Influencer discovery.** Find active blogs per topic; rows include the influencer profile URL when Naver exposes one.

### ⚙️ How to use it

1. Click **Try for free**.
2. Add one or more keywords to `queries`, one per line.
3. Set `maxResultsPerQuery` (default 60, maximum 600).
4. Click **Start**, then export the dataset as JSON, CSV or Excel.

### 📥 Input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `queries` | `array` | **yes** | `["강릉 맛집"]` | Keywords to search, 1 to 50. Blanks are dropped and exact duplicates removed. |
| `maxResultsPerQuery` | `integer` | no | `60` | 1 to 600 posts per keyword. |
| `proxyConfiguration` | `object` | no | Apify Proxy | Results depend on the exit region. |

```json
{
  "queries": ["강릉 맛집"],
  "maxResultsPerQuery": 60,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### 📤 Output

One row per blog post.

| Field | Type | Notes |
|---|---|---|
| `query` | `string` | Keyword that produced the row. |
| `position` | `integer` | 1-based position among the keyword's de-duplicated organic posts. |
| `postUrl` | `string` | Blog post URL. |
| `blogId` / `logNo` | `string` | Parsed from the post URL. |
| `title` / `snippet` | `string` | Post title and result snippet (highlights removed). |
| `blogName` / `blogUrl` | `string` | Blog display name and home URL. |
| `influencerUrl` | `string \| null` | Naver influencer profile, when the source is one. |
| `publishedAtRaw` | `string \| null` | Date text exactly as Naver shows it. |
| `publishedAt` | `string \| null` | ISO date, only for absolute dates such as `2026.07.24.`. |
| `publishedAtRelative` | `string \| null` | Relative text such as `3주 전`, kept unconverted. |
| `thumbnailUrl` | `string \| null` | First post image. |
| `scrapedAt` | `string` | ISO-8601 UTC timestamp of the run. |

```json
{
  "query": "강릉 맛집",
  "position": 1,
  "postUrl": "https://blog.naver.com/104204303/224424493170",
  "blogId": "104204303",
  "logNo": "224424493170",
  "title": "강릉 물회 맛집 장안횟집 풍자 또간집 미역국이 킥",
  "snippet": "강릉 맛집 메뉴판 메뉴는 물회와 회덮밥, 미역국을 중심으로 ...",
  "blogName": "매아",
  "blogUrl": "https://blog.naver.com/104204303",
  "influencerUrl": "https://in.naver.com/104204303",
  "publishedAtRaw": "2주 전",
  "publishedAt": null,
  "publishedAtRelative": "2주 전",
  "thumbnailUrl": "https://search.pstatic.net/common/?src=...&type=f250_208",
  "scrapedAt": "2026-10-11T10:00:00Z"
}
```

### 💰 Pricing

Pay-per-event. You are charged only for what the run produces.

| Event | USD | What it is |
|---|---:|---|
| `actor-start` | $0.20 | One-off warm-up charge per run |
| `result` | $0.002 | Per blog post written to the dataset |

**Example:** 1 000 posts cost $2.00 for results plus the $0.20 start fee, so about **$2.20** in total. A keyword with no matching posts costs only the start fee.

### 🚧 Limitations

- Blog tab only: no cafe, news or Knowledge-iN results and no post bodies.
- Results depend on the exit region of the proxy, so the same keyword can return a slightly different set from different regions.
- Relative dates such as `3주 전` are kept as text and not converted to a calendar date.
- Depth is capped at 600 posts per keyword.
- No sort or date-range filter: results come in Naver's default blog-tab order.

### ❓ FAQ

**Does it return ads?** No, ad cards are skipped.

**Can I search in Korean?** Yes, keywords are sent as UTF-8.

**What if a keyword has no results?** The run succeeds with zero rows for that keyword and the status message says so.

**Why are two keywords returning the same post?** Rows are de-duplicated within a keyword, not across keywords. Each row carries its `query` so you can group or de-duplicate as you like.

**What happens if Naver blocks a request?** We retry with backoff, rotate the session and fingerprint, and keep the rows already collected. If a keyword cannot finish, the status message shows how far it got.

### 💬 Your feedback

Found a bug or need a new field? Open an issue on the Actor's **Issues** tab in Apify Console.

***

<div align="center">

Built by **[Devil Scrapes](https://apify.com/DevilScrapes)** 😈 — a small fleet of
opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

</div>

# Changelog

This Actor's version history is a separate document: https://apify.com/devilscrapes/naver-blog-search-scraper/changelog.md

# Actor input Schema

## `queries` (type: `array`):

Keywords to search on Naver blogs (Korean or any UTF-8 text). One per line, up to 50.

## `maxResultsPerQuery` (type: `integer`):

Cap on blog posts returned per keyword. 600 is the deepest verified (20 pages).

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

Apify Proxy settings. Results depend on the exit region.

## Actor input object example

```json
{
  "queries": [
    "강릉 맛집"
  ],
  "maxResultsPerQuery": 60,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `output` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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 = {
    "queries": [
        "강릉 맛집"
    ],
    "maxResultsPerQuery": 60,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/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 = {
    "queries": ["강릉 맛집"],
    "maxResultsPerQuery": 60,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/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 '{
  "queries": [
    "강릉 맛집"
  ],
  "maxResultsPerQuery": 60,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call devilscrapes/naver-blog-search-scraper --silent --output-dataset

```

## MCP server setup

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