Skip to main content
Thirdwatchthirdwatch
Companies & leads

Build a Korean SEO Keyword Dataset From Naver

Export Naver result sets per keyword as JSON — which domains, publishers, and surfaces own each term — for a Korea-specific SEO strategy.

Editorial illustration for companies & leads
Sep 21, 2026 · 2 min read · 450 words
View the Apify scraper →

TL;DR — The Naver Scraper exports per-keyword SERPs — domain, publisher, surface, rank — as JSON. Korean SEO runs on Naver's blog/cafe/news blend, and this dataset shows which surface actually owns each term.

Why Korean SEO is a different game

Naver's results page isn't ten blue links — it's a blend of blogs, cafes, news, Knowledge-iN, video, and web results. Ranking "on Naver" often means winning a cafe thread or a blog placement, not a domain. Keyword research built on Google data misses the platform where Koreans actually search.

The job-to-be-done: for each target keyword, which surface owns the visible slots, and who publishes them.

How does this compare to the alternatives?

Google keyword tools Korean SEO agencies Thirdwatch actor
Cost Wrong platform Retainers Pay per result
Reliability Misses SERP blend Good, slow Direct SERP data
Setup time Zero Onboarding Minutes
Maintenance N/A Per report Scheduled runs

How to build the dataset in 4 steps

How do I pull the keyword SERPs?

import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
keywords = ["무선 이어폰 추천", "캠핑용품 리스트", "피부관리 루틴"]
run = client.actor("thirdwatch/naver-scraper").call(
    run_input={
        "queries": keywords,
        "searchType": "all",
        "sort": "relevance",
        "maxResultsPerQuery": 30,
        "includeSponsored": False,
    }
)
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())

How do I profile surface ownership per keyword?

import pandas as pd
df = pd.DataFrame(rows)
surface_mix = df.groupby(["query", "result_source"]).size().unstack(fill_value=0)
print(surface_mix)

A keyword dominated by cafe results wants community content; one dominated by web results wants a real landing page.

How do I find the winning publishers?

print(df[df["rank"] <= 5].groupby(["query", "publisher"]).size())

Top-5 publishers per keyword are your content-competition set — or your influencer outreach list.

How do I track movement?

Store runs monthly keyed by (query, url); rank deltas show which publishers are climbing on your terms.

Sample output

{"query": "무선 이어폰 추천", "search_type": "blog", "rank": 1,
 "title": "2026 무선 이어폰 추천 TOP 7",
 "url": "https://blog.naver.com/audiophile/224477889",
 "publisher": "리뷰하는 사람", "published_label": "3일 전",
 "result_source": "blog", "is_sponsored": false}

Common pitfalls

Naver rankings favor platform-native content — its own blogs and cafes outrank external sites structurally, which the data will show plainly. Freshness weighs heavily — sort by relevance AND check recent separately to see both pictures. Sponsored slots interleave; is_sponsored keeps them out of the organic analysis. The actor maps the SERP; content creation in Korean is the follow-through.

Related use cases

Frequently asked questions

Why can't I use Google SEO data for Korea?

Naver's SERP mixes surfaces differently — blogs, cafes, and Knowledge-iN compete with web results. Korean SEO strategy needs Naver result data: which surface and which publisher owns each term.

What does the actor return per keyword?

Ranked records with title, URL, publisher, date label, surface tag, and rank — enough to map who owns a term and through which content type.

Can I see which surface dominates a keyword?

Yes — searchType 'all' returns the blended SERP with result_source tags. If cafes own page one, blog-and-cafe content is your channel, not a landing page.

How do I track ranking changes?

Rerun the keyword set on a schedule and diff rank positions per URL — Naver's rankings shift with content freshness, so freshness is the lever.

Related