1日あたり2,300万本——クリエイターがTikTokに上げる動画の推定本数です。月間アクティブユーザーは19億人前後。この濁流からほんの一滴でも汲み出そうとして、思うように取れずに頭を抱えた経験は、おそらく珍しくないはずです。
筋書きはたいてい同じです。「TikTok動画をPythonでスクレイピング」で検索し、見つけたチュートリアルのコードを貼る。あるいはChatGPTに書かせて走らせる。なのに手元に残るのは……からっぽのHTML、403エラー、見慣れた「Process finished with exit code 0」と出力ゼロ。同じ嘆きをGitHubのIssueや5chのスレッドで何度も見てきたので、このガイドをまとめました。2025年でもちゃんと動くPythonの3手法を取り上げ、多くの記事が素通りする部分——実際の.mp4ファイルを落とすところまで——丁寧にたどります。用途に合う手法を選びやすいよう、比較表も添えました。Pythonが不要な方には、Thunderbit のようなノーコードの代替手段も紹介します。ほんの2クリックほどで、同じデータが手に入るんです。
「TikTok動画をスクレイピングする」とは、実際には何を指すのか?
実はこの言葉、まるで性質の異なる2つの作業を一緒くたにしています。コードに踏み込む前に、そこをほどいておきましょう。
- 動画メタデータの抽出: キャプション、ハッシュタグ、いいね数、コメント数、シェア数、再生数、投稿日時、投稿者情報など。チュートリアルの大半は、ここに焦点を絞っています。
- 実際の動画ファイル(.mp4)のダウンロード: 動画本体を自分の端末へ保存することです。「TikTok動画をスクレイピング」と検索する人が本当に求めているのはこちらなのに、ここまで踏み込む記事はほとんど見当たりません。
本ガイドは、この両方を扱います。これから紹介する各手法では、メタデータの抽出に加えて、.mp4を保存するのに欠かせないダウンロードURLまで取得できます。
なぜPythonでTikTok動画をスクレイピングするのか?
TikTok Shopが世界の広告収益で330億ドル超を叩き出し、1ユーザーあたり1日およそ280本の動画が再生されている——この規模を踏まえれば、TikTokデータを業務で生かす意味はかなり大きいと分かります。代表的な使いどころは次のとおりです。
| ユースケース | 取得するデータ | 主な対象 |
|---|---|---|
| インフルエンサー/マーケティング調査 | エンゲージメント率、フォロワー数、コンテンツ形式、ハッシュタグのパフォーマンス | マーケティングチーム、代理店 |
| コンテンツ戦略 | トレンドのハッシュタグ、バズった動画の形式、投稿頻度 | クリエイター、SNS運用担当者 |
| ブランド監視 | 言及、キャンペーンのリーチ、オーディエンスの感情 | ブランドマネージャー、PRチーム |
| 競合分析 | 競合動画のパフォーマンス、広告クリエイティブ、TikTok Shop掲載情報 | EC、プロダクトチーム |
| 市場調査 | 新たなトレンド、ユーザー行動、商品発見の傾向 | アナリスト、ヘッジファンド、調査会社 |
| アーカイブ/コンプライアンス | 社内レビューや記録保管用の動画ファイル | 法務、コンプライアンス、代理店 |
金額の面でも軽視できません。米国のTikTok広告収益は2026年に234億ドルへ届くと見込まれ、アフィリエイト系クリエイターはTikTok Shopの主要カテゴリで売上の82〜84%を生み出しています。ECやインフルエンサーマーケティングに身を置くなら、このデータはそのまま売上に跳ね返ってくるわけです。
なぜ基本的なPythonコードではTikTokで失敗するのか
こんなコードを試して何も返ってこなかった——もしそうなら、つまずいているのはあなただけではありません。
import requests
from bs4 import BeautifulSoup
resp = requests.get("https://www.tiktok.com/@someuser")
soup = BeautifulSoup(resp.text, "html.parser")
# ...でもHTMLの中に役立つ情報が何もない
からくりは単純で、TikTokがWeb上でも指折りに手強いプラットフォームだからです。素の requests.get() を投げても、肝心の中身はブラウザ側のJavaScriptで初めて描かれるため、ほぼ空のHTMLの殻しか戻ってきません。加えてTikTokは、行動パターンの検知、TLSフィンガープリント、リクエスト署名をひねり出す独自のJavaScript仮想マシン、前触れなく差し替わる動的CSSセレクタと、相当に厚いボット対策を張り巡らせています。

Impervaの2025年 Bad Bot Reportによれば、2024年にはついに自動化トラフィックが人間のそれを追い越し、ボットがインターネット全体の51%を占めるに至りました。TikTokもこの流れは当然見えていて、防御を一段と固めているわけです。
ここで、何が引っかかっているのかを切り分け、次の一手へ進むための簡易診断表を置いておきます。
| 症状 | 考えられる原因 | 解決する方法 |
|---|---|---|
| 空のHTML/データなし | JSで描画されるため、requests ではJavaScriptを実行できない | 方法1(隠しJSON)または方法3(Playwright) |
| 403/アクセス拒否 | ヘッダー不足または不正、ボット検知 | 適切なヘッダーを付けた方法1 |
| 一度は動くが、その後止まる | レート制限/IPブロック | プロキシのローテーション(すべての方法) |
| ログイン壁が出る | セッション/Cookieが必要 | 方法3(保存済みセッション付きブラウザ) |
| ChatGPT生成コードが何も返さない | 学習データ以降にTikTokの構造が変わった | 3つすべての方法(最新の手法) |
レート制限の目安は、IPあたり毎分30〜60リクエストあたり。これを超え始めると、ソフトブロックやCAPTCHAが顔を出します。データセンターIPだと数分で弾かれることもあるので、ある程度の量をさばくなら、住宅系やモバイル系のプロキシはほぼ必携です。
概要: PythonでTikTok動画をスクレイピングする3つの方法
先に全体像をつかんでおきましょう。3つの手法にはそれぞれ得手不得手があり、ここでは動くコードを添えて順に解説します。
- 隠しJSONの抽出 — TikTokのページに埋め込まれた
__UNIVERSAL_DATA_FOR_REHYDRATION__スクリプトタグを読み解く方法です。最速かつ最も手軽で、ブラウザは要りません。 - TikTok内部API — 非公開の
/api/post/item_list/エンドポイントを直接叩き、カーソル方式のページネーションでまとめて引き抜きます。 - Playwrightによるブラウザ自動化 — ヘッドレスブラウザでページを描画させ、無限スクロール、動的コンテンツ、ログイン壁までこなします。
この3つは、いずれも実際の.mp4をダウンロードする用途に使えます。ダウンロードの段取りは、各手法を説明したあとで専用セクションにまとめて取り上げます。最後には比較表も用意したので、自分に合う方法を見極めやすいはずです。
方法1: 隠しJSONを使ってTikTok動画をスクレイピングする(初心者向け)
まず手を付けるなら、これがおすすめです。TikTokはほぼ毎回のページ読み込み時に、__UNIVERSAL_DATA_FOR_REHYDRATION__ というIDの <script> タグへ、巨大なJSONの塊を埋め込んでいます。この塊にはフロントエンドのJavaScriptがふだん描き出すプロフィールや動画のデータが丸ごと入っているので、ブラウザを使わずHTTPリクエスト1本で拾えるわけです。
必要なもの
- Python 3.8以上
requests(またはhttpx)beautifulsoup4(またはparsel)- 適切なヘッダー:
User-Agent、Referer、Accept-Language
依存関係をインストールします。
pip install requests beautifulsoup4
手順: スクリプトタグからTikTok動画データを抽出する
ステップ1: 本物のブラウザっぽいヘッダー付きでGETリクエストを送る。
つまずきポイントはここです。ヘッダーなしの素の requests.get() を打つと、TikTokは403かCAPTCHAページを返してきます。少なくとも、現行ブラウザの User-Agent と Referer は添えてください。
import requests
from bs4 import BeautifulSoup
import json
url = "https://www.tiktok.com/@charlidamelio"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Referer": "https://www.tiktok.com/",
"Accept-Language": "en-US,en;q=0.9",
}
resp = requests.get(url, headers=headers)
ステップ2: HTMLを解析して、hydration用のスクリプトタグを探す。
soup = BeautifulSoup(resp.text, "html.parser")
script_tag = soup.find("script", id="__UNIVERSAL_DATA_FOR_REHYDRATION__")
script_tag が None で返るなら、TikTokにブロックされている(ステータスコードを確認)か、タグIDが変わった(頻度は高くないものの起こりうる)かのどちらかです。
ステップ3: スクリプトの中身をJSONとして読み込む。
data = json.loads(script_tag.string)
ステップ4: JSON構造をたどって動画メタデータを抽出する。
データは __DEFAULT_SCOPE__ の下に入れ子になっています。プロフィールページなら、たどり方はこうなります。
user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
user_info = user_detail["userInfo"]
# プロフィール統計
stats = user_info["stats"]
print(f"Followers: {stats['followerCount']}, Likes: {stats['heartCount']}")
# 動画一覧(最初のページの動画)
item_list = user_detail.get("itemList", [])
for video in item_list:
print(video["desc"]) # キャプション
print(video["stats"]["playCount"]) # 再生数
print(video["video"]["playAddr"]) # 動画ダウンロードURL(透かしなし)
print(video["video"]["downloadAddr"]) # 動画ダウンロードURL(透かしあり)
ステップ5: 動画のダウンロードURLを取り出す。
playAddr が返すのはたいてい見栄えのよい動画版(多くの場合TikTokの透かしが乗らない版)で、downloadAddr のほうは標準の透かし付きです。どちらも.mp4への直リンクですが、落とすには所定のヘッダーが要ります(後述のダウンロードセクションで触れます)。
これで、各動画のキャプション・統計・作成時刻・ハッシュタグ(challenges[] と textExtra 内)、そして直リンクの動画URLまで揃った、メタデータの一覧が手に入るはずです。
隠しJSON方式の制限
- 初回ページ読み込み時のデータしか取得できない — 通常はプロフィールの最初の約30本まで
- 無限スクロールやページネーションには対応できない(「次ページ」を取りに行く仕組みがない)
- TikTokがスクリプトタグIDやJSON構造を変えるとパーサーが壊れる(定期的に起こります。早めの検知にはPydantic validationが役立ちます)
- 向いている用途: すばやいプロフィール取得、単発のデータ抽出、最新動画だけ欲しい場合
方法2: TikTok内部API経由で動画をスクレイピングする
TikTokのフロントエンドは動画をまとめて読み込むのではなく、スクロールに応じて内部APIへXHRを飛ばします。ユーザー動画向けの代表格が /api/post/item_list/ です。これをPythonから直に叩けば、カーソル方式のページネーションで、最初のページに限らずプロフィール上の動画を残らず引き抜けます。
内部APIエンドポイントの見つけ方
TikTokのプロフィールページをChrome DevToolsで開き、NetworkタブをXHRで絞り込んで、下へスクロールしてみてください。こんなURLへのリクエストが現れます。
https://www.tiktok.com/api/post/item_list/?WebIdLastTime=...&aid=1988&count=35&cursor=0&secUid=...
重要なパラメータは以下です。
secUid— プロフィールの一意ID(方法1のJSON、userInfo.user.secUidから取得できます)cursor— ページネーションのオフセット(0から開始し、各レスポンスで次のカーソル値が返る)count— 1ページあたりの件数(通常30〜35件)
手順: PythonでTikTok内部APIを呼び出す
ステップ1: 対象プロフィールの secUid を取得する。
これは隠しJSON(方法1)か、プロフィールページのHTMLから拾えます。
ステップ2: APIリクエストを組み立てて送信する。
import requests
import json
sec_uid = "MS4wLjABAAAA..." # 方法1から取得
api_url = "https://www.tiktok.com/api/post/item_list/"
params = {
"aid": "1988",
"secUid": sec_uid,
"count": 35,
"cursor": 0,
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36",
"Referer": "https://www.tiktok.com/",
}
resp = requests.get(api_url, params=params, headers=headers)
data = resp.json()
ステップ3: レスポンスを解析する。
data["itemList"] に並ぶ各項目は、方法1とそっくり同じ動画構造を持っています。desc、stats、video.playAddr、video.downloadAddr といった具合です。
ステップ4: すべての動画をページネーションで取得する。
all_videos = []
cursor = 0
has_more = True
while has_more:
params["cursor"] = cursor
resp = requests.get(api_url, params=params, headers=headers)
data = resp.json()
items = data.get("itemList", [])
all_videos.extend(items)
has_more = data.get("hasMore", False)
cursor = data.get("cursor", 0)
print(f"Fetched {len(items)} videos, total: {len(all_videos)}, hasMore: {has_more}")
print(f"Total videos scraped: {len(all_videos)}")
ループのたびに、次のひとかたまりと新しいカーソルが返ってきます。hasMore が False に変わるまで回し続けます。
内部API方式の制限
- TikTokはこれらのエンドポイントや必要パラメータを頻繁に変えるため、最もメンテナンスコストが高い方法です。最近では、
msToken、X-Bogus、その他TikTokの独自JavaScript VMが生成する署名パラメータを要求するリクエストも出てきています(ちなみに、これを純粋なPythonで再現するのは簡単ではありません)。 - 特定のデータ型ではセッションCookieや追加トークンが必要になる場合があります
- IPベースのレート制限は依然として有効です。プロキシのローテーションを推奨します
itemListが空になり始めたら、msTokenが古くなっている可能性が高いです(ブラウザではおよそ10秒ごとに更新されます)- 向いている用途: プロフィール上の動画をすべて取りたい大量データ抽出。方法1の「最初のページのみ」という制約では足りない場合に最適です
方法3: PlaywrightでTikTok動画をスクレイピングする(ブラウザ自動化)
ログイン要求やCAPTCHA、再現の難しい署名パラメータ——最初の2手法でこうした壁にぶつかったら、Playwrightが逃げ道になります。本物の(ヘッドレス)ブラウザを立ち上げ、人間のユーザーさながらにTikTokへアクセスするので、JavaScript描画も、無限スクロールも、認証済みセッションも丸ごと扱えます。
TikTokスクレイピング用にPlaywrightをセットアップする
Playwrightとブラウザバイナリをインストールします。
pip install playwright
playwright install firefox
TikTokを相手にするなら、ChromiumよりFirefoxを推します。TikTokのボット検知はChromium系ヘッドレスにとりわけ厳しい一方、Firefoxのほうがフィンガープリント互換性が高い傾向があるとコミュニティの検証で示されているからです。
ステルス性をさらに上げたいなら、patchright(Playwrightのパッチ版フォーク)やCamoufox(C++レベルで手を入れたFirefoxの回避強化版)を組み合わせる手もあります。独立ベンチマークでは、Camoufoxが主要なボット検知サービスに対してほぼ満点のステルススコアを叩き出しています。
手順: PlaywrightでTikTokプロフィール動画をスクレイピングする
ステップ1: ヘッドレスFirefoxを起動して、プロフィールに移動する。
import asyncio
from playwright.async_api import async_playwright
import json
async def scrape_tiktok_profile(username):
async with async_playwright() as p:
browser = await p.firefox.launch(headless=True)
context = await browser.new_context(
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0",
viewport={"width": 1280, "height": 720},
)
page = await context.new_page()
await page.goto(f"https://www.tiktok.com/@{username}", wait_until="networkidle")
ステップ2: 動画グリッドが読み込まれるのを待つ。
# 動画アイテムが表示されるのを待つ
await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
TikTokが「Something went wrong」のオーバーレイを出してきたら、再試行ボタンを押す必要があるかもしれません。
retry_btn = page.locator('button:has-text("Retry")')
if await retry_btn.count() > 0:
await retry_btn.click()
await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
ステップ3: 低レベルJSONからデータを抽出する(Playwrightでも同じ)。
ブラウザ経由であっても、いちばん確実なのは結局hydration JSONを拾うやり方です。
script_el = page.locator("#__UNIVERSAL_DATA_FOR_REHYDRATION__")
raw_json = await script_el.inner_text()
data = json.loads(raw_json)
# 方法1と同じJSONのたどり方
user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
videos = user_detail.get("itemList", [])
ステップ4: 無限スクロールでさらに動画を取る。
最初の約30本では足りないなら、最下部までスクロールして追加のXHRレスポンスを拾います。
all_videos = list(videos)
# スクロール中にAPIレスポンスをキャプチャする
api_responses = []
async def capture_response(response):
if "/api/post/item_list" in response.url:
try:
body = await response.json()
api_responses.append(body)
except:
pass
page.on("response", capture_response)
# 下へスクロールして追加読み込みを発生させる
for _ in range(5): # 必要に応じてスクロール回数を調整
await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
await asyncio.sleep(2)
# 取得したレスポンスから動画を集める
for api_resp in api_responses:
items = api_resp.get("itemList", [])
all_videos.extend(items)
print(f"Total videos: {len(all_videos)}")
await browser.close()
return all_videos
# 実行
videos = asyncio.run(scrape_tiktok_profile("charlidamelio"))
これで、初回読み込み分とスクロールで追い読みされた分、その両方の動画オブジェクトをまとめた一覧が得られるはずです。
Playwright方式の制限
- 圧倒的に遅い方法です(ページ全体の描画、ネットワーク往復、スクロール待ちが必要)
- リソース消費が大きい — ブラウザインスタンス1つでもメモリとCPUをかなり使います
- 大規模運用ではIPブロックの対象になるため、やはりプロキシローテーションが必要です
- 向いている用途: 複雑な操作、ログイン壁のあるコンテンツ、CAPTCHA対応、または方法1・2がブロックされる場合
PythonでTikTok動画(.mp4)をダウンロードする方法
ほかのTikTokスクレイピング解説でいちばん抜け落ちがちな穴を、このセクションで埋めます。メタデータの抽出ももちろん有用ですが、「TikTok動画をスクレイピング」で検索する人の本命は、たいてい動画ファイルそのものです。
TikTokは動画データオブジェクトの中にダウンロードURLを埋め込んでいます。
playAddr— 通常はウォーターマークなし、またはより小さい透かしのバージョンdownloadAddr— TikTokがアプリ内ダウンロード向けに用意しているバージョン(TikTokのウォーターマーク付き)
どちらのURLにも期限があり、たいてい数時間ほどで失効します。だから取り出したら、できるだけ早く落としてしまうのが鉄則です。
手順: TikTok動画ファイルをダウンロードする
ステップ1: 上の3つの方法のいずれかで動画URLを取り出す。
video_url = video["video"]["playAddr"] # ウォーターマークなし
# または
video_url = video["video"]["downloadAddr"] # ウォーターマークあり
ステップ2: 正しいヘッダー付きでGETリクエストを送る。
ここでも多くの人がつまずきます。ただ requests.get(video_url) するだけだと403が返ってきます。TikTokは Referer ヘッダーを見ていて、ブラウザらしい User-Agent を求めているからです。
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Referer": "https://www.tiktok.com/",
}
resp = requests.get(video_url, headers=headers, stream=True)
ステップ3: レスポンスの中身を.mp4ファイルとして保存する。
stream=True を効かせて、チャンクごとに書き出します。TikTokの動画は大きいことがあるので、丸ごとメモリに抱え込まないほうが無難です。
video_id = video["id"]
filename = f"tiktok_{video_id}.mp4"
with open(filename, "wb") as f:
for chunk in resp.iter_content(chunk_size=1024 * 1024): # 1MB単位
if chunk:
f.write(chunk)
print(f"Downloaded: {filename}")
これで、ローカルマシンに再生できる.mp4が一本、保存されます。
ウォーターマークあり/なしの違い
TikTokは各動画について、透かし付きと透かしなしの両方を抱えています。playAddr が返すのはたいてい見栄えのよい版(プレイヤーが使う版)で、downloadAddr のほうにはクリエイター名を含むTikTokの透かしが入ります。
ここで倫理の話に少し触れておくと、透かしはクリエイターへの帰属を示すための印です。研究や分析、社内レビューを目的に保存する分には、playAddr を使ってもおおむね問題ありません。ただし再配布や再投稿となると、作者表記を剥がすことは倫理面でも著作権面でも引っかかってきます。詳しくは後段の法的セクションで扱います。
ダウンロード処理にもっと堅牢さが欲しいなら、yt-dlp も候補に入れてください。TikTok向けの抽出機能が署名計算やURL解決を肩代わりしてくれるので、ヘッダーやトークンの有効期限を自分で管理しなくて済みます。
3つのPython手法を横並びで比較すると?
TikTokスクレイピングに足を踏み入れた頃の自分に渡したかった——そう思える比較表を、ここに置いておきます。
| 比較項目 | 方法1: 隠しJSON | 方法2: 内部API | 方法3: Playwright |
|---|---|---|---|
| 難易度 | 初級 | 中級 | 中級 |
| 速度 | 高速(1ページ1リクエスト) | 高速(JSON API) | 低速(ページ全体を描画) |
| ボット対策への強さ | 中 | 低(エンドポイントが変わる) | 高(実ブラウザに近い) |
| 動画 .mp4 をダウンロードできる? | できる(playAddr を抽出) | できる(レスポンスにURLあり) | できる(ネットワークを傍受) |
| 無限スクロール対応 | なし(最初のページのみ) | あり(カーソルページネーション) | あり(スクロールの再現) |
| 大規模運用でプロキシは必要? | 必要 | 必要 | 必要 |
| 保守の手間 | 中(JSON構造の変更あり) | 高(エンドポイント/署名が頻繁に変わる) | 低〜中(ブラウザが追従) |
| 最適な用途 | すばやい単発プロフィール取得 | 大量抽出、全動画取得 | ログイン壁のある複雑な内容 |
私としては、こんな選び方を勧めます。
- 1件のプロフィールをさっと覗きたいだけなら、方法1から入ってください。仕込みは30秒ほど、データは1ページあたり1秒未満で返ってきます。
- ページネーション込みでプロフィールの動画を全部押さえたいなら、方法2が合います。ただし、TikTokがAPIパラメータをいじってきたときの保守は覚悟しておくこと。
- ログイン壁やCAPTCHA、そして最大限の粘り強さが要るなら、Playwrightの方法3です。遅くて重いものの、TikTokに最もブロックされにくい手です。
現場では、まず方法1で着手し、限界に当たったときだけ方法2や3へ切り替える——という運び方が多いです。そのほうがインフラが軽く済み、コストも抑えられます。
Pythonは不要? ノーコードでTikTok動画をスクレイピングする方法
「TikTok動画をPythonでスクレイピング」と打ち込む人の多くは、実のところPythonそのものを必要としていません。欲しいのはデータです。数件の競合プロフィールから動画メタデータを拾いたいマーケティングアナリストや、言及を追いたいブランドマネージャーにとって、Python環境・プロキシローテーション・署名処理まで一式そろえるのは、明らかに過剰装備です。

それぞれのアプローチを、ここで率直に並べてみましょう。
| アプローチ | スキルレベル | コスト | 保守 | 最適な用途 |
|---|---|---|---|---|
| Python(自作) | 中級以上 | 無料(+プロキシ費用) | 高い(スクリプトが壊れやすい) | 完全な制御、独自パイプライン |
| Thunderbit(Chrome拡張) | 初級 | 無料枠あり | なし(AIが毎回サイトを読み直す) | すばやい動画データ抽出、Sheets/Excelへの出力 |
| Apify TikTok Scraper | 初級 | 有料(実行ごと) | 低い(Apifyが保守) | 定期実行のバッチ処理 |
| TikAPI | 開発者向け | 有料サブスクリプション | 中 | TikTokデータを使ったアプリ開発 |
ThunderbitでTikTokスクレイピングをどう処理するか
Thunderbit はThunderbitが手がけるAIウェブスクレイパーで、従来のツールとは発想からして違います。TikTokのレイアウトが変わるたびに崩れがちな既製のCSSセレクタやXPathに縛られるのではなく、ThunderbitのAIが毎回ページ構造を読み取り、キャプション・いいね数・ハッシュタグ・動画URL・投稿者といった列を、その場で提案してくれます。
操作はまさに2クリックです。
- ChromeでTikTokのプロフィールを開き、Thunderbit拡張機能を押して「AIで項目を提案」をクリックします。Thunderbitがページを読み、表の組み立てを提示します。
- 提示された列を確かめ、必要なら手を入れて「スクレイプ」をクリックします。
データはGoogle Sheets、Excel、Airtable、Notionへ直に書き出せます。CSSセレクタの保守も、コードのデバッグも、プロキシ設定も無用です。数件のプロフィールから動画メタデータを拾いたいマーケティング担当者にとっては、Python環境を組むよりずっと速いうえ、TikTokのフロントエンドが更新されても壊れません(コミュニティ報告では、これが数週間おきに起こることもあるそうです)。
Thunderbitはサブページのスクレイピングにも対応していて、各動画ページを一つずつ開き、コメント数の詳細・音楽情報・動画の長さなどを表に足していけます。
Thunderbit Chrome拡張機能 から無料で試せます。仕組みの細部は、YouTubeチャンネル でも解説しています。
TikTokスクレイピングにおける法的・倫理的な注意点
このテーマの上位記事はほとんど合法性に触れていませんが、TikTokは現にスクレイピングサービスへ法的措置を取ってきた以上、見過ごせない論点です。押さえておきたい点をまとめます。
TikTokの利用規約(§ 4.1) は、自動化されたアクセスをはっきり禁じています。規約違反は犯罪ではなく契約上の問題ですが、それでもアカウント停止、IPブロック、民事訴訟へとつながりうる話です。
公開データをめぐる法的環境は、思われているほど厳しくありません。 象徴的な前例が Meta Platforms v. Bright Data(2024年1月、N.D. Cal.)で、ログアウト状態で公開データをスクレイピングする行為はMetaの利用規約違反にあたらない、と裁判所は判断しました。Metaはその後に訴えを取り下げ、控訴権も手放しています。さらにさかのぼる hiQ v. LinkedIn の第9巡回区判決(Van Buren 後に再確認)でも、公開データのスクレイピングはCFAA違反ではないとされました。ただしhiQは最終的に和解し、50万ドルを支払って恒久的差止めに同意しており、利用規約の強制力がなお現実のリスクであることもうかがわせます。
GDPRとCCPA は、EUまたはカリフォルニア州のユーザーから個人データを集める場面で効いてきます。公開投稿を集めることと、個人の個人情報をデータベース化することは、まったくの別問題です。
実務上のガイドライン:
- リクエストはレート制限する(TikTokのサーバーを叩きすぎない)
- 非公開アカウントや未成年者のコンテンツは取得しない
- 著作権のある動画を商用目的で再配布しない
robots.txtを尊重する(TikTokは大半の自動クロールを拒否しています)- 個人研究や分析のためのダウンロードと、再投稿は別物だと理解する
免責事項: これは教育目的の内容であり、法的助言ではありません。スクレイピングしたTikTokデータを使って商用プロダクトを作るなら、弁護士に相談してください。
まとめ: 重要なポイント
2025年のTikTokスクレイピングは、相手が絶えず動く的のようなものです。TikTokのボット対策はWeb上でも屈指に厚く、素朴なやり方——生の requests、ChatGPTが吐いた断片、古びたチュートリアル——はことごとく空振りしがちです。それでも、正しい手を選べば十分に届きます。
要点を整理すると:
- 方法1(隠しJSON) が最速かつ最もシンプル。プロフィールをさっと取りたいならここから始めましょう。
- 方法2(内部API) はページネーションと大量取得に向いていますが、エンドポイントや署名要件が変わるたびにメンテナンスが必要です。
- 方法3(Playwright) はボット対策に最も強い一方、速度とリソース消費のコストがあります。
- 3つすべての方法 で動画のダウンロードURLを取得できます。そして、このガイドでは正しいヘッダー付きで実際に.mp4ファイルをダウンロードする手順まで説明しています。
- 非技術系ユーザー には、Thunderbit が、コードを書いたり保守したりせずに同じデータへたどり着く、より速い選択肢です。AIベースなので、TikTokのレイアウト変更で壊れません。コミュニティ報告を見る限り、これは思った以上に頻繁に起こります。
Pythonの準備なしですぐ始めたいなら、Thunderbit Chrome拡張機能を試してみてください。無料枠だけでも数件のプロフィールで試して、ワークフローに合うか確認できます。Pythonで進める場合は、まず方法1から始めてデータを検証し、必要に応じてスケールさせていくのがおすすめです。
Webスクレイピングをさらに深掘りしたい方は、あらゆるWebサイトからデータをスクレイピングする方法、Webスクレイピングのベストプラクティス、Google Sheetsへのスクレイピング方法 もぜひご覧ください。
FAQ
PythonでTikTok動画をスクレイピングするのは合法ですか?
公開されているデータのスクレイピングは、はっきり違法というよりグレーゾーンです。Meta v. Bright Data(2024年)の判決は、ログアウト状態で公開データを取る行為はプラットフォームの利用規約に違反しない、という立場を後押ししています。ただし、TikTokの利用規約は自動アクセスを明確に禁止しており、GDPR/CCPAは個人データに適用されます。多くの人が思うほど単純な違法行為ではありませんが、リスクがゼロでもありません。具体的なケースについては法律の専門家に相談してください。
TikTokスクレイピングに最適なPythonライブラリは何ですか?
方法によって変わります。隠しJSON抽出(方法1)なら、requests と beautifulsoup4 だけで十分です。内部API呼び出し(方法2)なら requests か httpx が使えます。ブラウザ自動化(方法3)では、今の標準は playwright です。新規のスクレイピング案件ではSeleniumより採用が進んでいて、PyPIの月間ダウンロード数は約5,900万で、Seleniumの約5,300万を上回っています。より高レベルな操作をしたいなら、TikTok-Api ラッパー(GitHub stars 約6.3K)も検討に値しますが、少し壊れやすい面があります。
Pythonを使ってウォーターマークなしでTikTok動画をダウンロードできますか?
はい。TikTokのデータには playAddr URLが含まれており、通常は標準のウォーターマークが入っていないバージョンを取得できます。このガイドでは、3つの方法のどれからでもそのURLを取り出して、適切なヘッダー付きで.mp4ファイルをダウンロードする方法を説明しています。一方、downloadAddr にはウォーターマークが含まれます。
TikTokスクレイパーが空のデータを返すのはなぜですか?
最もよくある原因は、TikTokがコンテンツ描画にJavaScriptを必要とすることです。基本的な requests.get() はHTMLシェルしか取れず、実際のデータは隠しJSONスクリプトタグ(方法1)に入っているか、JavaScript経由で動的に読み込まれます(方法3)。空のHTMLが返るなら、まず方法1を試してください。うまくいかない場合は、ヘッダーを確認し(Referer の欠如が403の大きな原因です)、必要ならPlaywrightを使う方法3へ進みましょう。
TikTokスクレイピングでブロックを避けるにはどうすればいいですか?
本物のブラウザに近いヘッダー(User-Agent、Referer、Accept-Language を含む)を使い、住宅系またはモバイル系プロキシをローテーションし(データセンターIPは数分で検知されます)、リクエスト間にランダムな待機時間を入れ(最低1〜3秒)、極端な高頻度アクセスは避けてください。方法3(Playwright)は、実ブラウザのセッションを模倣するため、最もブロックされにくい方法です。本格運用では、プロキシ費用を見込むべきです。主要プロバイダーのエントリーレベル住宅プロキシは、およそ1GBあたり2〜4ドルです。
- さらに学ぶ


