네이버는 단일 사이트가 아닙니다. 서비스마다 차단 수준이 다릅니다.
읽는 시간: 14분 | 2026년 1월 기준
핵심 요약
네이버は韓国の検索市場で約55%のシェアを持つ最大のポータルです。ネイバーショッピング、ブログ、カフェ、スマートストアなど、クローリングしたいサービスは非常に多岐にわたります。
問題は、各サービスごとにブロック方法と難易度がまったく異なるということです。ブログは比較的簡単ですが、スマートストアではCAPTCHAが表示されることもあります。"ネイバークローリング"という1つの問題ではなく、サービスの数だけ異なる問題があります。
この記事で取り上げる内容:
- ネイバーサービスごとのクローリング難易度(簡単なものから難しいものまで)
- 各サービスのブロック方法(なぜブロックされるのか、技術的に)
- 実際に動作する解決法(サービスごとのカスタムコード例)
- ネイバーAPI vs クローリング(いつどちらを使うべきか)
目次
- ネイバーサービスごとのクローリング難易度
- ネイバーのボットブロック技術
- ネイバーショッピングのクローリング
- ネイバーブログのクローリング
- スマートストアのクローリング
- ネイバーカフェのクローリング
- ネイバープレイスのクローリング
- ネイバー公式API総まとめ
- クローリングAPIサービスで一括解決
- よくある質問
1. ネイバーサービスごとのクローリング難易度
ネイバーは1つのドメインの下に数十のサービスを持っています。クローリングの難易度は千差万別です。
| サービス | ドメイン | 難易度 | 主なブロック方法 | requests可能 |
|---|---|---|---|---|
| ネイバー検索 | search.naver.com | レート制限 | △(一部) | |
| ネイバーブログ | blog.naver.com | iframe構造 | (回避可能) | |
| ネイバーニュース | news.naver.com | レート制限 | ||
| ネイバーショッピング | shopping.naver.com | JavaScriptレンダリング、内部API | △(API解析必要) | |
| ネイバープレイス | m.place.naver.com | JavaScript + 内部API | △(API解析必要) | |
| ネイバーカフェ | cafe.naver.com | ログイン必要、権限チェック | (ほとんど) | |
| スマートストア | smartstore.naver.com | CAPTCHA、JavaScriptチャレンジ | ||
| ネイバーペイ | pay.naver.com | ログイン + セキュリティトークン |
主要パターン: お金と直接関係のあるサービス(スマートストア、ペイ)ほどセキュリティが強化されています。
2. ネイバーのボットブロック技術
CoupangがAkamaiを使用しているのとは異なり、ネイバーは独自に開発したボットブロックシステムを運用しています。外部ソリューションと比較して更新サイクルが不規則であり、ある月は緩く、ある月は急に強化されます。
ネイバーの防御システム
요청 수신
│
├─ Layer 1: robots.txt
│ └─ Googlebot 등 주요 크롤러 외 대부분 차단
│ └─ 실제 강제력은 없으나, 위반 시 법적 분쟁 불리
│
├─ Layer 2: Rate Limiting
│ └─ IP당 분당 요청 수 제한
│ └─ 초과 시 일시 차단 (보통 5~30분)
│
├─ Layer 3: JavaScript 렌더링 의존
│ └─ 핵심 데이터를 JS로 동적 로드 (쇼핑, 플레이스)
│ └─ SSR(서버 사이드 렌더링) 미적용 페이지가 많음
│
├─ Layer 4: 캡챠 (스마트스토어 중심)
│ └─ 의심스러운 접근에 네이버 자체 캡챠 표시
│ └─ 최근 발생 빈도 증가 추세
│
└─ Layer 5: 로그인/권한 체크 (카페)
└─ 회원 등급별 접근 제한
└─ 비회원에게 본문 차단
Coupang vs ネイバー: ブロックレベル比較
| 基準 | Coupang | ネイバー |
|---|---|---|
| ボットブロックソリューション | Akamai Bot Manager(外部) | 独自開発 |
| TLSフィンガープリントチェック | (JA3/JA4ハッシュ) | (ほとんど) |
| JavaScriptチャレンジ | (全面適用) | △(サービスごとに異なる) |
| センサーデータ収集 | (_abckクッキー) | |
| CAPTCHA | あり | スマートストアで断続的 |
| requestsでアクセス | 100%ブロック | サービスによって可能 |
| 全体的な難易度 | (平均) |
結論: ネイバーは全体的にCoupangよりも簡単ですが、サービスによって難易度が大きく異なります。ブログクローリングとスマートストアクローリングはまったく異なる問題です。
3. ネイバーショッピングのクローリング
構造理解
ネイバーショッピングはSPA(Single Page Application)で設計されています。ブラウザで表示される商品リストはページロード後にJavaScriptが内部APIを呼び出して取得します。
브라우저가 shopping.naver.com 접속
→ 빈 HTML 프레임 로드
→ JavaScript 실행
→ 내부 API 호출 (shopping.naver.com/api/...)
→ JSON 응답 수신
→ 상품 카드 렌더링
したがって、HTMLのみをrequestsで取得しても商品データはありません。2つの方法があります。
方法1: 内部APIを直接呼び出す(最も速く効率的)
ブラウザの開発者ツール(F12 → Networkタブ)でネイバーショッピングが呼び出しているAPIを確認し、同じように呼び出します。
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']}건 리뷰)")
利点: ブラウザのレンダリング不要、高速、JSON直接受信
注意事項:
- 内部APIのエンドポイント/パラメータはネイバーが予告なしに変更可能
- Refererヘッダーがないと403が返される
- 過剰なリクエスト時にIP一時ブロック(リクエスト間1〜3秒の遅延を推奨)
- 実際のAPIパスは開発者ツールで最新を確認する必要がある
方法2: Playwrightでブラウザレンダリング
内部APIの解析が難しい場合や、複雑なフィルター/ソートが必要な場合:
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()
参考: ネイバーショッピングはヘッドレスブラウザに対するブロックがCoupang(Akamai)ほど強力ではないため、通常Playwrightのヘッドレスモードでもうまく動作することが多いです。ただし、大量のリクエストを送信するとIPブロックが発生する可能性があります。
方法3: ネイバーショッピング検索API(公式)
ネイバー開発者センターで無料提供されている公式API:
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']}")
公式APIの制限:
- 1日25,000リクエスト制限
- startパラメータ最大1,000 → 1,000件を超える取得不可
- 詳細仕様、全レビュー、販売者情報なし
- カテゴリごとの全商品リスト取得不可
- リアルタイムの在庫/配送情報なし
→ 簡単な価格比較やキーワードトレンドには十分ですが、本格的なデータ分析には不十分です。
4. ネイバーブログのクローリング
構造的特異点: iframe
ネイバーブログは2003年から運営されているレガシーサービスで、iframeベースの構造を維持しています。
blog.naver.com/username/포스트번호
└─ 외부 프레임 (헤더, 프로필, 카테고리)
└─ 내부 iframe (실제 글 내용)
└─ PostView.naver?blogId=xxx&logNo=yyy
blog.naver.com/username/12345をrequestsで取得すると、外部フレームのHTMLのみが取得され、実際の記事内容は含まれていません。iframe内のURLを直接呼び出す必要があります。
解決法: 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}")
大量収集からのブログ検索結果
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 방지
注意事項
- 非公開/友達公開記事: ログインクッキーなしでアクセス不可
- レート制限: 1分間に60〜100件以上の場合、一時的にブロック(1〜2秒の遅延を推奨)
- 画像URL: ネイバーCDN(postfiles.pstatic.net)はRefererチェック → 画像を直接ダウンロードする場合は
Referer: https://blog.naver.comヘッダーが必要 - エディタバージョン: スマートエディタONE(
.se-main-container)と旧エディタ(#postViewArea)のHTML構造が異なるため、両方を処理する必要があります
5. スマートストアのクローリング
なぜネイバーで最も難しいか
スマートストアはネイバーのeコマースプラットフォームであり、売上と直接関連しているため、セキュリティが強化されています。
- 完全なSPA: 商品情報全体がJavaScriptでレンダリングされ、HTMLにデータがありません
- CAPTCHA発生: 短時間に多数のページにアクセスするとネイバー独自のCAPTCHAが表示される
- 動的URL:
smartstore.naver.com/{store_name}/products/{product_id}形式 - API変更頻度: 内部API構造が頻繁に変更される
スマートストア内部API
スマートストアも内部的にREST APIを呼び出しています。開発者ツールで確認できます:
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 반환
現実的なアプローチ
| 規模 | 推奨方法 | 成功率 | 費用 |
|---|---|---|---|
| 少量(数十件) | Playwright + 5〜10秒の遅延 | 70〜90% | 無料 |
| 中量(数百件) | クローリングAPIサービス | 95%以上 | $35/月〜 |
| 大量(数千件以上) | 専門のクローリングサービス | 99%以上 | $99/月〜 |
# 소량 수집: 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()
重要: スマートストアのCSSクラス名は難読化(ハッシュ)されているため、展開ごとに変更されます。
data-testidやaria-labelなどの安定したセレクタを優先して使用してください。
6. ネイバーカフェのクローリング
主要問題: ログイン + 権限
ネイバーカフェのほとんどの投稿は会員限定です。人気のあるカフェほどグレード制限が厳しいです。
접근 권한 구조:
비회원 → 글 목록만 보임, 본문은 "카페 가입 후 이용" 메시지
가입 회원 → 일부 게시판만 접근 가능
등급 회원 → 전체 접근 가능 (활동 실적 필요)
ログイン自動化のリスク
ネイバーログインの自動化は技術的に可能ですが、いくつかの問題があります:
- キーボードセキュリティモジュール: naver.comログイン時に入力値を動的に暗号化
- 新デバイス認証: 初めての環境でログインすると2段階認証が要求される
- 異常行動検知: ログイン後に異常なパターンを検知するとアカウントが一時停止される
- 利用規約違反: 自動化されたログインはネイバー利用規約違反
→ アカウント永久停止のリスクがあるため、お勧めしません。
合法的な代替
| 方法 | 説明 | 制限 |
|---|---|---|
| ネイバーカフェAPI | カフェ管理者がAPIアクセスを承認 | 管理者の協力が必要 |
| 手動ログイン + 自動収集 | ブラウザで手動ログイン後、クッキーを使用した自動収集 | セッション有効期限切れ時に再ログインが必要 |
| RSSフィード | 一部のカフェ掲示板はRSSを提供 | 最新の投稿に制限あり、本文の一部のみ |
| クローリングAPIサービス | カフェクローリングをサポートするサービスを利用 | 有料 |
7. ネイバープレイスのクローリング
ネイバープレイス(地図)は店舗情報、レビュー、来訪




.jpg?locale=ja)