MediaCrawlerとは?
データ駆動の時代において、ソーシャルメディアプラットフォームには膨大なユーザーインサイト、コンテンツトレンド、世論情報が蓄積されています。しかし、手動でこれらのデータを収集するのは非効率で持続可能ではありません。MediaCrawlerは、この課題を解決するために生まれたオープンソースプロジェクトです。開発者NanmiCoderがメンテナンスする強力なマルチプラットフォーム自媒体データ収集ツールで、GitHubで数万のStarを獲得しており、現在最も包括的な中国語ソーシャルメディアクローラーフレームワークです。
MediaCrawlerの核心的価値は、1つのツールで7大主流プラットフォームをカバーし、各プラットフォームごとに個別にクローラーを開発する必要がないことです。Pythonの非同期アーキテクチャに基づき、Playwrightによるブラウザ自動化でログイン状態を処理し、保持されたCookie環境を通じてプラットフォームAPIを呼び出して署名パラメータを取得します。複雑な暗号化アルゴリズムのリバースエンジニアリングは全く不要で、技術的ハードルを大幅に下げます。
プロジェクトアドレス:github.com/NanmiCoder/MediaCrawler
適用シーン
- 世論分析:各プラットフォームでのブランド評判とユーザーフィードバックを監視
- コンテンツトレンド研究:人気トピック、バズコンテンツの共通特徴を追跡
- 競合分析:競合アカウントの投稿頻度、インタラクションデータを収集
- 学術研究:ソーシャルメディア伝播パターン、ユーザー行動分析
- データ可視化:収集したデータでワードクラウド、トレンドチャートを生成
対応7大プラットフォームと機能マトリクス
MediaCrawlerは現在以下のプラットフォームに対応しており、各プラットフォームの機能カバレッジは高度に統一されています:
| プラットフォーム | コード | キーワード検索 | 指定投稿取得 | 2次コメント | クリエイターページ | ログインキャッシュ | IPプロキシ | ワードクラウド |
|---|---|---|---|---|---|---|---|---|
| 小紅書 | xhs |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Douyin | dy |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Kuaishou | ks |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Bilibili | bili |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
wb |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
| Baidu貼吧 | tieba |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 知乎 | zhihu |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
3つのクロールモード:
- search:キーワードで検索し、関連投稿/動画をクロール
- detail:指定投稿IDまたはURLで、詳細とコメントを正確にクロール
- creator:指定クリエイターページの全コンテンツをクロール
3つのログイン方法:
- qrcode:QRコードスキャンログイン(推奨、最も安全)
- phone:携帯電話番号 + 認証コードログイン
- cookie:既存のCookieを直接入力
技術アーキテクチャ:Python + Playwrightの巧みな設計
MediaCrawlerの技術選定は実用主義の哲学を体現しています。従来のHTTPリクエスト + 署名リバースエンジニアリング路線ではなく、Playwrightによるブラウザ自動化でログイン状態を処理し、保持されたCookie環境を通じてプラットフォームAPIを呼び出します。この設計の核心的優位性は、複雑な暗号化アルゴリズムのリバースエンジニアリングが不要なことです。
コアアーキテクチャ階層
MediaCrawler
├── main.py # プログラムエントリー、クローラーファクトリ
├── config/ # 設定管理(プラットフォーム設定、基本設定)
├── media_platform/ # 7大プラットフォームクローラー実装
│ ├── xhs/ # 小紅書
│ ├── douyin/ # Douyin
│ ├── kuaishou/ # Kuaishou
│ ├── bilibili/ # Bilibili
│ ├── weibo/ # Weibo
│ ├── tieba/ # Baidu貼吧
│ └── zhihu/ # 知乎
├── store/ # データ保存層(CSV/JSON/SQLite/MySQL/MongoDB)
├── proxy/ # IPプロキシプール管理
└── cache/ # ログイン状態キャッシュ管理
ワークフロー
- ログインフェーズ:Playwrightがブラウザを開き、ユーザーがQRコードスキャン/電話番号入力、Cookieを取得
- キャッシュフェーズ:Cookieをローカルに保存(
cache/{platform}_cookies.json) - クロールフェーズ:Cookie環境を再利用し、JS式で署名パラメータを取得、プラットフォームAPIを呼び出し
- 保存フェーズ:収集したデータをCSV/JSON/データベースに書き込み
CDPモード:アンチ検出の切り札
MediaCrawlerはデフォルトでCDP(Chrome DevTools Protocol)モードを有効にし、ユーザーの既存Chromeブラウザに接続します。Playwrightのヘッドレスブラウザと比較して、CDPモードの優位性は:
- 本物のブラウザフィンガープリント:ユーザーが実際にインストールしているChromeを使用、全拡張機能、プラグイン、設定を含む
- より低い検出リスク:ブラウザ行動パターンが実ユーザーにより近い
- ログイン状態の継承:既存のCookieと閲覧履歴を自動再利用
有効化方法(config/base_config.py):
ENABLE_CDP_MODE = True # CDPモード有効化
CDP_CONNECT_EXISTING = True # 既存ブラウザに接続(推奨)
CDP_DEBUG_PORT = 9222 # デバッグポート
使用前にChromeアドレスバーに chrome://inspect/#remote-debugging を入力し、「Allow remote debugging for this browser instance」にチェックを入れる必要があります。
インストールとクイックスタート
環境要件
- Python 3.11+
- Node.js 16+(Douyinと知乎に必要)
- Chromeブラウザ(最新版推奨)
方法1:uvインストール(推奨)
uv は現在最速のPythonパッケージ管理ツールで、依存関係解決が正確で推奨されます。
# 1. プロジェクトをクローン
git clone https://github.com/NanmiCoder/MediaCrawler.git
cd MediaCrawler
# 2. 依存関係をインストール(仮想環境を自動作成)
uv sync
# 3. クローラーを実行(小紅書を例に)
uv run main.py --platform xhs --lt qrcode --type search
方法2:従来のvenvインストール
# 1. 仮想環境を作成
python -m venv venv
source venv/bin/activate # Linux/macOS
# venv\Scripts\activate # Windows
# 2. 依存関係をインストール
pip install -r requirements.txt
# 3. Playwrightブラウザドライバをインストール(非CDPモードに必要)
playwright install
# 4. クローラーを実行
python main.py --platform xhs --lt qrcode --type search
設定ファイルの説明
コア設定は config/base_config.py にあり、よく使うパラメータ:
# プラットフォーム選択:xhs | dy | ks | bili | wb | tieba | zhihu
PLATFORM = "xhs"
# キーワード検索(英文カンマ区切り)
KEYWORDS = "AIプログラミング,Pythonチュートリアル"
# ログイン方法:qrcode | phone | cookie
LOGIN_TYPE = "qrcode"
# クロールモード:search | detail | creator
CRAWLER_TYPE = "search"
# IPプロキシ有効化
ENABLE_IP_PROXY = False
# コメントクロール有効化
ENABLE_GET_COMMENTS = True
# 2次コメント有効化
ENABLE_GET_SUB_COMMENTS = False
# データ保存形式:csv | json | jsonl | sqlite | mysql | mongodb | excel
SAVE_DATA_OPTION = "jsonl"
# 単一プラットフォーム最大クロール数
CRAWLER_MAX_NOTES_COUNT = 15
# 同時実行数
MAX_CONCURRENCY_NUM = 1
# クロール間隔(秒)
CRAWLER_MAX_SLEEP_SEC = 2
プラットフォーム固有の設定は各プラットフォーム専用ファイルにあります。例:config/xhs_config.py、config/dy_config.py など。
各プラットフォーム収集実践
MediaCrawlerのコマンドラインインターフェースは統一されており簡潔です。コアパラメータは3つだけ:--platform(プラットフォーム)、--lt(ログイン方法)、--type(クロールモード)。以下、小紅書を例に完全な収集フローを示します。
小紅書収集
1. キーワード検索モード
# config/base_config.py を修正
PLATFORM = "xhs"
KEYWORDS = "AIアート,Stable Diffusion"
CRAWLER_TYPE = "search"
ENABLE_GET_COMMENTS = True # コメント収集有効化
# 実行
uv run main.py --platform xhs --lt qrcode --type search
初回実行時にブラウザが立ち上がり、スマホの小紅書でQRコードスキャンしてログインします。ログイン成功後Cookieは自動キャッシュされ、次回実行時に再スキャンは不要です。
2. 指定投稿詳細モード
config/xhs_config.py で対象投稿URLを設定:
XHS_SPECIFIED_NOTE_URL_LIST = [
"https://www.xiaohongshu.com/explore/xxxxx?xsec_token=xxx",
# 複数追加可能
]
そして実行:
uv run main.py --platform xhs --lt qrcode --type detail
3. クリエイターページモード
config/xhs_config.py でクリエイターページURLを設定:
XHS_CREATOR_ID_LIST = [
"https://www.xiaohongshu.com/user/profile/xxxxx?xsec_token=xxx",
]
実行:
uv run main.py --platform xhs --lt qrcode --type creator
Douyin収集
DouyinはNode.js環境が必要です(JS署名用)。config/dy_config.py を設定:
# キーワード検索
KEYWORDS = "Pythonチュートリアル,プログラミング入門"
# 指定動画URL
DOUYIN_SPECIFIED_NOTE_URL_LIST = [
"https://www.douyin.com/video/xxxxx",
]
コマンド実行:
uv run main.py --platform dy --lt qrcode --type search
Douyinのログインフローは小紅書と同様、QRコードスキャン後Cookieがローカルにキャッシュされます。
Bilibili収集
Bilibiliは動画系プラットフォームの典型例です。config/bilibili_config.py を設定:
# 検索キーワード
KEYWORDS = "OSSプロジェクト,GitHub"
# 指定動画BV番号
BILIBILI_SPECIFIED_NOTE_URL_LIST = [
"https://www.bilibili.com/video/BVxxxxxx",
]
# UP主ページ
BILIBILI_CREATOR_ID_LIST = [
"https://space.bilibili.com/xxxxx",
]
実行:
uv run main.py --platform bili --lt qrcode --type search
Bilibiliのデータ構造は比較的標準的で、収集成功率が高いです。
Weibo、Kuaishou、貼吧、知乎
他のプラットフォームの設定方法も同様で、config/ 下の対応する設定ファイルを変更するだけです:
# Weibo
uv run main.py --platform wb --lt qrcode --type search
# Kuaishou
uv run main.py --platform ks --lt qrcode --type search
# Baidu貼吧
uv run main.py --platform tieba --lt qrcode --type search
# 知乎
uv run main.py --platform zhihu --lt qrcode --type search
知乎とKuaishouもNode.js環境が必要です。
WebUI可視化インターフェース
コマンドラインを使いたくない場合、MediaCrawlerはWebUIを提供しています:
# ターミナル1:バックエンド起動
uv run uvicorn api.main:app --port 8080 --reload
# ターミナル2:フロントエンド起動
cd webui
npm install
npm run dev
http://localhost:5173/ にアクセスすると、ブラウザでパラメータ設定、ログ確認、データプレビューが可能です。
データ保存とエクスポート
MediaCrawlerは7種類のデータ保存形式に対応し、SAVE_DATA_OPTION で設定します:
CSV / JSON / JSONL
最もシンプルなファイル保存方式で、データは data/{platform}/ ディレクトリに保存されます。
SAVE_DATA_OPTION = "csv" # または "json" / "jsonl"
CSVはExcelで開いて確認するのに適し、JSON/JSONLはプログラム処理に適しています。
SQLite
軽量データベースで、追加インストール不要、単一マシンでの使用に適しています。
SAVE_DATA_OPTION = "sqlite"
初回実行時にデータベースとテーブル構造が自動作成され、重複排除をサポートします。
MySQL / PostgreSQL
本番環境推奨で、大規模データ保存とクエリをサポートします。
SAVE_DATA_OPTION = "mysql" # または "postgres"
.env ファイルでデータベース接続を設定する必要があります:
MYSQL_DB_HOST=localhost
MYSQL_DB_PORT=3306
MYSQL_DB_USER=root
MYSQL_DB_PWD=your_password
MYSQL_DB_NAME=media_crawler
MongoDB
ドキュメント型データベースで、構造が固定されていないデータの保存に適しています。
SAVE_DATA_OPTION = "mongodb"
.env を設定:
MONGODB_HOST=localhost
MONGODB_PORT=27017
MONGODB_DB_NAME=media_crawler
Excel
直接 .xlsx ファイルを出力し、非技術者が簡単に確認できます。
SAVE_DATA_OPTION = "excel"
データフィールド説明
小紅書を例にすると、収集されるデータには以下が含まれます:
- 投稿情報:タイトル、内容、いいね数、お気に入り数、コメント数、投稿時間、タグ
- コメント情報:コメント内容、ユーザーニックネーム、いいね数、返信数、時間
- クリエイター情報:ニックネーム、フォロワー数、獲得いいね数、作品数
全フィールドはJSON形式で保存され、後続分析に便利です。
高度な使い方
定期収集と増分更新
MediaCrawler自体にはスケジューリング機能はありませんが、cronやAPSchedulerと組み合わせることができます:
# Linux crontab 例:毎日午前10時に収集
0 10 * * * cd /path/to/MediaCrawler && uv run main.py --platform xhs --lt cookie --type search
増分更新の鍵はデータベースの重複排除機能を利用することです。SQLiteやMySQLで保存する場合、MediaCrawlerは既存レコードを自動スキップします(投稿IDベース)。同じ設定で定期的に実行するだけで、新規コンテンツのみ収集できます。
IPプロキシプール設定
大規模収集時には、プラットフォームのリスク管理を回避するためIPプロキシの有効化を推奨します:
# config/base_config.py
ENABLE_IP_PROXY = True
IP_PROXY_POOL_COUNT = 2 # プロキシプール数
IP_PROXY_PROVIDER_NAME = "kuaidaili" # kuaidaili | wandouhttp | static をサポート
.env ファイルでプロキシサービスのキーを設定:
# 快代理設定
KDL_SECERT_ID=your_secret_id
KDL_SIGNATURE=your_signature
KDL_USER_NAME=your_username
KDL_USER_PWD=your_password
静的プロキシも使用可能:
IP_PROXY_PROVIDER_NAME = "static"
STATIC_PROXY_URL = "http://user:password@proxy.example.com:8080"
同時実行制御とリクエスト間隔
# 同時実行数(1-3推奨、高すぎるとリスク管理トリガーになりやすい)
MAX_CONCURRENCY_NUM = 1
# リクエスト間隔(秒、1-2秒のランダム)
CRAWLER_MAX_SLEEP_SEC = 2
# 単一プラットフォーム最大収集数
CRAWLER_MAX_NOTES_COUNT = 15
小規模からテスト開始し、徐々に収集量を増やすことを推奨します。過度な同時実行と高頻度はアカウント制限やIPブロックの原因になります。
コメントワードクラウド生成
MediaCrawlerには収集したコメントデータに基づくワードクラウド生成機能が組み込まれています:
# config/base_config.py
ENABLE_GET_WORDCLOUD = True
# カスタム単語(オプション)
CUSTOM_WORDS = {
"AIアート": "技術",
"Stable Diffusion": "ツール",
}
# ストップワードファイル
STOP_WORDS_FILE = "./docs/hit_stopwords.txt"
実行後、data/ ディレクトリにワードクラウド画像(PNG形式)が生成され、コメントのホットスポットを直感的に表示します。
コンプライアンスと法的リスク
重要なお知らせ:クローラー技術の使用は法律とプラットフォームの利用規約を遵守する必要があります。
法的境界線
「中華人民共和国ネットワーク安全法」「データ安全法」「個人情報保護法」および クローラー違法違法案件集 によると、以下の行為は違法となる可能性があります:
- 許可なく個人情報を収集:ユーザープライバシーデータ(電話番号、身分証、住所など)
- 技術的保護措置を回避:認証コードを突破、身元を偽装してリスク管理を回避
- 大規模収集と商業化:収集データを商業目的に使用
- プラットフォームの正常な運営を妨害:高頻度リクエストによるサーバー負荷過大
コンプライアンス推奨
- 公開データのみ収集:特別な権限が必要なコンテンツは収集しない
- 収集頻度を制御:適切なリクエスト間隔を設定し、プラットフォームに負荷をかけない
- 商業目的に使用しない:MediaCrawlerはNON-COMMERCIAL LEARNING LICENSEを採用、商業使用禁止
- robots.txtを遵守:プラットフォームのクローラープロトコルを尊重
- ユーザープライバシーを保護:収集したユーザー個人情報を公開しない
免責事項
MediaCrawlerプロジェクトは学習と研究目的のみ提供されています。使用者は本ツールの使用により生じるすべての法的責任を負うものとします。作者はいかなる違法行為にも責任を負いません。
他のツールとの比較
| ツール | 対応プラットフォーム | 技術スタック | アンチ検出能力 | 学習曲線 | 適用シーン |
|---|---|---|---|---|---|
| MediaCrawler | 7大中国語プラットフォーム | Python + Playwright | CDPモード、強 | 中程度 | 中国語ソーシャルメディアデータ収集 |
| Snscrape | Twitter/Instagram等 | Python | 弱、ブロックされやすい | 低い | 海外プラットフォーム軽量収集 |
| Tweepy | Twitter専用 | Python | 公式API依存 | 低い | Twitter公式API開発 |
| Scrapy | 汎用 | Python + Twisted | 独自実装必要 | 高い | 大規模カスタムクローラー |
| Selenium | 汎用 | Python + WebDriver | 中程度 | 中程度 | インタラクティブなWeb自動化 |
| Playwright | 汎用 | Python/Node | 強 | 中程度 | モダンWeb自動化 |
MediaCrawlerの優位性
- オールインワンカバレッジ:1つのツールで7大中国語プラットフォーム対応、各プラットフォームごとの開発不要
- リバースエンジニアリング不要:Playwright + CDPモードベース、複雑な署名アルゴリズムを回避
- すぐに使える:設定ファイルが明確、コマンドラインパラメータが簡潔
- アクティブなコミュニティ:GitHub Star数継続的に増加、問題対応が迅速
他のツールを選ぶべき時
- Snscrape/Tweepy:Twitter/Instagram等の海外プラットフォームを収集する必要がある
- Scrapy:大規模で高同時実行のカスタムクローラーを構築する必要がある
- Selenium/Playwright:専用ソーシャルメディア収集ではなく、汎用Web自動化機能が必要
よくある質問 FAQ
1. MediaCrawlerでのデータ収集は合法ですか?
MediaCrawler自体は合法な学習ツールですが、使用方法が合法性を決定します。公開データのみ収集し、頻度を制御し、商業目的に使用せず、プラットフォームの利用規約を遵守すれば、通常法的問題はありません。しかし、個人情報収集、技術的保護回避、大規模商業利用は「データ安全法」「個人情報保護法」に抵触する可能性があります。法的境界線については クローラー違法違法案件集 を参照することをお勧めします。
2. QRコードスキャンログインが失敗したり、頻繁に再スキャンを求められたりする理由は?
よくある原因: - Cookie期限切れ:プラットフォームは定期的にログイン状態をクリアします。再スキャンで解決 - リスク管理トリガー:頻繁な収集や異常行動によりアカウント制限。収集頻度を下げることを推奨 - ネットワーク問題:プロキシIPが不安定またはプラットフォームにマークされた。IP切り替えまたはプロキシ無効化を試す - ブラウザバージョンが低い:CDPモードはChrome 144+が必要。ブラウザを更新
3. 収集成功率を上げるには?
- CDPモード有効化:本物のブラウザ環境を使用し、検出リスクを低減
- 収集頻度制御:
CRAWLER_MAX_SLEEP_SEC = 2-5を設定し、高頻度リクエストを回避 - IPプロキシ使用:大規模収集時にプロキシプールを有効化、リクエストソースを分散
- 1アカウント1IP:複数アカウントで同一IP共有を避け、関連リスク管理トリガーを防止
- 時間帯をずらす:プラットフォームのピーク時間(夜8-10時等)を避ける
4. 収集したデータを商業分析に使用できますか?
できません。MediaCrawlerはNON-COMMERCIAL LEARNING LICENSE 1.1を採用しており、商業利用を明確に禁止しています。商業利用が必要な場合: - プラットフォーム公式に連絡しデータサービスを購入 - プラットフォームが提供する公式APIを使用(Weiboオープンプラットフォーム、Bilibiliオープンプラットフォーム等) - 法律専門家に相談し、データ収集と使用が法規に適合することを確認
5. Windows/Mac/Linuxに対応していますか?
完全対応。MediaCrawlerはPythonベースでクロスプラットフォーム互換です。Windowsユーザーの注意:
- パス区切り文字はバックスラッシュ \
- 仮想環境有効化コマンド:venv\Scripts\activate
- Chromeパス例:C:\Program Files\Google\Chrome\Application\chrome.exe
Mac/Linuxユーザー:
- 仮想環境有効化コマンド:source venv/bin/activate
- Chromeパス例:/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
まとめ
MediaCrawlerは現在最も包括的な中国語ソーシャルメディアクローラーフレームワークで、1つのツールで小紅書、Douyin、Kuaishou、Bilibili、Weibo、貼吧、知乎の7大プラットフォームをカバーします。その核心的価値は:
- 技術的ハードル低下:Playwright + CDPモードベース、複雑な暗号化アルゴリズムのリバースエンジニアリング不要
- オールインワン収集:統一されたコマンドラインインターフェース、簡単な設定、すぐに使える
- 柔軟な保存:CSV/JSON/SQLite/MySQL/MongoDB/Excel 7形式対応
- アンチ検出能力:CDPモード + IPプロキシプール、ブロックリスクを低減
しかし、清醒に認識すべき点もあります:
- 法的リスク:法律法規を遵守し、学習と研究のみに使用
- プラットフォームリスク管理:収集頻度が高すぎると制限またはブロックされる
- 非商業用途:LICENSEが商業化使用を明確に禁止
データアナリスト、研究者、開発者で、学習、研究、個人プロジェクトのために中国語ソーシャルメディアデータを収集する必要がある場合、MediaCrawlerは最も試す価値のあるツールです。ただし、常にコンプライアンス使用、プラットフォームルール尊重、ユーザープライバシー保護を心がけてください。
プロジェクトアドレス:github.com/NanmiCoder/MediaCrawler
この記事が役に立ったら、プロジェクトにStarを付けて作者をサポートしてください!
関連記事: