# Naver Map Scraper - Places, Reviews & Blog Posts (No Login) (`benthepythondev/naver-map-reviews-blog-scraper`) Actor

Scrape Naver Map (네이버 지도) places by keyword or link: name, category, phone, address, coordinates, rating, review counts, hours status. Add every visitor review (full list, not the first page) and the blog reviews of each place, or search Naver Blog posts by keyword. No login.

- **URL**: https://apify.com/benthepythondev/naver-map-reviews-blog-scraper.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (community)
- **Categories:** Lead generation, Marketing, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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 Map Scraper: Places, Reviews & Blog Posts (No Login)

Scrape **Naver Map (네이버 지도)** and **Naver Place (네이버 플레이스)**, Korea's main local search: search places the way a Korean user does, get name, category, phone, address, coordinates, rating and review counts, then add **every visitor review** of each place and the **Naver Blog reviews** Naver links to it. A second mode searches **Naver Blog** posts by keyword. No login, no cookies, no browser. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

**What a run costs:** one price per saved row (a place, a review or a blog post). **From 8 November 2026: $0.001** on the Free plan, $0.0009 on Bronze, $0.00085 on Silver, $0.0008 on Gold and above, so 1,000 reviews cost $1 or less. Until then the Actor's earlier price of $0.0025 a row still applies (Apify needs 14 days for a price change). Plus $0.00005 per run; a search without results costs nothing beyond the start.

### 🔎 What is the Naver Map Scraper?

Google Maps barely covers Korea; Koreans look up restaurants, clinics, salons and hotels on Naver. This Actor reads Naver Place's own data calls, so it returns what the Naver Map app shows, in Korean (or Naver's English where it exists).

#### What data does it extract?

- **Places:** place id, name, category, business type, phone (incl. Naver's 0507 virtual numbers), road and lot address, area, latitude/longitude, visitor rating, visitor and blog review counts, saves, open now status, amenities (예약, 주차, 포장…), one-line summary, booking and Naver Pay flags, image, Naver Map link, search rank.
- **Visitor reviews (방문자 리뷰):** review id, stars, full text, visit date, receipt/payment verification, visit count, ordered menu item, voted keywords (음식이 맛있어요…), owner reply, photo links, reviewer nickname.
- **Blog reviews of a place (블로그 리뷰):** blog or cafe post title, text preview, link, blog name, date, thumbnail.
- **Naver Blog search:** title, snippet, post link, blog id, post number, blog name, author nickname, publish time, thumbnails, rank.

#### What users of other Naver Actors report, and what this one does

| Reported elsewhere | Here |
|---|---|
| Review pagination returns the same reviews again | Reviews are paged with Naver's own cursor: 1,656 of 1,656 reviews of one restaurant in 35 calls, none twice |
| Request failures and skipped keywords | Failed calls are asked again and move to another proxy route; a keyword is only reported empty when Naver says so |
| Places, reviews and blog posts need three Actors | One run does all three, and each row says its `type` |
| 4 GB browser runs | Plain HTTP at 256 MB |

### ⬇️ Input

| Field | What it does |
|---|---|
| `searchQueries` | Searches as typed into Naver Map, e.g. `강남역 맛집`, `부산 호텔`. Up to 300 places each. |
| `placeUrls` | Naver Map / Place links or bare ids, for places you already know. |
| `maxPlacesPerQuery` | Places per search (1 to 300, default 20). |
| `latitude`, `longitude` | Optional search center; places are ranked from there. |
| `visitorReviewsPerPlace` | Visitor reviews per place, newest first (0 = none). |
| `blogReviewsPerPlace` | Blog/cafe reviews per place (0 = none, Naver links about 110 at most). |
| `reviewsSince` | Skip reviews older than this day (YYYY-MM-DD). |
| `blogKeywords` | Naver Blog keyword searches, up to 1,000 posts each. |
| `maxPostsPerKeyword`, `blogSort`, `blogStartDate`, `blogEndDate` | Depth, order (relevance or newest) and date range of the blog search. |
| `language` | `ko` (default) or `en`. |

#### Example input

```json
{
  "searchQueries": ["강남역 맛집", "성수동 카페"],
  "maxPlacesPerQuery": 50,
  "visitorReviewsPerPlace": 100,
  "blogReviewsPerPlace": 10,
  "reviewsSince": "2026-01-01",
  "blogKeywords": ["성수동 카페"],
  "maxPostsPerKeyword": 100
}
```

### ⬆️ Output

```json
{
  "type": "place",
  "placeId": "31110991",
  "name": "닭갈비전 강남점",
  "category": "닭갈비",
  "businessType": "restaurant",
  "phone": "0507-1402-1568",
  "roadAddress": "서초대로73길 54 강남디오빌 2층 닭갈비전",
  "fullAddress": "서울특별시 서초구 서초동 1309-1 강남디오빌 2층 닭갈비전",
  "latitude": 37.5020765,
  "longitude": 127.023964,
  "visitorReviewCount": 1806,
  "visitorReviewScore": 4.88,
  "blogReviewCount": 1457,
  "openStatus": "영업 전",
  "options": ["예약", "포장", "주차"],
  "placeUrl": "https://map.naver.com/p/entry/place/31110991",
  "searchQuery": "강남역 맛집",
  "rank": 1
}
```

```json
{
  "type": "visitorReview",
  "placeId": "1000404935",
  "placeName": "도래집 강남점",
  "reviewId": "6addec72d23dab7ffba3e7d2",
  "rating": 5,
  "text": "양도 푸짐하고 도래창 처음 먹어보는데 … 정말 맛있었습니다",
  "visitedAt": "2026-10-25T11:13:09.000Z",
  "verifiedBy": "영수증",
  "menuItem": "도래창+소금막창se",
  "keywords": ["음식이 맛있어요", "친절해요"],
  "ownerReply": null,
  "imageUrls": ["https://pup-review-phinf.pstatic.net/…"],
  "authorNickname": "…"
}
```

`blogReview` rows carry `title`, `text`, `url`, `blogName`, `publishedAt`; `blogPost` rows carry `keyword`, `rank`, `title`, `snippet`, `url`, `blogId`, `logNo`, `blogName`, `publishedAt`, `thumbnailUrls`. Every row has `scrapedAt`.

### 🤖 For AI agents

Copy this input; every field is optional and no credential is needed:

```json
{"searchQueries": ["홍대 카페"], "maxPlacesPerQuery": 10, "visitorReviewsPerPlace": 20}
```

Filter rows by `type` (`place`, `visitorReview`, `blogReview`, `blogPost`).

### 💡 Use cases

- 📍 **Korean local lead lists:** clinics, salons, academies or restaurants of a district with phone and address.
- ⭐ **Review monitoring:** a weekly run with `reviewsSince` returns only new reviews and owner replies of your or your competitors' places.
- 📊 **Market research:** ratings, review counts and voted keywords across a category and area.
- 📝 **Influencer and content research:** which bloggers write about a place or a keyword, and when.

### ⚠️ Limits

- Naver shows at most **300 places per search** and **1,000 blog posts per keyword**. Split a city into districts (`강남구 치과`, `서초구 치과`) for more.
- Naver links about **110 blog reviews** to a place, whatever its blog review count says.
- `reviewsSince` uses the visit date, which Naver sorts nearly but not exactly in order; the list ends after two pages with no newer review.
- Visitor review dates are visit dates; Naver gives visitors no exact posting time.
- Reviewer nicknames are the public names Naver shows; no profile or contact data of reviewers is collected.

### ❓ FAQ

**Do I need a Naver account or API key?** No. The Actor reads what any logged-out visitor sees.

**Why Korean search words?** Naver ranks places by Korean text. English words work for some places; Korean gives full results.

**Can I get all reviews of one place?** Yes: put its link into `placeUrls` and set `visitorReviewsPerPlace` to its review count.

**How fast is it?** On our test server 61 places with 1,209 reviews, 105 blog reviews and 40 blog posts took 25 seconds.

**Does a place found by two searches cost twice?** No, each place, review and post is saved once per run.

**What happens on a timeout or a spending limit?** The run stops in time, keeps its rows and says so; run it again with the same input to continue without paying twice.

**Can I get menus with prices or opening hours per day?** Not in this version; the place row has the open-now status and description.

**Is it legal?** It collects public business listings and public reviews. You are responsible for how you use them: follow Korea's PIPA, GDPR where it applies, and Naver's terms, and do not use reviewer nicknames for contact or profiling.

### 🔗 You might also like

- [Google Maps Business Scraper](https://apify.com/benthepythondev/google-maps-business-scraper)
- [Google Maps Email Scraper](https://apify.com/benthepythondev/google-maps-email-scraper)
- [Bilibili Scraper](https://apify.com/benthepythondev/bilibili-scraper)

**Keywords:** naver map scraper, naver place scraper, 네이버 지도 크롤링, 네이버 플레이스 리뷰, naver place reviews, naver blog scraper, 네이버 블로그 크롤러, korean business data, korea local leads, naver visitor reviews, naver map api, korean restaurant data, naver blog search api, south korea places, naver review monitoring

# Actor input Schema

## `searchQueries` (type: `array`):

What you would type into Naver Map, in Korean for best results, e.g. 강남역 맛집, 부산 호텔, 홍대 카페. Each search returns up to 300 places, ranked as Naver ranks them.

## `placeUrls` (type: `array`):

Naver Map or Naver Place links (map.naver.com/p/entry/place/31110991, m.place.naver.com/restaurant/31110991/home) or bare place ids. Use this to read the reviews of places you already know.

## `maxPlacesPerQuery` (type: `integer`):

How many places to save for each search. Naver shows at most 300 per search.

## `latitude` (type: `number`):

Optional. Rank places by distance from this point, like a phone user standing there (e.g. 37.4979 for Gangnam Station). Needs longitude too.

## `longitude` (type: `number`):

Optional. Longitude of the search center (e.g. 127.0276).

## `visitorReviewsPerPlace` (type: `integer`):

0 = none. Visitor reviews (방문자 리뷰) of each place, newest first: stars, text, visit date, voted keywords, owner reply, photos. The whole list is reachable, not only the first page.

## `blogReviewsPerPlace` (type: `integer`):

0 = none. Naver Blog and Cafe posts that Naver links to each place (블로그 리뷰): title, text preview, link, date. Naver links about 110 at most per place.

## `reviewsSince` (type: `string`):

Optional, YYYY-MM-DD. Skip visitor and blog reviews older than this day; good for a weekly monitoring run.

## `blogKeywords` (type: `array`):

Search Naver Blog posts by keyword (e.g. 성수동 카페, 다이어트 식단). Each keyword returns up to 1,000 posts with title, snippet, link, blog name and date.

## `maxPostsPerKeyword` (type: `integer`):

How many blog posts to save per keyword. Naver shows at most 1,000.

## `blogSort` (type: `string`):

Order of blog search results.

## `blogStartDate` (type: `string`):

Optional, YYYY-MM-DD. Only blog posts published on or after this day.

## `blogEndDate` (type: `string`):

Optional, YYYY-MM-DD. Only blog posts published on or before this day.

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

Korean gives Naver's original names and addresses; English gives Naver's English names and categories where they exist.

## Actor input object example

```json
{
  "searchQueries": [
    "강남역 맛집"
  ],
  "maxPlacesPerQuery": 20,
  "visitorReviewsPerPlace": 0,
  "blogReviewsPerPlace": 0,
  "maxPostsPerKeyword": 30,
  "blogSort": "relevance",
  "language": "ko"
}
```

# 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 = {
    "searchQueries": [
        "강남역 맛집"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/naver-map-reviews-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 = { "searchQueries": ["강남역 맛집"] }

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/naver-map-reviews-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 '{
  "searchQueries": [
    "강남역 맛집"
  ]
}' |
apify call benthepythondev/naver-map-reviews-blog-scraper --silent --output-dataset

```

## MCP server setup

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