디시인사이드のクローリングを初めて始める場合は、基本的な収集方法から確認してください。この記事はすでに基礎を知っている方のための深化ガイドです。ギャラリーごとのキーワード検索収集、リアルタイム投稿モニタリングの自動化、感情分析の活用、そして数十回のリクエストの後に必ず訪れるIPブロックの問題まで — 実務で必ず直面するトピックを順番に取り上げます。
基本的な収集方法に興味がある場合は、まず디시인사이드 게시글 크롤링 봇 사용 가이드を参照してください。
1. ギャラリーごとのキーワード検索クローリング — 欲しいキーワードだけを選んで収集する
디시인사이드にはマイナーギャラリーを含めると数千ものギャラリーが運営されています。ブランド名、製品名、イシューのキーワードを特定のギャラリー内で検索して収集する方法は、全数収集よりもはるかに効率的です。
検索URLの構造を理解する
디시인사이드のギャラリー内検索URLのパターンは次のとおりです。
https://search.dcinside.com/post/p/1/q/{키워드}/gallery/{갤러리ID}
例えば、サムスンギャラリーで「ギャラクシー S25」を検索して結果を収集するには:
import requests
from bs4 import BeautifulSoup
from urllib.parse import quote
import random
import time
def crawl_dcinside_search(keyword, gallery_id, max_pages=5):
results = []
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
for page in range(1, max_pages + 1):
url = f"https://search.dcinside.com/post/p/{page}/q/{quote(keyword)}/gallery/{gallery_id}"
resp = requests.get(url, headers=headers)
if resp.status_code != 200:
break
soup = BeautifulSoup(resp.text, "html.parser")
posts = soup.select(".sch_result_list li")
for post in posts:
title = post.select_one(".tit_txt")
date = post.select_one(".date")
link = post.select_one("a")
if title and date and link:
post_url = link["href"]
post_id = post_url.split("no=")[-1].split("&")[0] if "no=" in post_url else post_url
results.append({
"id": post_id,
"title": title.text.strip(),
"date": date.text.strip(),
"url": post_url
})
time.sleep(random.uniform(1.0, 2.5)) # 랜덤 간격으로 탐지 회피
return results
活用シナリオ
- ブランドモニタリング: 自社ブランド名が言及された投稿を定期的に収集して否定的な意見を早期に検知
- 競合企業の動向把握: 競合他社の製品名をキーワードとして検索し、消費者の反応を追跡
- イシュートラッキング: 特定のイベントや事件に関連する投稿をリアルタイムでモニタリング
2. リアルタイム投稿モニタリングの自動化 — Cron + Pythonで実装する
一度性の収集では、迅速に生成・削除されるコミュニティの投稿を見逃しやすいです。特に디시인사이드では人気の投稿が数時間で数十万回の閲覧を記録し、消える場合もあります。継続的なモニタリングが必要な理由です。
Cronベースの自動収集設定
Linux/macOS環境で30分ごとにクローラを実行するCronの例です。
# crontab -e 로 편집
*/30 * * * * /usr/bin/python3 /home/user/dcinside_monitor.py >> /var/log/dcinside.log 2>&1
重複投稿のフィルタリングロジック
同じ投稿を繰り返し収集しないようにするには、投稿IDをローカルDBやファイルに記録する必要があります。
import json
import os
SEEN_FILE = "seen_posts.json"
def load_seen():
if os.path.exists(SEEN_FILE):
with open(SEEN_FILE) as f:
return set(json.load(f))
return set()
def save_seen(seen_ids):
with open(SEEN_FILE, "w") as f:
json.dump(list(seen_ids), f)
def filter_new_posts(posts, seen_ids):
new_posts = [p for p in posts if p["id"] not in seen_ids]
seen_ids.update(p["id"] for p in new_posts)
return new_posts, seen_ids
通知連携(Slack/Telegram)
新しい投稿を検知した場合、Slackに通知を送ると担当者がリアルタイムで対応できます。
import requests as req
def send_slack_alert(post, webhook_url):
message = f"새 게시글 감지\n제목: {post['title']}\nURL: {post['url']}"
req.post(webhook_url, json={"text": message})
3. 収集データの活用 — 舆論分析・感情分析・トレンド検知
디시인사이드は国内最大級の匿名コミュニティの1つであり、収集したテキストデータは舆論分析やトレンド検知に役立ちます。ブランドの危機対応、新製品の反応把握、政治・社会問題のモニタリングなどの目的で企業や研究機関で活用されています。
Python VADER / KoBERTベースの感情分析
韓国語の感情分析にはKLUE-RoBERTa、KoBERT系列のモデルが広く使われています。簡単な例:
from transformers import pipeline
classifier = pipeline(
"text-classification",
model="beomi/KcELECTRA-base-v2022" # 한국어 범용 감정분석 모델 (용도에 맞게 교체 가능)
)
def analyze_sentiment(texts):
results = []
for text in texts:
result = classifier(text[:512])[0]
results.append({
"text": text[:50],
"label": result["label"],
"score": round(result["score"], 3)
})
return results
関連語分析
収集した投稿のタイトルや本文から頻繁に登場する単語を抽出すると、問題の文脈を把握できます。
from collections import Counter
import re
def extract_top_keywords(texts, top_n=20):
all_words = []
for text in texts:
words = re.findall(r"[가-힣]{2,}", text) # 2글자 이상 한글만
all_words.extend(words)
return Counter(all_words).most_common(top_n)
活用事例(実務)
| 産業グループ | 活用目的 | 収集対象 |
|---|---|---|
| 消費財/EC | 新製品発売反応分析 | 関連ギャラリー + キーワード検索 |
| エンターテイメント | アーティスト舆論モニタリング | エンタメギャラリーリアルタイム収集 |
| 金融/投資 | 銘柄イシュー検知 | 株式・コインギャラリー |
| 公共機関/政治 | 政策反応舆論把握 | 政治ギャラリーキーワード収集 |
4. ディ시インサイドIPブロックと回避戦略
디시인사이드にはクローラー検知システムが適用されています。実務で確認されたブロック閾値は次のとおりです。
- 約240件のリクエスト: 応答遅延または一部コンテンツ制限が報告される
- 約620件のリクエスト: IPレベルのブロックが発生する事例が確認される(4xxまたはリダイレクト無限)
ブロックが発生すると収集が全面中断されるため、最初から以下の戦略を並行して進める必要があります。
主要な回避戦略4つ
① リクエスト間隔の調整(最も基本的)
ランダムな間隔を設定するとボット検知の確率が低くなります。
import random
import time
def random_delay(min_sec=1.0, max_sec=3.0):
time.sleep(random.uniform(min_sec, max_sec))
② User-Agentローテーション
同じUser-Agentを繰り返し使用すると検知が容易になります。
import random
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/119",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/118",
]
def get_random_ua():
return random.choice(USER_AGENTS)
③ プロキシプールの運用
IPブロックを回避する最も確実な方法は、リクエストごとに異なるIPを使用することです。無料プロキシは信頼性が低いため、商用プロキシサービスを推奨します。
import itertools
proxy_pool = [
"http://proxy1:port",
"http://proxy2:port",
"http://proxy3:port",
]
proxy_cycle = itertools.cycle(proxy_pool)
def get_proxy():
p = next(proxy_cycle)
return {"http": p, "https": p}
④ curl_cffiを使用したTLSフィンガープリントの偽装
2026年現在、通常のrequestsライブラリはTLSフィンガープリント検査で検出される可能性があります。curl_cffiを使用すると、実際のブラウザと同じフィンガープリントを模倣できます。
from curl_cffi import requests as cffi_requests
resp = cffi_requests.get(
"https://gall.dcinside.com/board/lists/",
params={"id": "programming"},
impersonate="chrome120"
)
直接構築 vs マネージドサービス
| 項目 | 直接構築 | マネージドサービス |
|---|---|---|
| 初期費用 | 低い | 月額 |
| プロキシインフラ | 直接調達が必要 | 含まれる |
| IPブロック対応 | 直接対応 | 自動処理 |
| メンテナンス | 開発リソースが必要 | 不要 |
| スケールアップ | インフラ追加が必要 | 即時可能 |
数十万件以上の大量収集が必要であり、クローラーの維持に開発リソースを投入することが難しい場合は、マネージドクローリングサービスを検討することが現実的です。Hashscraperはディ시インサイド専用のクローラーを含む500以上のサイトのクローリングをコードなしでダッシュボードから設定し、IPブロックなしで安定的に運用しています。
5. 法的注意事項と倫理的クローリング
ディ시インサイドのクローリングを始める前に、必ず押さえておくべき事項があります。
robots.txtの確認
https://www.dcinside.com/robots.txt
robots.txtに記載されたDisallowパスはクローリングが禁止された領域です。法的拘束力はありませんが、これを無視したクローリングはサービス規約違反や法的紛争の口実となる可能性があります。
個人情報保護法(PIPA)の遵守
ディ시インサイドの投稿にはユーザーのニックネーム、一部のIP、個人識別可能情報が含まれることがあります。収集目的外の使用、第三者提供、商業的転売は個人情報保護法違反に該当する可能性があります。
著作権法
投稿原文は投稿者の著作物です。分析目的の内部利用はほとんど許可されていますが、原文をそのまま外部に公開したり、商業目的で利用することは著作権侵害になる可能性があります。
サーバー負荷の最小化
過剰なリクエスト速度はサービス障害を引き起こす可能性があり、これは情報通信網法上のサービス妨害行為と解釈される余地があります。リクエスト間隔を1秒以上保ち、非営業時間帯(深夜)に大量収集を分散することが推奨されます。
FAQ
Q. ディ시インサイドのクローリングは合法ですか?
A. 公開された投稿データを分析目的で収集すること自体は、最高裁判所の判例上一般的に許容されています。ただし、個人情報が含まれるデータの保存・利用、サービス規約違反、サーバー負荷誘発などは法的問題となり得ます。収集前に法務チームの審査を推奨します。
Q. ブロックなしでどれだけ多くの投稿を収集できますか?
A. 直接構築の場合、単一IP基準で約200〜600件のリクエスト後にブロックが発生することが一般的です。プロキシプールを運用すれば理論的には無制限ですが、プロキシの品質と管理コストがかかります。
Q. リアルタイムモニタリングは何分ごとに設定すべきですか?
A. イシュー対応目的であれば、15〜30分の間隔が現実的です。1分以下の間隔はIPブロックリスクが高く、サーバー負荷を引き起こします。重要度に応じて主要ギャラリーを頻繁に、他は1時間ごとの設定を推奨します。
Q. コメントも収集できますか?
A. 可能です。ディ시インサイドのコメントは別のAPIエンドポイントを通じて応答され、投稿番号(no)をパラメータとしてリクエストするとJSON形式で取得できます。ただし、コメントには個人識別可能情報が含まれる可能性が高いため、注意が必要です。
Q. 感情分析に最も正確なモデルは何ですか?
A. 韓国語コミュニティテキストは新語、略語、逆語表現が多く、汎用モデルの精度が低いことがあります。KLUE-RoBERTa、KoBERTをドメインごとのデータでファインチューニングしたモデルが最も正確であり、GPT-4oなどの大規模言語モデルにプロンプトで分類を要求する方法も急速に活用されています。
Q. 特定のギャラリーの全投稿をアーカイブすることは可能ですか?
A. 技術的には可能ですが、大量収集はIPブロックリスクとサービス規約問題を伴います。全体をアーカイブするよりも、キーワードフィルタリング+期間限定収集方法が現実的です。
Q. コーディングなしでディ시インサイドのデータを収集する方法はありますか?
A. はい、Hashscraperの디시인사이드 갤러리 검색 수집 봇を使用すれば、キーワード、ギャラリー、ソート基準をダッシュボードから設定し、Excelでダウンロードすることができます。IPブロック回避は自動で処理されます。
まとめ
ディ시インサイドのクローリング自動化は単純な収集を超えて 舆論モニタリングとインサイト発掘 のツールとして進化しています。ギャラリーごとのキーワード検索収集で目的に合ったデータだけを選別し、Cronベースの自動化で24時間モニタ




