⚡ 本記事で実現できること
毎日自動で実行され、人の介入を必要としない、セット制の TikTok バズり発見システム。
✅ TikTok 特定ジャンル内容の自動スクレイピング(Bright Data API)
✅ ブレイクスルー(急上昇)コンテンツの自動フィルタリング
✅ AI による内容分析の自動生成(DeepSeek)
✅ Google スプレッドシートへの自動同期、チーム内でのリアルタイム閲覧
ユーザー: 美容/ファッションブランドの運用担当者、MCN コンテンツチーム、ソーシャルメディア・データアナリスト
技術的なハードル: Python コードをコピー&ペーストできれば OK
必要なツール: Bright Data(下記リンクからの登録で $2 プレゼント)+ DeepSeek API + Google Cloud
無料登録・試用はこちら。カスタマーサポートへ連絡すれば試用期間の延長も可能。割引コード「API30」でさらに 30% OFF
https://get.brightdata.com/hwj7ya
前書き
「スピード」と「トレンド」がすべてを支配する TikTok という戦場において、一歩遅れることは数百万のトラフィックを逃すことを意味します。競合他社がまだ手動でレコメンドページ(For You Page)を閲覧している間に、賢明なマーケティングチームはデータ駆動型の戦略を通じて、次にウイルス拡散する題材を事前に特定しています。
競合よりも先に効果的なコンテンツを見つける鍵は、自動で実行できるスクレイピングと分析のシステムを構築することです。本記事では、Bright Data の TikTok スクレイパーに基づき、自動スクレイピング → 統計フィルタリング → AI 洞察 → Google スプレッドシート書き込みの全フローを実現する方法を実演します。
なぜ手動モニタリングはすでに通用しないのか?
TikTok には数十億ものユーザー生成コンテンツが存在します。人力に頼ってクリエイターのプロフィールをフィルタリングし、投稿のメタデータを記録し、エンゲージメント量(いいね、コメント、シェア)を統計し、ハッシュタグを分析することは、効率が低いだけでなく、萌芽段階にある「ブレイクスルー・コンテンツ」を非常にお漏らししやすいです。
アルゴリズムに真に打ち勝つには、以下のコア・データ次元を収集する必要があります:
クリエイター・プロフィール: フォロワーの成長軌跡、オーディエンスの属性、過去のバズり法則。
投稿メタデータ: 投稿時間、動画の長さ、BGM、使用エフェクト。
リアルタイム・エンゲージメント: 総数だけでなく、エンゲージメント速度(1時間あたりの増加量)。
ハッシュタグ・エコシステム: 人気タグとロングテールタグの組み合わせ戦略。
投稿頻度: 競合他社がどの時間帯に、どの程度の頻度で投稿した際に最高の効果が得られているか?
これら 5 つのコア・データ次元における手動モニタリングの課題に対し、Bright Data の TikTok 投稿スクレイパーは一対一の解決策を提供します:
クリエイター資料 → フォロワー成長軌跡を含む、全フィールド対応の Profile API。
投稿メタデータ → 構造化された出力。BGM やエフェクトなどの深いフィールドを完全にカバー。
リアルタイム・エンゲージメント → ポーリング(定期取得)に対応し、エンゲージメント速度曲線を構築可能。
ハッシュタグ・エコシステム → hashtags フィールドが構造化されており、ロングテールタグの分析に対応。
投稿頻度 → Profile Posts API により、クリエイターの投稿法則を再現。
手動でデータを整理したくないですか? →
Bright Data の自動化プランを試す、無料試用はこちら →
https://get.brightdata.com/hwj7ya
解決策:Bright Data TikTok 投稿スクレイパーの構造化における優位性
TikTok の複雑なアンチスクレイピング・メカニズムと動的に変化するフロントエンド・コードに対し、汎用的なスクレイピング・ツールでは安定したデータ出力を維持することが困難です。これこそが Bright Data が際立っている理由です。大量のメンテナンスコストがかかる自作スクリプトとは異なり、Bright Data の TikTok Web Scraper API(キーワードによるリアルタイム・スクレイピング実行)は、一貫性のある構造化されたデータを提供します。もしリアルタイムなデータが必要ない場合は、Bright Data TikTok Dataset(コード不要、既製の構造化データ)を直接購入することもできます。
主流の TikTok スクレイピング・ツールの主な欠点
オープンソースのスクレイピング・スクリプト: 専門的なプログラミング能力が必要で、適応のハードルが高い。TikTok プラットフォームのアンチスクレイピング・メカニズムは厳格で、IP の凍結、キャプチャ(認証)によるブロック、データ収集の中断が発生しやすい。出力データはバラバラな生データで標準化されておらず、その後のクレンジングや整理に膨大な時間がかかり、迅速な分析や先制した意思決定のニーズを満たせない。また、コンプライアンスの保証がなく、プラットフォームのルールを侵害するリスクがある。
小規模なサードパーティ製ツール: 機能が単一で、基礎的なデータの一部しか収集できず、クリエイター、投稿、エンゲージメント、タグの全次元をカバーできない。データの出力形式が乱雑で、フィールドの欠落が激しく、一貫性が極めて悪いため、一括での比較分析が困難。安定性が不足しており、大規模な収集時に動作が重くなったり、データの取りこぼしが発生したりするため、常態的な市場調査を支えられない。一部のツールにはデータ漏洩のリスクがあり、安全性が保証されない。
汎用型データ収集プラットフォーム: TikTok に特化したカスタマイズ能力が弱く、プラットフォームのページ構造を正確に捉えられないため、データ収集の精度が低い。構造化データを出力できるものの、カスタマイズのプロセスが煩雑で、フィールドを手動で設定する必要があり、時間と手間がかかる。料金体系が柔軟ではなく、基礎プランでは高頻度なスクレイピングのニーズを満たせず、アップグレード・プランはコストが高い。アフターサービスや技術サポートが脆弱で、アンチスクレイピングによるブロックやデータ異常の問題に直面した際、迅速に解決できない。
| 特性 | 汎用/自作スクレイパー | Bright Data TikTok スクレイパー |
|---|---|---|
| データの安定性 | 低、サイト更新で即失効 | 高、専門チームがリアルタイムで維持・適応 |
| 出力フォーマット | 乱雑、大量のクレンジングが必要 | JSON/CSV 標準化、即利用可能 |
| アンチスクレイピング対策 | ブロックされやすく、IP 管理が複雑 | プロキシネットワーク内蔵、キャプチャ等を自動処理 |
| フィールドの完全性 | 重要なメタデータが欠落しがち | 全フィールドをカバー(隠れた深いエンゲージメント指標含む) |
| コンプライアンス | リスク管理が困難 | GDPR/CCPA に準拠、企業レベルのコンプライアンス保証 |
Bright Data のコア・バリューは、非構造化されたソーシャルメディアのノイズを、分析のためにデータベースへ直接インポートできるクリーンな資産へと変換することにあります。IP ロックや HTML 構造の変更を心配する必要はなく、データに隠されたビジネス・インサイトにのみ集中できます。
コード実戦:TikTok Dupes(ジェネリック版)バズり洞察自動化ケース
今回の実戦コードは、「Bright Data API による収集実行 → 結果ダウンロード → データクレンジング → ブレイクスルー・コンテンツの選別 → AI インテリジェント分析 → Google スプレッドシートへの書き出し」という全自動クローズドループを構築します。全プロセスで頻繁な人的介入は不要であり、毎日の常態的なデータ研究ニーズに適応します。コア・ロジックは、Bright Data API を利用してコンプライアンスに準拠した効率的な TikTok データのスクレイピングを完了し、Python を通じてデータのクレンジングとバズり動画の選別を行い、大規模言語モデル AI を組み合わせてコンテンツの法則を抽出、最終的に Google スプレッドシートへ同期してデータの共有と振り返りを実現することです。これにより「競合より先に効果的なコンテンツを発見する」というコア目標を完璧に達成し、自動化、正確性、実用性を兼ね備えています。
コードの核心価値: 手動スクレイピングの効率の低さ、データの乱雑さ、分析の遅れといった痛みを解決し、データ収集から意思決定の出力までを全プロセス自動化。データ処理サイクルを短縮し、運用者が潜在的なバズりコンテンツを素早く捉えてトラフィックの先機を掴むのを助けると同時に、美容系の #dupe alternative などの特定ジャンルの精緻な研究ニーズにも適応します。
1. TikTok データセットを見つける
アカウントを持っていない方は、公式サイトで登録してください:リンク。初期状態で 2 ドルの無料試用クレジットが付与されます。
スクレイパー・マーケット(Scraping Browser ではなく Dataset Marketplace 等のマーケットプレイス)に入り、TikTok を見つけます。

2. API を選択する
本ケースでは、自動化とワークフローの統合に便利な API 方式でスクレイピングを実行します(右側に多言語のコードテンプレートが用意されており、直接コピーできます)。もちろん、管理画面から直接タスクを実行して結果を取得することも可能です。
以上の事前準備が整いました。ここからは実戦パートに入ります。

3. コードスニペット 1:Bright Data API を呼び出してスクレイピングタスクを実行
Python
import os
# 最後に Google Sheets に書き込む必要があるため、プロキシを有効にします。
# DeepSeek と Bright Data のインターフェースはプロキシを経由せず、Google Sheets のリクエストのみプロキシを使用します。
os.environ["HTTP_PROXY"] = "http://127.0.0.1:7897"
os.environ["HTTPS_PROXY"] = "http://127.0.0.1:7897"
os.environ["NO_PROXY"] = "api.deepseek.com"
os.environ["NO_PROXY"] = ",api.brightdata.com"
import pandas as pd
import json
import time
from openai import OpenAI
import gspread
from google.oauth2.service_account import Credentials
import requests
# ================= 設定エリア =================
Liang_KEY = 'Bright DataのAPIキー(コピーしたコード内にあります)'
API_KEY = "DeepSeekのAPIキー"
MODEL_NAME = "deepseek-chat"
BASE_URL = "https://api.deepseek.com/v1"
# ファイルパス設定
INPUT_JSON_FILE = "tiktok_data.jsonl" # スクレイピングしたデータの保存先
CREDENTIALS_FILE = "credentials.json" # Google Cloud からダウンロードした JSON 認証情報
# Google Sheets 設定
SPREADSHEET_NAME = "TikTokバズり分析レポート_2026"
WORKSHEET_NAME = "今日の内容洞察"
# ✅ DeepSeek は OpenAI SDK と互換性があります
client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
# ================= 1. Bright Data API を実行して内容をスクレイピング =================
def trigger_brightdata_task(keyword, num_of_posts=500, country=""):
headers = {
"Authorization": f"Bearer {Liang_KEY}",
"Content-Type": "application/json",
}
data = json.dumps({
"input": [{"search_keyword": keyword, "num_of_posts": num_of_posts, "country": country}],
})
response = requests.post(
"https://api.brightdata.com/datasets/v3/scrape?dataset_id=gd_lu702nij2f790tmv9h¬ify=false&include_errors=true&type=discover_new&discover_by=keyword",
headers=headers,
data=data
)
snapshot_id = response.json().get("snapshot_id")
print("snapshot_id:", snapshot_id)
return snapshot_id
機能解析: このスニペットは、コードの基礎設定と Bright Data スクレイピングタスク実行モジュールです。まず、プロキシ環境、サードパーティライブラリ、キー、ファイルパスなどの基礎パラメータを設定し、次に Bright Data 公式 API を呼び出す関数を定義します。キーワード、投稿取得数、地域などのパラメータを渡し、TikTok データのスクレイピングリクエストを発行して、後のデータダウンロードのための唯一の識別子であるスナップショット ID(snapshot_id)を生成します。
上記のコードをコピーし、3分以内に最初の TikTok データを取得しましょう →
API トークンを取得するために登録する →
https://get.brightdata.com/hwj7ya
- コードスニペット 2:Bright Data のスクレイピング結果をダウンロード
Python
# ================= 2. Bright Data API からスクレイピング結果を取得 =================
def download_snapshot_result(snapshot_id, output_file="tiktok_data.jsonl", poll_interval=120):
url = f'https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}'
headers = {
"Authorization": f"Bearer {Liang_KEY}",
"Content-Type": "application/json",
}
# 期待する Content-Type を定義
expected_content_type = "application/jsonl"
while True:
try:
response = requests.get(
url, headers=headers, stream=True,
proxies={"http": None, "https": None}
)
response.raise_for_status()
content_type = response.headers.get('Content-Type', '').lower()
if expected_content_type in content_type:
print("✅ データのスクレイピングに成功しました!")
break
else:
print(f"⏳ スクレイピング中です。{poll_interval//60} 分後に再試行します...")
time.sleep(poll_interval)
except requests.exceptions.RequestException as e:
print(f"リクエストエラー: {e}")
time.sleep(poll_interval)
with open(output_file, 'wb') as file:
for chunk in response.iter_content(chunk_size=8192):
file.write(chunk)
print(f"✅ ダウンロード完了: {output_file}")
return output_file
機能解析: このスニペットは、スクレイピング結果ダウンロードモジュールです。スナップショット ID を通じて Bright Data サーバを定期的に確認(ポーリング)し、タスクの完了ステータスを検知します。タスクが完了し JSONL 形式のファイルが生成されたら、自動的にデータをローカルへダウンロードし、tiktok_data.jsonl として保存します。
実行スクリーンショット:


- コードスニペット 3:スクレイピングデータの読み込みとクレンジング
Python
# ================= 3. データの読み込み =================
def load_and_clean_data(file_path):
df = pd.read_json(file_path, lines=True) # JSONL を直接読み込む
df = df[~df["error"].notna()] if "error" in df.columns else df
df = df[df["digg_count"].notna() & df["description"].notna()]
print(f"✅ データの読み込み完了:有効データ {len(df)} 件")
return df
機能解析: このスニペットはデータ読み込み・クレンジングモジュールです。Pandas ライブラリを使用してローカルの JSONL 形式データを読み込み、エラー情報を含むデータ、エンゲージメントデータがないもの、説明文がない無効なデータを除外します。正規な有効データを抽出し、後の分析の土台となる標準化されたデータフレーム(DataFrame)を生成します。
- コードスニペット 4:ブレイクスルー(急上昇)バズりコンテンツの選別
Python
# ================= 2. 統計分析とフィルタリングロジック =================
def find_breakthroughs(df, keywords):
if df.empty:
return pd.DataFrame()
# 前処理:キーワードを小文字・トリミング
target_keywords = [str(k).lower().strip() for k in keywords]
df = df.copy()
# --- 1. データクレンジング:数値列を数値型に変換 ---
count_cols = ['digg_count', 'comment_count', 'share_count', 'collect_count']
for col in count_cols:
if col in df.columns:
df[col] = pd.to_numeric(df[col], errors='coerce')
else:
df[col] = 0
df[count_cols] = df[count_cols].fillna(0)
# 総合エンゲージメントスコアの計算
df['score'] = (df['digg_count'] * 1) + \
(df['comment_count'] * 2) + \
(df['share_count'] * 3) + \
(df['collect_count'] * 4)
def check_topic(row, t_keywords):
desc = str(row.get('description', '') or '').lower()
tags_raw = row.get('hashtags')
if not isinstance(tags_raw, list):
tags_list = []
else:
tags_list = [str(tag).lower() for tag in tags_raw]
has_keyword_in_desc = any(k in desc for k in t_keywords)
has_keyword_in_tags = any(
any(k in tag for k in t_keywords)
for tag in tags_list
)
return has_keyword_in_desc or has_keyword_in_tags
df['is_target_topic'] = df.apply(lambda row: check_topic(row, target_keywords), axis=1)
target_df = df[df['is_target_topic'] == True].copy()
if target_df.empty:
print(f"⚠️ キーワード {target_keywords} に関連する内容が見つかりませんでした。")
return pd.DataFrame()
print(f"✅ キーワード [{', '.join(target_keywords)}] により {len(target_df)} 件の関連データを抽出。")
# 統計指標の計算
mean_score = target_df['score'].mean()
std_score = target_df['score'].std()
if std_score == 0 or std_score is None or pd.isna(std_score):
target_df['z_score'] = 0
else:
target_df['z_score'] = (target_df['score'] - mean_score) / std_score
if mean_score == 0 or pd.isna(mean_score):
target_df['breakthrough_ratio'] = 0
else:
target_df['breakthrough_ratio'] = target_df['score'] / mean_score
# フィルタリング戦略
breakthroughs = target_df[(target_df['z_score'] > 0.5) | (target_df['breakthrough_ratio'] > 1.5)]
if not breakthroughs.empty:
print(breakthroughs.sort_values(by='z_score', ascending=False))
return breakthroughs.sort_values(by='z_score', ascending=False)
機能解析: このスニペットは、ブレイクスルー・コンテンツ選別のコアモジュールです。まずエンゲージメントデータの形式を統一し、いいね、コメント、シェア、保存のデータに基づいて加重計算し「総合エンゲージメントスコア」を算出します。次に、特定のジャンル(dupe/alternative)の内容を正確にフィルタリングし、Z値(標準得点)とブレイクスルー指数を計算することで、業界平均を大きく上回る潜在的なバズり動画を抽出します。最終的に Z値の降順で並べ替え、価値の高いコンテンツを特定します。
設計ロジックとメリット:
1.加重計算された総合エンゲージメントスコア: TikTok のアルゴリズムに合わせ、保存やシェアの比重を高く設定することで、内容の有効性を正確に判断し、単純ないいね数による誤解を避けます。
2.スマートなタグと文案の照合: 特定ジャンルの内容を正確に位置付け、リスト形式でないタグによるエラーを解決。多様なデータ形式に適応し、コードの互換性を高めています。
3.Z値とブレイクスルー指数の二重基準: 科学的にブレイクスルー・コンテンツを識別し、通常のトラフィック内容を除外して、再現可能なバズり法則を正確にロックします。
4.ゼロ除算・空値の検証ロジックを内蔵: コードの実行エラーを防ぎ、選別プロセスの円滑さを保証します。
5.Z値降順ソート: 質の高いバズり動画を優先的に表示し、運用者がコアな内容に素早く集中できるようにします。
実行スクリーンショット:

- コードスニペット 5:AI によるバズりロジックのインテリジェント分析
Python
# ================= 3. LLM 分析関数 =================
def analyze_with_llm(row):
desc = row['description'][:150] # 長すぎる説明文をカット
followers = row['profile_followers']
ratio = row['breakthrough_ratio']
plays = row['play_count']
size_label = "微小アカウント (<1w)" if followers < 10000 else \
"小規模アカウント (1w-10w)" if followers < 100000 else \
"中規模アカウント (10w-100w)" if followers < 1000000 else \
"大規模アカウント (>100w)"
prompt = f"""
あなたは TikTok 美容セクターの成長エキスパートです。
「ジェネリック代替品 (Dupes)」セクターで異常に優れたパフォーマンスを示した動画を発見しました。
【データ概要】
- アカウント規模:{size_label} ({followers:,} フォロワー)
- 再生数:{plays:,}
- 突破指数:同ジャンル平均の {ratio:.2f} 倍
- 動画文案:"{desc}"
【タスク】
なぜこの動画が平均を大きく上回ったのか分析してください。再現可能なタイトル/内容の公式をまとめてください。
【出力要求】
簡潔な日本語の洞察(80文字以内)のみを出力し、直接結論を述べてください。
"""
try:
response = client.chat.completions.create(
model=MODEL_NAME,
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
max_tokens=100,
timeout=10
)
result = response.choices[0].message.content.strip()
print(f"\n✅ AI 分析結果 ({row['url']}):\n{result}\n")
return result
except Exception as e:
return f"❌ AI Error: {str(e)}"
機能解析: このスニペットは AI インテリジェント分析モジュールです。DeepSeek の大規模言語モデルを呼び出し、バズりコンテンツのアカウント規模、再生数、ブレイクスルー指数、動画文案などのデータを渡します。カスタマイズされたプロンプトを通じて、AI にバズりの要因を迅速に分析させ、再現可能なコンテンツ公式を抽出して、80文字以内の簡潔な洞察を生成します。
- コードスニペット 6:Google スプレッドシートへのデータ書き出し
Python
# ================= 4. Google Sheets へのエクスポート =================
def export_to_google_sheets(df, sheet_name, worksheet_name):
print(f"📡 Google Sheets に接続中: '{sheet_name}'...")
scopes = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
if not os.path.exists(CREDENTIALS_FILE):
print(f"❌ エラー:認証ファイル '{CREDENTIALS_FILE}' が見つかりません。")
return None
try:
creds = Credentials.from_service_account_file(CREDENTIALS_FILE, scopes=scopes)
gc = gspread.authorize(creds)
except Exception as e:
print(f"❌ Google 認証失敗:{e}")
return None
try:
sh = gc.open(sheet_name)
print(f"📂 既存のシートを発見: {sheet_name}")
except gspread.exceptions.SpreadsheetNotFound:
sh = gc.create(sheet_name)
print(f"✨ 新規シートを作成: {sheet_name}")
try:
worksheet = sh.worksheet(worksheet_name)
worksheet.clear()
print(f"🧹 ワークシートをクリア: {worksheet_name}")
except gspread.exceptions.WorksheetNotFound:
worksheet = sh.add_worksheet(title=worksheet_name, rows=100, cols=20)
print(f"➕ 新規ワークシートを作成: {worksheet_name}")
# エクスポートする列の準備
cols_to_export = ['profile_username', 'profile_followers', 'play_count', 'breakthrough_ratio', 'description',
'ai_insight', 'url']
available_cols = [c for c in cols_to_export if c in df.columns]
df_export = df[available_cols].copy()
df_export['分析時間'] = time.strftime("%Y-%m-%d %H:%M:%S")
data_values = [df_export.columns.tolist()] + df_export.values.tolist()
worksheet.update(values=data_values, range_name='A1')
# ヘッダーのフォーマット設定
worksheet.format('A1:Z1', {
'textFormat': {'bold': True},
'backgroundColor': {'red': 0.9, 'green': 0.9, 'blue': 0.9}
})
print(f"✅ {len(df_export)} 件のデータを Google Sheets にエクスポート成功!")
print(f"🔗 リンクを確認: {sh.url}")
return sh.url
機能解析: このスニペットはデータエクスポートモジュールです。Google Cloud の認証情報を使用して Google Sheets に接続し、指定されたテーブルを自動的に作成またはクリア。選別されたバズりデータ、AI 洞察、アカウント情報、動画リンクなどのコア情報をインポートし、ヘッダーをフォーマットしてリンクを生成します。
あなたのバズり分析レポートはこのようになります →登録して、今日から独自のデータシステムを構築しましょう →https://get.brightdata.com/hwj7ya
実測結果データ
実測結果(キーワード:#dupe alternative、収集数:200件)
有効データ:195件(有効率 97.5%)
選別されたブレイクスルー・コンテンツ:12件
AI 分析にかかった時間:約45秒
全工程の合計所要時間:約8分
9. コードスニペット 7:メインプロセスの実行関数
Python
# ================= 5. メインプロセスの実行 =================
def main():
# 1. スクレイピング API を実行
snapshot_id = trigger_brightdata_task("#dupe alternative", 2000)
# 2. スクレイピング結果をダウンロード
download_snapshot_result(snapshot_id, INPUT_JSON_FILE)
# 3. ファイルからデータを読み込み
df = load_and_clean_data(INPUT_JSON_FILE)
if df.empty:
return
# 美容 Dupes キーワード:クレンジング段階でノイズを除去
beauty_dupe_keywords = ['dupe', 'dupes', 'alternative', 'alternatives', 'swap', 'swaps']
# 4. ブレイクスルー・コンテンツの選別
print("🔍 統計指標の計算と選別を実行中...")
breakthroughs = find_breakthroughs(df, keywords=beauty_dupe_keywords)
if breakthroughs.empty:
print("条件に合うブレイクスルー・コンテンツは見つかりませんでした。")
return
print(f"🎯 {len(breakthroughs)} 件のブレイクスルー・コンテンツを特定。")
# 5. サーキットブレーカー(保護):最大 Top 20 のみを分析
MAX_TO_ANALYZE = 20
if len(breakthroughs) > MAX_TO_ANALYZE:
print(f"⚠️ 保護トリガー:パフォーマンス最高の Top {MAX_TO_ANALYZE} 件のみを分析します。")
breakthroughs = breakthroughs.head(MAX_TO_ANALYZE)
# 6. AI を呼び出し
print("🤖 AI 大規模モデルによる深い要因分析を実行中...")
breakthroughs['ai_insight'] = breakthroughs.apply(analyze_with_llm, axis=1)
# 7. Google Sheets にエクスポート
export_to_google_sheets(breakthroughs, SPREADSHEET_NAME, WORKSHEET_NAME)
if __name__ == "__main__":
main()
機能解析: このスニペットはメインプロセスの実行モジュールです。上述のすべての関数を順番に呼び出し、「スクレイピング実行 → データダウンロード → データクレンジング → バズり選別 → AI 分析 → スプレッドシート出力」の全フローを連結します。同時に、リソースの無駄を避けるため、上位 20 件のみを分析する保護設定を設けています。
10. 完全なコード
(ここには上記のスニペットを一つにまとめた完全な Python スクリプトが入ります。Qiita 投稿用にそのまま利用可能です)
Python
import os
# プロキシ設定(環境に合わせて調整)
# os.environ["HTTP_PROXY"] = "http://127.0.0.1:7897"
# os.environ["HTTPS_PROXY"] = "http://127.0.0.1:7897"
# os.environ["NO_PROXY"] = "api.deepseek.com,api.brightdata.com"
import pandas as pd
import json
import time
from openai import OpenAI
import gspread
from google.oauth2.service_account import Credentials
import requests
# ================= 設定エリア =================
Liang_KEY = 'Bright DataのAPIキーをここに貼り付け'
API_KEY = "DeepSeekのAPIキーをここに貼り付け"
MODEL_NAME = "deepseek-chat"
BASE_URL = "https://api.deepseek.com/v1"
INPUT_JSON_FILE = "tiktok_data.jsonl"
CREDENTIALS_FILE = "credentials.json"
SPREADSHEET_NAME = "TikTokバズり分析レポート_2026"
WORKSHEET_NAME = "今日の内容洞察"
client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
# ================= 各関数の定義 =================
def trigger_brightdata_task(keyword, num_of_posts=500, country=""):
headers = {"Authorization": f"Bearer {Liang_KEY}", "Content-Type": "application/json"}
data = json.dumps({"input": [{"search_keyword": keyword, "num_of_posts": num_of_posts, "country": country}]})
response = requests.post(
"https://api.brightdata.com/datasets/v3/scrape?dataset_id=gd_lu702nij2f790tmv9h¬ify=false&include_errors=true&type=discover_new&discover_by=keyword",
headers=headers, data=data
)
return response.json().get("snapshot_id")
def download_snapshot_result(snapshot_id, output_file="tiktok_data.jsonl", poll_interval=120):
url = f'https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}'
headers = {"Authorization": f"Bearer {Liang_KEY}"}
while True:
response = requests.get(url, headers=headers, stream=True)
if "application/jsonl" in response.headers.get('Content-Type', '').lower():
break
print(f"⏳ 収集中... {poll_interval//60}分後に再確認します")
time.sleep(poll_interval)
with open(output_file, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192): f.write(chunk)
return output_file
def load_and_clean_data(file_path):
df = pd.read_json(file_path, lines=True)
df = df[~df["error"].notna()] if "error" in df.columns else df
return df[df["digg_count"].notna() & df["description"].notna()]
def find_breakthroughs(df, keywords):
if df.empty: return pd.DataFrame()
target_keywords = [str(k).lower().strip() for k in keywords]
df = df.copy()
count_cols = ['digg_count', 'comment_count', 'share_count', 'collect_count']
for col in count_cols:
df[col] = pd.to_numeric(df[col], errors='coerce').fillna(0)
df['score'] = (df['digg_count'] * 1) + (df['comment_count'] * 2) + (df['share_count'] * 3) + (df['collect_count'] * 4)
def check_topic(row, t_keywords):
desc = str(row.get('description', '') or '').lower()
tags = [str(tag).lower() for tag in (row.get('hashtags') or [])]
return any(k in desc for k in t_keywords) or any(any(k in tag for k in t_keywords) for tag in tags)
df['is_target_topic'] = df.apply(lambda row: check_topic(row, target_keywords), axis=1)
target_df = df[df['is_target_topic']].copy()
if target_df.empty: return pd.DataFrame()
mean_s = target_df['score'].mean()
std_s = target_df['score'].std()
target_df['z_score'] = (target_df['score'] - mean_s) / std_s if std_s > 0 else 0
target_df['breakthrough_ratio'] = target_df['score'] / mean_s if mean_s > 0 else 0
return target_df[(target_df['z_score'] > 0.5) | (target_df['breakthrough_ratio'] > 1.5)].sort_values(by='z_score', ascending=False)
def analyze_with_llm(row):
prompt = f"分析 TikTok 動画: 再生 {row['play_count']}, 突破指数 {row['breakthrough_ratio']:.2f}. 文案: {row['description'][:150]}. 80字以内の日本語でバズり要因の結論を出して。"
try:
res = client.chat.completions.create(model=MODEL_NAME, messages=[{"role": "user", "content": prompt}])
return res.choices[0].message.content.strip()
except: return "AI 分析エラー"
def export_to_google_sheets(df, sheet_name, worksheet_name):
scopes = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive']
creds = Credentials.from_service_account_file(CREDENTIALS_FILE, scopes=scopes)
gc = gspread.authorize(creds)
try: sh = gc.open(sheet_name)
except: sh = gc.create(sheet_name)
try: ws = sh.worksheet(worksheet_name)
except: ws = sh.add_worksheet(worksheet_name, 100, 20)
ws.clear()
df_export = df[['profile_username', 'profile_followers', 'play_count', 'breakthrough_ratio', 'description', 'ai_insight', 'url']].copy()
ws.update([df_export.columns.tolist()] + df_export.values.tolist())
print(f"✅ シート完成: {sh.url}")
def main():
sid = trigger_brightdata_task("#dupe alternative", 2000)
download_snapshot_result(sid, INPUT_JSON_FILE)
df = load_and_clean_data(INPUT_JSON_FILE)
breakthroughs = find_breakthroughs(df, ['dupe', 'alternative', 'swap'])
if not breakthroughs.empty:
breakthroughs = breakthroughs.head(20)
breakthroughs['ai_insight'] = breakthroughs.apply(analyze_with_llm, axis=1)
export_to_google_sheets(breakthroughs, SPREADSHEET_NAME, WORKSHEET_NAME)
if __name__ == "__main__":
main()
これで実戦は終了です。本記事で示した内容は Bright Data プラットフォームの氷山の一角に過ぎません。起業家、コンテンツ運用者、技術チームのいずれであっても、Bright Data TikTok Web Scraper API は数週間の開発時間を節約し、メンテナンスコストを 90% 削減し、ビジネスモデルを迅速に検証し、バーティカルなコンテンツセクターで先機を掴む助けとなります。👉
今すぐ無料で試用する
https://get.brightdata.com/hwj7ya
結び
スクレイピングは目的ではなく、データこそが資産です。自動化は終点ではなく、創造こそが意義です。この記事があなたに新たな扉を開くことを願っています!
❓ よくある質問 (FAQ)
Q: このシステムの毎日のランニングコストはどのくらいですか?
A: コストは主にスクレイピング量に依存します。Bright Data は成功したデータ収集量に応じて課金され、通常、数百件のデータコストはわずか数セントです。DeepSeek API(非常に安価)と Google Sheets(無料枠内)を合わせても、1日のコストは 1 ドル以内に抑えられます。
Q: Python の知識がなくても使えますか?
A: 全く問題ありません。この記事では全自動化のために Python コードを提供していますが、非技術ユーザーの方は Bright Data の管理画面でビジュアルモードを使用して同じ TikTok スクレイパーを実行できます。コードを一行も書かずに、キーワードを設定するだけで、結果を CSV/JSON で一括出力して分析が可能です。
Q: Bright Data TikTok API とデータセットを直接買うのでは何が違いますか?
A: API はリアルタイムの監視や、特定のキーワードによる即時の最新コンテンツ収集に適しています。Dataset はあらかじめ収集された歴史的な静的データパッケージです。リアルタイムのトレンドを追う場合は、Web Scraper API を選択してください。
Q: TikTok データのスクレイピングは合規(コンプライアンス遵守)ですか?アカウントは凍結されませんか?
A: Bright Data は企業レベルのコンプライアンス・プロバイダーであり、GDPR/CCPA を厳守しています。内蔵のプロキシネットワークとアンチ指紋技術が実際のユーザー行動をシミュレートし、個人のアカウントにログインせずに公開データをスクレイピングするため、個人のアカウントが凍結されることはありません。
Q: このフローを他の特定ジャンルのキーワードに変更できますか?
A: もちろん可能です。メイン関数の trigger_brightdata_task 内で keyword パラメータを変更するだけです(例:「#skincare routine」や「#tech gadgets」)。システムは自動的に新しいジャンルに適応してバズり動画の発掘を行います。
