Naver is not a single site. The blocking levels vary for each service.
Reading Time: 14 minutes | As of January 2026
Key Summary
Naver is the largest portal in the Korean search market, occupying about 55% market share. There are various services like Naver Shopping, Blog, Cafe, Smart Store, etc., that you may want to crawl.
The problem is that the blocking methods and difficulty level vary for each service. While blogs are relatively easy, Smart Store even involves CAPTCHA. It's not just one issue of "Naver crawling," but a separate issue for each service.
Topics covered in this article:
- Crawling difficulty for each Naver service (from easy to difficult)
- Blocking methods for each service (reasons for being blocked, technically)
- Effective solutions that work (custom code examples for each service)
- Naver API vs. Crawling (when to use which)
Table of Contents
- Crawling Difficulty for Each Naver Service
- Naver's Bot Blocking Technology
- Naver Shopping Crawling
- Naver Blog Crawling
- Smart Store Crawling
- Naver Cafe Crawling
- Naver Place Crawling
- Naver Official API Overview
- Solving Everything at Once with Crawling API Services
- Frequently Asked Questions
1. Crawling Difficulty for Each Naver Service
Naver has dozens of services under one domain. The crawling difficulty varies greatly.
| Service | Domain | Difficulty | Main Blocking Method | requests Allowed |
|---|---|---|---|---|
| Naver Search | search.naver.com | Rate limiting | △ (partial) | |
| Naver Blog | blog.naver.com | iframe structure | (bypass possible) | |
| Naver News | news.naver.com | Rate limiting | ||
| Naver Shopping | shopping.naver.com | JavaScript rendering, internal API | △ (requires API analysis) | |
| Naver Place | m.place.naver.com | JavaScript + internal API | △ (requires API analysis) | |
| Naver Cafe | cafe.naver.com | Login required, permission check | (mostly) | |
| Smart Store | smartstore.naver.com | CAPTCHA, JavaScript challenge | ||
| Naver Pay | pay.naver.com | Login + security token |
Key Pattern: Services directly related to money (Smart Store, Pay) have stronger security.
2. Naver's Bot Blocking Technology
Unlike Coupang using Akamai, Naver operates its own bot blocking system. The update cycle is irregular compared to external solutions, sometimes being loose and sometimes suddenly reinforced.
Naver's Defense System
요청 수신
│
├─ Layer 1: robots.txt
│ └─ Googlebot 등 주요 크롤러 외 대부분 차단
│ └─ 실제 강제력은 없으나, 위반 시 법적 분쟁 불리
│
├─ Layer 2: Rate Limiting
│ └─ IP당 분당 요청 수 제한
│ └─ 초과 시 일시 차단 (보통 5~30분)
│
├─ Layer 3: JavaScript 렌더링 의존
│ └─ 핵심 데이터를 JS로 동적 로드 (쇼핑, 플레이스)
│ └─ SSR(서버 사이드 렌더링) 미적용 페이지가 많음
│
├─ Layer 4: 캡챠 (스마트스토어 중심)
│ └─ 의심스러운 접근에 네이버 자체 캡챠 표시
│ └─ 최근 발생 빈도 증가 추세
│
└─ Layer 5: 로그인/권한 체크 (카페)
└─ 회원 등급별 접근 제한
└─ 비회원에게 본문 차단
Coupang vs. Naver: Blocking Level Comparison
| Criteria | Coupang | Naver |
|---|---|---|
| Bot Blocking Solution | Akamai Bot Manager (external) | In-house development |
| TLS Fingerprint Check | (JA3/JA4 hash) | (mostly) |
| JavaScript Challenge | (fully implemented) | △ (varies by service) |
| Sensor Data Collection | (_abck cookie) | |
| CAPTCHA | present | intermittent in Smart Store |
| Access via requests | 100% blocked | possible depending on service |
| Overall Difficulty | (average) |
Conclusion: Naver is generally easier than Coupang, but the difficulty varies significantly depending on the service. Blog crawling and Smart Store crawling are entirely different problems.
3. Naver Shopping Crawling
Understanding the Structure
Naver Shopping is designed as a Single Page Application (SPA). The product list visible in the browser is fetched by JavaScript calling internal APIs after page load.
브라우저가 shopping.naver.com 접속
→ 빈 HTML 프레임 로드
→ JavaScript 실행
→ 내부 API 호출 (shopping.naver.com/api/...)
→ JSON 응답 수신
→ 상품 카드 렌더링
Therefore, if you only fetch HTML via requests, there won't be any product data. There are two methods.
Method 1: Directly Calling Internal API (Fastest and Most Efficient)
Check the APIs Naver Shopping calls in the browser developer tools (F12 → Network tab) and make the same calls.
import requests
# 네이버 쇼핑 검색 내부 API
url = "https://shopping.naver.com/api/search"
params = {
"query": "에어팟",
"pagingIndex": 1,
"pagingSize": 40,
"sort": "rel" # rel=관련도, price_asc=낮은가격, review=리뷰많은
}
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...",
"Referer": "https://shopping.naver.com/search/all?query=에어팟"
}
response = requests.get(url, params=params, headers=headers)
data = response.json()
for item in data["shoppingResult"]["products"]:
print(f"{item['productTitle']} - {item['price']}원 ({item['reviewCount']}건 리뷰)")
Advantages: No need for browser rendering, fast, direct JSON reception
Caution:
- Internal API endpoints/parameters can be changed by Naver without notice
- 403 returned if Referer header is missing
- IP temporary block for excessive requests (recommended delay between requests: 1-3 seconds)
- Actual API path needs to be verified up-to-date in developer tools
Method 2: Browser Rendering with Playwright
If internal API analysis is difficult or complex filtering/sorting is required:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://shopping.naver.com/search/all?query=에어팟")
# 상품 목록이 렌더링될 때까지 대기
page.wait_for_selector('[class*="product_item"]', timeout=10000)
products = page.query_selector_all('[class*="product_item"]')
for product in products[:10]:
title_el = product.query_selector('[class*="product_title"]')
price_el = product.query_selector('[class*="price_num"]')
if title_el and price_el:
print(f"{title_el.inner_text()} - {price_el.inner_text()}")
browser.close()
Note: Naver Shopping's block on headless browsers is not as strong as Coupang (Akamai), so it often works fine in basic Playwright headless mode. However, IP blocking may occur with bulk requests.
Method 3: Naver Shopping Search API (Official)
Official API provided for free by Naver Developer Center:
import requests
client_id = "YOUR_CLIENT_ID" # 네이버 개발자센터에서 발급
client_secret = "YOUR_CLIENT_SECRET"
url = "https://openapi.naver.com/v1/search/shop.json"
headers = {
"X-Naver-Client-Id": client_id,
"X-Naver-Client-Secret": client_secret
}
params = {
"query": "에어팟",
"display": 100, # 최대 100건
"start": 1, # 시작 위치 (최대 1000)
"sort": "sim" # sim=정확도, date=날짜, asc=가격오름, dsc=가격내림
}
response = requests.get(url, headers=headers, params=params)
data = response.json()
for item in data["items"]:
# HTML 태그 제거 필요 (title에 <b> 태그 포함)
import re
clean_title = re.sub('<[^<]+?>', '', item['title'])
print(f"{clean_title} - {item['lprice']}원 - {item['mallName']}")
Limitations of Official API:
- Daily limit of 25,000 requests
- Maximum of start parameter is 1,000 → unable to fetch more than 1,000 items
- Does not include detailed specs, full reviews, seller information
- Unable to fetch full product lists by category
- No real-time stock/delivery information
→ Sufficient for simple price comparison or keyword trends, but inadequate for in-depth data analysis.
4. Naver Blog Crawling
Structural Peculiarity: iframe
Naver Blog, operating since 2003, maintains a legacy service with an iframe-based structure.
blog.naver.com/username/포스트번호
└─ 외부 프레임 (헤더, 프로필, 카테고리)
└─ 내부 iframe (실제 글 내용)
└─ PostView.naver?blogId=xxx&logNo=yyy
Fetching blog.naver.com/username/12345 via requests only brings the HTML of the external frame, not the actual post content. You need to directly access the URL inside the iframe.
Solution: Directly Accessing PostView URL
import requests
from bs4 import BeautifulSoup
import re
blog_id = "example_blog"
post_no = "223456789"
# 방법 A: PostView URL 직접 접근 (가장 간단)
url = f"https://blog.naver.com/PostView.naver?blogId={blog_id}&logNo={post_no}"
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ..."}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
# 스마트에디터 ONE (최신 에디터) 본문 추출
content = soup.select_one(".se-main-container")
if content:
text = content.get_text(separator="\n", strip=True)
print(text)
# 구 에디터 (이전 글들)
if not content:
content = soup.select_one("#postViewArea")
if content:
text = content.get_text(separator="\n", strip=True)
print(text)
# 방법 B: 메인 페이지에서 iframe URL 추출 후 접근
main_url = f"https://blog.naver.com/{blog_id}/{post_no}"
response = requests.get(main_url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
# iframe src에서 logNo 추출
iframe = soup.select_one("iframe#mainFrame")
if iframe:
iframe_src = iframe.get("src", "")
# iframe_src를 파싱하여 PostView URL 구성
print(f"iframe URL: https://blog.naver.com{iframe_src}")
Mass Collection from Blog Search Results
import requests
import time
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
# 1단계: 검색 API로 블로그 URL 목록 수집
search_url = "https://openapi.naver.com/v1/search/blog.json"
headers = {
"X-Naver-Client-Id": client_id,
"X-Naver-Client-Secret": client_secret
}
params = {"query": "크롤링 자동화", "display": 100, "start": 1}
response = requests.get(search_url, headers=headers, params=params)
blog_urls = [item["link"] for item in response.json()["items"]]
# 2단계: 각 블로그 글 본문 수집
for url in blog_urls:
# blog.naver.com URL을 PostView URL로 변환
# (URL 파싱 로직 필요)
response = requests.get(url, headers={"User-Agent": "Mozilla/5.0 ..."})
soup = BeautifulSoup(response.text, "html.parser")
content = soup.select_one(".se-main-container")
if content:
print(content.get_text(strip=True)[:200])
time.sleep(2) # Rate limiting 방지
Cautions
- Private/Friend-Only Posts: Accessible only with login cookies
- Rate Limiting: Temporary block if exceeding 60-100 requests per minute (recommended delay: 1-2 seconds)
- Image URLs: Naver CDN (postfiles.pstatic.net) checks Referer →
Referer: https://blog.naver.comheader needed for direct image download - Editor Version: HTML structure differs between Smart Editor ONE (
.se-main-container) and old editor (#postViewArea) → both need to be handled
5. Smart Store Crawling
Why is Naver's Most Difficult
Smart Store is Naver's e-commerce platform directly linked to revenue, hence having strong security.
- Complete SPA: Entire product information rendered with JavaScript — no data in HTML
- CAPTCHA Occurrence: Naver's own CAPTCHA displayed when accessing multiple pages quickly
- Dynamic URLs: Format like
smartstore.naver.com/{storename}/products/{productID} - API Changes Frequency: Internal API structure changes frequently
Smart Store Internal API
Smart Store also calls REST APIs internally. You can check this in the developer tools:
import requests
# 스마트스토어 상품 상세 API (내부 — 변경될 수 있음)
store_id = "store_channel_id" # 상점의 채널 ID
product_id = "12345678"
api_url = f"https://smartstore.naver.com/i/v1/stores/{store_id}/products/{product_id}"
headers = {
"User-Agent": "Mozilla/5.0 ...",
"Referer": f"https://smartstore.naver.com/"
}
response = requests.get(api_url, headers=headers)
# 주의: 이 API는 차단되는 경우가 많음
# 성공하면 상품명, 가격, 옵션, 리뷰 수 등 JSON 반환
Practical Approach
| Scale | Recommended Method | Success Rate | Cost |
|---|---|---|---|
| Small (tens per day) | Playwright + 5-10 sec delay | 70-90% | Free |
| Medium (hundreds per day) | Crawling API Service | 95%+ | $35/month+ |
| Large (thousands+ per day) | Professional Crawling Service | 99%+ | $99/month+ |
# 소량 수집: Playwright 사용
from playwright.sync_api import sync_playwright
import time
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # headless=False 권장
page = browser.new_page()
url = "https://smartstore.naver.com/example_store/products/12345678"
page.goto(url)
page.wait_for_load_state("networkidle")
# 상품명
title = page.query_selector('._3StrMSMN5r') # 클래스명은 변경될 수 있음
# 가격
price = page.query_selector('._1LY7DqCnwR')
if title and price:
print(f"{title.inner_text()} - {price.inner_text()}")
time.sleep(5) # 캡챠 방지를 위한 딜레이
browser.close()
Important: Smart Store's CSS class names are obfuscated (hashed) and change with each deployment. Prioritize stable selectors like
data-testidoraria-label.
6. Naver Cafe Crawling
Key Issue: Login + Permissions
Most posts in Naver Cafe are members-only. Popular cafes have strict grade restrictions.
접근 권한 구조:
비회원 → 글 목록만 보임, 본문은 "카페 가입 후 이용" 메시지
가입 회원 → 일부 게시판만 접근 가능
등급 회원 → 전체 접근 가능 (활동 실적 필요)
Risks of Automated Login
Automating Naver login is technically possible but comes with several issues:
- Keyboard Security Module: Encrypts input values dynamically during naver.com login
- New Device Authentication: Requires 2nd authentication for login in a new environment
- Abnormal Behavior Detection: Account temporary suspension for abnormal patterns post-login
- Terms of Service Violation: Automated login violates Naver's terms of service
→ Due to the risk of permanent account suspension, it is not recommended.
Legal Alternatives
| Method | Description | Limitations |
|---|---|---|
| Naver Cafe API | Requires approval from cafe admin for API access | Requires admin cooperation |
| Manual Login + Automated Collection | Manually login in the browser and automate collection using cookies | Requires re-login upon session expiration |
| RSS Feed | Some cafe boards provide RSS | Limited to recent posts, partial content |
| Crawling API Service | Paid service supporting cafe crawling | Paid |
7. Naver Place Crawling
Naver Place (Maps) provides reports on local business data like store information, reviews, visitor counts, etc.
Structure
Naver Place is mobile web-based and loads data through internal APIs:
m.place.naver.com/restaurant/1234567890
→ JavaScript 로드
→ 내부 GraphQL API 호출
→ 가게 정보, 리뷰, 사진 등 렌더링
Utilizing Internal APIs
import requests
# 네이버 플레이스 내부 API (변경될 수 있음)
place_id = "1234567890"
api_url = f"https://api.place.naver.com/graphql"
headers = {
"User-Agent": "Mozilla/5.0 ...",
"Referer": f"https://m.place.naver.com/restaurant/{place_id}",
"Content-Type": "application/json"
}
# GraphQL 쿼리 (실제 쿼리는 개발자도구에서 확인 필요)
query = {
"operationName": "getPlaceDetail",
"variables": {"id": place_id},
"query": "query getPlaceDetail($id: String!) { ... }"
}
response = requests.post(api_url, headers=headers, json=query)
# 성공 시: 가게명, 주소, 전화번호, 영업시간, 평점, 리뷰 수 등
Caution: Naver Place's GraphQL query structure is complex and frequently changes. For stable collection, it's recommended to use a Crawling API service.
8. Naver Official API Overview
Review the APIs provided by Naver Developer Center (developers.naver.com) first. They are free and stable.
Available APIs
| API | Daily Limit | Key Data | Price | Issuance |
|---|---|---|---|---|
| Shopping Search | 25,000 requests | Product name, lowest price, shopping mall link | Free | Immediate |
| Blog Search | 25,000 requests | Title, summary, URL | Free | Immediate |
| News Search | 25,000 requests | Title, summary, publisher | Free | Immediate |
| Cafe Search | 25,000 requests | Title, summary, cafe name | Free | Immediate |
| Image Search | 25,000 requests | Image URL, source | Free | Immediate |
| Papago Translation | 10,000 characters/day | Translation result | Free | Immediate |
| Data Lab (Trends) | 1,000 requests | Search keyword trends (relative values) | Free | Immediate |
| Map/Location | Separate | Place, coordinates, directions | Free/Paid | Review |
When API is Sufficient
- Keyword-based product search + price comparison
- Keyword trend analysis (Naver Data Lab)
- News/Blog monitoring (keyword alerts)
- Basic market research
When API is Insufficient → Crawling Required
- Detailed product specs, full review text collection
- Category-wise full product lists (exceeding 1,000 items)
- Detailed information on Smart Store individual shops
- Real-time stock/delivery information
- Naver Place store details (reviews, visitor count)
- Collecting posts from specific cafes
9. Solving Everything at Once with Crawling API Services
Naver's services have different blocking methods, irregular API changes, and even CAPTCHA — trying to handle them all directly would require constant code adjustments.
By using a Crawling API service, you can crawl all Naver services with a single API.
One-Line Naver Crawling with API
import requests
API_KEY = "your-api-key"
# 네이버 쇼핑
response = requests.post(
"https://api.hashscraper.com/v1/scrape",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"url": "https://shopping.naver.com/search/all?query=에어팟", "format": "json"}
)
shopping_data = response.json()
# 스마트스토어 (캡챠 자동 처리)
response = requests.post(
"https://api.hashscraper.com/v1/scrape",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"url": "https://smartstore.naver.com/example/products/12345", "format": "json"}
)
store_data = response.json()
# 네이버 블로그
response = requests.post(
"https://api.hashscraper.com/v1/scrape",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"url": "https://blog.naver.com/example/223456789", "format": "json"}
)
blog_data = response.json()
Why API Services:
- No need to worry about service-specific blocking methods
- Automatic CAPTCHA handling (for Smart Store)
- Automatic JavaScript rendering
- Service adapts to internal API changes
- Receive neatly parsed JSON data
Naver Crawling with AI Agents
You can also request AI to crawl through MCP:
Claude Desktop에서:
"네이버 쇼핑에서 '무선 이어폰' 검색해서
상위 20개 상품의 이름, 가격, 리뷰 수를 표로 정리해줘"
→ Claude가 HashScraper MCP를 호출하여 자동으로 수집 + 정리
This method eliminates the need to write code, allowing non-developers to utilize Naver data. Refer to the guide on adding crawling functionality to AI agents for setup instructions.
10. Frequently Asked Questions
Q: Is Naver crawling legal?
Collecting public information (product prices, store information, etc.) from publicly available web pages is generally not a problem. However, the following cases may lead to legal disputes:
- Automated collection in areas requiring login (private cafe boards, etc.)
- Large-scale crawling without complying with robots.txt
- Sending excessive requests causing server overload in seconds
Q: Is it necessary to strictly adhere to robots.txt?
robots.txt does not have legally binding regulations. However, there have been court cases in Korea where violations of robots.txt were considered as a criterion for obstruction of business crime. If crawling is for business purposes, it's advisable to comply, and consulting with legal experts is recommended.
Q: The daily limit of 25,000 requests for Naver Shopping API is insufficient.
While registering multiple applications with Naver Developer Center can increase your quota, this may violate Naver's terms of service. If you need large-scale data, a Crawling API service is a practical alternative.
Q: Is there a possibility that Naver will enhance crawling blocking?
Yes. Naver is enhancing security in response to increased traffic from AI agents. CAPTCHA occurrences are increasing, especially in Smart Store and Naver Place. There is a possibility of strengthening to the level of Coupang (Akamai) in the future.
Q: Is crawling Naver Data Lab possible?
Naver Data Lab (datalab.naver.com) provides official APIs. You can fetch data like search trends, shopping insights, etc., through APIs, so it's recommended to use APIs rather than crawling.
Conclusion
Naver crawling requires different approaches for each service. One method does not solve all issues.
| Service | Recommended Method | Cost |
|---|---|---|
| Naver Search | Official API (up to 25,000/day) | Free |
| Naver Shopping | Official API (basic) or Internal API/Crawling API (detailed) | Free to Paid |
| Naver Blog | Direct PostView URL access | Free |
| Smart Store | Crawling API Service (due to CAPTCHA) | $35/month+ |
| Naver Cafe | Official API or Manual Hybrid | Free to Paid |
| Naver Place | Internal API or Crawling API Service | Free to Paid |
Principle: If solvable with the official API, use the API first. If you need data beyond the API limits, resort to crawling. If crawling maintenance is burdensome, consider a Crawling API service.
Naver Crawling, No CAPTCHA Worries
HashScraper MCP supports crawling all Naver services like Naver Shopping, Smart Store, Blog, Place, etc. It handles CAPTCHA automatically, JavaScript rendering, and returns parsed JSON.
Get Started with 100 Free Requests →
Inquiries: help@hashscraper.com
Related Articles
- Coupang Crawling 2026 Complete Guide — Everything About Bypassing Akamai — Reasons and solutions for the difficulty in Coupang crawling
- 27 Reasons Why Crawling Fails — Comprehensive list of all failure types
- Adding Crawling Functionality to AI Agents — How to connect Claude, Cursor to MCP for crawling functionality




.jpg)