TikTokの月間アクティブユーザー数は現在約にのぼり、クリエイターは毎日推定2,300万本の動画を投稿しています。この大洪水のようなデータの一部でも集めようとしたことがあるなら、その大変さはもう身にしみているはずです。
よくある流れはこうです。「TikTok動画をPythonでスクレイピング」と検索し、チュートリアルのコード片をコピペするか、ChatGPTに書かせて実行してみる。ところが返ってくるのは、何もない空っぽのHTML、403エラー、あるいはおなじみの「Process finished with exit code 0」なのに出力ゼロ――そんな結果ばかりです。私はGitHubのissueやRedditのスレッドで、まさにこの流れを何度も見てきました。だからこそ、このガイドを書きました。本記事では、2025年時点で本当に使える3つのPython手法、実際の.mp4動画ファイルをダウンロードするための完全手順(他の多くのチュートリアルが止まっている“メタデータだけ”ではありません)、さらに用途に合った方法を選べる比較表までまとめています。Pythonを使わなくてもよいなら、 のようなノーコード代替案で、たった2クリックほどで同じデータを取得する方法も紹介します。
「TikTok動画をスクレイピングする」とは実際には何を指すのか?
コードの話に入る前に、「TikTok動画をスクレイピングする」という言葉が何を意味するのかを整理しておきましょう。というのも、この表現はまったく異なる2つの作業を指すからです。
- 動画のメタデータを抽出する:キャプション、ハッシュタグ、いいね数、コメント数、シェア数、再生数、投稿日時、投稿者情報など。多くのチュートリアルはここに焦点を当てています。
- 実際の動画ファイル(.mp4)をダウンロードする:動画そのものを手元に保存すること。これは「TikTok動画をスクレイピング」と検索する人の本当にやりたいことであることが多いのですが、ほとんどの解説では触れられません。
このガイドでは両方を扱います。以下のどの方法でも、メタデータを取得できるだけでなく、.mp4ファイルを保存するために必要なダウンロードURLも取り出せます。
なぜPythonでTikTok動画をスクレイピングするのか?
1ユーザーあたり1日約 、TikTok Shopが世界での広告収益を生み出していることを考えると、TikTokデータを活用するビジネス上の意義は非常に大きいです。よく見かける用途は次のとおりです。
| ユースケース | 取得するデータ | 対象ユーザー | |---|---|---| | インフルエンサー/マーケティング調査 | エンゲージメント率、フォロワー数、コンテンツ形式、ハッシュタグの反応 | マーケティングチーム、代理店 | | コンテンツ戦略 | トレンドのハッシュタグ、バズりやすい動画形式、投稿頻度 | クリエイター、SNS運用担当 | | ブランドモニタリング | 言及、キャンペーン到達率、オーディエンスの感情傾向 | ブランドマネージャー、PRチーム | | 競合分析 | 競合動画の成果、広告クリエイティブ、TikTok Shop掲載商品 | EC担当、プロダクトチーム | | 市場調査 | 新興トレンド、ユーザー行動、商品発見の流れ | アナリスト、ヘッジファンド、調査会社 | | アーカイブ/コンプライアンス | 社内確認や記録保管用の動画ファイル | 法務、コンプライアンス、代理店 |
商業的なインパクトも現実的です。米国のTikTok広告収益は2026年に234億ドル規模と予測されており、アフィリエイト系クリエイターは主要なTikTok Shopカテゴリでを生み出しています。ECやインフルエンサーマーケティングに携わるなら、このデータには直接的な金銭価値があります。
なぜ基本的なPythonコードはTikTokで失敗するのか
すでにこんなコードを試して何も取れなかったなら、あなただけではありません。
1import requests
2from bs4 import BeautifulSoup
3resp = requests.get("https://www.tiktok.com/@someuser")
4soup = BeautifulSoup(resp.text, "html.parser")
5# ...でもHTML内に使えるデータが何もない
理由は単純です。TikTokはスクレイピングが特に難しいプラットフォームの一つだからです。素の requests.get() では、実際の内容がブラウザ上でJavaScript描画されるため、ほとんど空のHTMLシェルしか返りません。さらにTikTokは、行動検知、TLSフィンガープリンティング、リクエスト署名を生成する、予告なく変わる動的CSSセレクタなど、強力なボット対策を導入しています。

Impervaの2025 Bad Bot Reportによると、2024年に自動化トラフィックが初めて人間によるトラフィックを上回り、ボットは今やインターネットトラフィック全体のを占めています。TikTokもこの状況を十分把握しており、それに応じた防御を構築しています。
何が問題なのかを見極めて適切な方法に飛べるよう、簡単な診断表を用意しました。
| 症状 | 考えられる原因 | 解決する方法 |
|---|---|---|
| 空のHTML / データなし | JavaScript描画の内容;requests はJavaScriptを実行できない | 方法1(隠しJSON)または方法3(Playwright) |
| 403 / アクセス拒否 | ヘッダー不足または不正;ボット検知 | 適切なヘッダーを付けた方法1 |
| 最初は動くが、その後止まる | レート制限 / IPブロック | プロキシローテーション(全手法) |
| ログイン壁が出る | セッション/Cookie必須 | 方法3(保存済みセッションのあるブラウザ) |
| ChatGPT生成コードが何も返さない | TikTokの構造がモデル学習時点から変わっている | 3つすべて(最新手法) |
レート制限の閾値は、ソフトブロックやCAPTCHAが出始める前の段階で、IPあたりおおむね1分30〜60リクエスト程度です。データセンターIPは数分で弾かれやすく、ある程度の件数を扱うなら住宅用またはモバイルプロキシがほぼ必須です。
概要:PythonでTikTok動画をスクレイピングする3つの方法
まず全体像です。各方法にはトレードオフがあり、ここでは3つとも実用コード付きで紹介します。
- 隠しJSONの抽出 — TikTokページ内に埋め込まれた
__UNIVERSAL_DATA_FOR_REHYDRATION__スクリプトタグを解析します。最速・最小構成で、ブラウザ不要です。 - TikTok内部APIの利用 — 非公開の
/api/post/item_list/エンドポイントを直接叩き、カーソルベースのページネーションで一括取得します。 - Playwrightによるブラウザ自動化 — ヘッドレスブラウザでページを描画し、無限スクロール、動的コンテンツ、ログイン壁に対応します。
3つの方法すべてで、実際の.mp4動画ファイルのダウンロードURLも取得できます。ダウンロード方法は、各手法の解説のあとに専用セクションで詳しく説明します。最後には比較表もあるので、納得感を持って選べます。
方法1:隠しJSONでTikTok動画をスクレイピングする(初心者向け)
まず最初に試すべきなのはこの方法です。TikTokはほぼすべてのページ読み込み時に、__UNIVERSAL_DATA_FOR_REHYDRATION__ というIDの <script> タグ内へ巨大なJSONブロブを埋め込んでいます。このJSONには、フロントエンドJavaScriptが本来描画するプロフィール情報や動画データがすべて含まれています。つまり、ブラウザなしでHTTPリクエスト1回だけで取得できるということです。
必要なもの
- Python 3.8以上
requests(またはhttpx)beautifulsoup4(またはparsel)- 適切なヘッダー:
User-Agent、Referer、Accept-Language
依存関係をインストールします。
1pip install requests beautifulsoup4
ステップごとに解説:スクリプトタグからTikTok動画データを抽出する
ステップ1:実在のブラウザらしいヘッダーでGETリクエストを送る。
ここでつまずく初心者が非常に多いです。ヘッダーなしの requests.get() を送ると、TikTokは403かCAPTCHAページを返します。最低でも、最新のブラウザ由来の User-Agent と Referer が必要です。
1import requests
2from bs4 import BeautifulSoup
3import json
4url = "https://www.tiktok.com/@charlidamelio"
5headers = {
6 "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",
7 "Referer": "https://www.tiktok.com/",
8 "Accept-Language": "en-US,en;q=0.9",
9}
10resp = requests.get(url, headers=headers)
ステップ2:HTMLを解析し、対象のhydration用スクリプトタグを見つける。
1soup = BeautifulSoup(resp.text, "html.parser")
2script_tag = soup.find("script", id="__UNIVERSAL_DATA_FOR_REHYDRATION__")
script_tag が None の場合、TikTokにブロックされたか(ステータスコードを確認)、もしくはタグIDが変更された可能性があります(頻度は低いですが起こりえます)。
ステップ3:スクリプトの中身をJSONとして読み込む。
1data = json.loads(script_tag.string)
ステップ4:JSON構造をたどって動画メタデータを抽出する。
構造は __DEFAULT_SCOPE__ の下にネストされています。ユーザープロフィールページなら次のようになります。
1user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
2user_info = user_detail["userInfo"]
3# プロフィール統計
4stats = user_info["stats"]
5print(f"Followers: {stats['followerCount']}, Likes: {stats['heartCount']}")
6# 動画一覧(最初のページの動画)
7item_list = user_detail.get("itemList", [])
8for video in item_list:
9 print(video["desc"]) # キャプション
10 print(video["stats"]["playCount"]) # 再生数
11 print(video["video"]["playAddr"]) # 動画ダウンロードURL(ウォーターマークなし)
12 print(video["video"]["downloadAddr"]) # 動画ダウンロードURL(ウォーターマークあり)
ステップ5:動画のダウンロードURLを取り出す。
playAddr は通常、よりきれいな動画版(多くの場合、TikTokのウォーターマークが重ならない版)を返します。一方 downloadAddr は標準ウォーターマーク付きです。どちらも.mp4ファイルへの直接URLですが、ダウンロード時には特定のヘッダーが必要です(詳細は後半のダウンロードセクションで解説します)。
これで、各動画のキャプション、統計情報、作成時刻、ハッシュタグ(challenges[] と textExtra 内)、そして動画の直接URLを含むメタデータ一覧が取れるはずです。
隠しJSON方式の制限
- 初回ページ読み込み分しか取得できない — 通常はプロフィールの最初の約30本まで
- 無限スクロールやページネーションには非対応(「次のページ」をリクエストする仕組みがない)
- TikTokがスクリプトタグIDやJSON構造を変更すると壊れる(頻度は低いですが起こりえます。早期検知には が役立ちます)
- 向いている用途:短時間のプロフィール取得、単発のデータ抽出、最新動画だけ欲しい場合
方法2:内部API経由でTikTok動画をスクレイピングする
TikTokのフロントエンドは、動画を一度にすべて読み込むわけではありません。スクロールに応じて、内部APIエンドポイントへXHRを送っています。ユーザー動画の主要エンドポイントは /api/post/item_list/ です。これをPythonから直接呼べば、カーソルベースのページネーションが使え、プロフィール内のすべての動画にアクセスできます(最初のページだけではありません)。
内部APIエンドポイントの見つけ方
TikTokのプロフィールページでChrome DevToolsを開き、NetworkタブでXHRに絞り込み、下へスクロールしてください。次のようなURLへのリクエストが表示されます。
1https://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 を取得する。
方法1の隠しJSON、またはプロフィールページのHTMLから取得できます。
ステップ2:APIリクエストを組み立てて送る。
1import requests
2import json
3sec_uid = "MS4wLjABAAAA..." # 方法1から取得
4api_url = "https://www.tiktok.com/api/post/item_list/"
5params = {
6 "aid": "1988",
7 "secUid": sec_uid,
8 "count": 35,
9 "cursor": 0,
10}
11headers = {
12 "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",
13 "Referer": "https://www.tiktok.com/",
14}
15resp = requests.get(api_url, params=params, headers=headers)
16data = resp.json()
ステップ3:レスポンスを解析する。
data["itemList"] の各項目には、方法1と同じ動画構造が入っています。desc、stats、video.playAddr、video.downloadAddr などです。
ステップ4:すべての動画をページネーションで巡回する。
1all_videos = []
2cursor = 0
3has_more = True
4while has_more:
5 params["cursor"] = cursor
6 resp = requests.get(api_url, params=params, headers=headers)
7 data = resp.json()
8 items = data.get("itemList", [])
9 all_videos.extend(items)
10 has_more = data.get("hasMore", False)
11 cursor = data.get("cursor", 0)
12 print(f"Fetched {len(items)} videos, total: {len(all_videos)}, hasMore: {has_more}")
13print(f"Total videos scraped: {len(all_videos)}")
各ループで次のバッチと新しいカーソルが返ります。hasMore が False になるまで繰り返します。
内部API方式の制限
- TikTokはこれらのエンドポイントや必須パラメータを頻繁に変更するため、最も保守コストが高い方法です。最近では、
msToken、X-Bogus、あるいはTikTokのが生成する他の署名パラメータを要求するリクエストも出てきています(ちなみに、純粋なPythonでこれを再現するのはかなり難しいです)。 - 一部のデータ型ではセッションCookieや追加トークンが必要になる場合があります
- IPベースのレート制限は依然としてあるため、プロキシローテーションを推奨します
itemListが空配列になり始めたら、msTokenが古い可能性が高いです(ブラウザ内ではおよそ10秒ごとに更新されます)- 向いている用途:プロフィール内の全動画を含めた大量データ抽出、方法1の「最初のページだけ」という制限では足りない場合
方法3:PlaywrightでTikTok動画をスクレイピングする(ブラウザ自動化)
最初の2つの方法で壁にぶつかったとき――ログイン必須、CAPTCHA、あるいは再現できない署名パラメータ――に使うのがPlaywrightです。本物の(ヘッドレス)ブラウザを起動し、人間のユーザーのようにTikTokへアクセスするため、JavaScript描画、無限スクロール、認証済みセッションにも対応できます。
TikTokスクレイピング用にPlaywrightをセットアップする
Playwrightとブラウザバイナリをインストールします。
1pip install playwright
2playwright install firefox
TikTokのスクレイピングでは、ChromiumよりFirefoxをおすすめします。コミュニティテストでは一貫してことが示されており、TikTokのボット検知は特にChromium系のヘッドレスブラウザに対して厳しいからです。
さらに秘匿性を高めるなら、(Playwrightの改変フォーク)や(C++レベルで改変されたFirefox)と組み合わせるのも有効です。では、Camoufoxは主要なボット検知サービスに対してほぼ完璧なステルススコアを達成しています。
ステップごとに解説:PlaywrightでTikTokプロフィール動画をスクレイピングする
ステップ1:ヘッドレスFirefoxを起動し、プロフィールへ移動する。
1import asyncio
2from playwright.async_api import async_playwright
3import json
4async def scrape_tiktok_profile(username):
5 async with async_playwright() as p:
6 browser = await p.firefox.launch(headless=True)
7 context = await browser.new_context(
8 user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0",
9 viewport={"width": 1280, "height": 720},
10 )
11 page = await context.new_page()
12 await page.goto(f"https://www.tiktok.com/@{username}", wait_until="networkidle")
ステップ2:動画グリッドが読み込まれるまで待つ。
1 # 動画アイテムが表示されるのを待つ
2 await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
TikTokで「Something went wrong」のオーバーレイが出る場合は、再試行ボタンをクリックする必要があるかもしれません。
1 retry_btn = page.locator('button:has-text("Retry")')
2 if await retry_btn.count() > 0:
3 await retry_btn.click()
4 await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
ステップ3:Playwrightでも、隠しJSONからデータを取る。
最も安定しているのは、ブラウザを使っていてもhydration JSONを取得する方法です。
1 script_el = page.locator("#__UNIVERSAL_DATA_FOR_REHYDRATION__")
2 raw_json = await script_el.inner_text()
3 data = json.loads(raw_json)
4 # 方法1と同じJSONのたどり方
5 user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
6 videos = user_detail.get("itemList", [])
ステップ4:さらに多くの動画が必要なら無限スクロールに対応する。
最初の約30本以上が必要な場合は、下へスクロールし、追加で読み込まれるXHRレスポンスを捕捉します。
1 all_videos = list(videos)
2 # スクロール中のAPIレスポンスをインターセプト
3 api_responses = []
4 async def capture_response(response):
5 if "/api/post/item_list" in response.url:
6 try:
7 body = await response.json()
8 api_responses.append(body)
9 except:
10 pass
11 page.on("response", capture_response)
12 # 下へスクロールして追加読み込みを発生させる
13 for _ in range(5): # 必要に応じてスクロール回数を調整
14 await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
15 await asyncio.sleep(2)
16 # インターセプトしたレスポンスから動画を集める
17 for api_resp in api_responses:
18 items = api_resp.get("itemList", [])
19 all_videos.extend(items)
20 print(f"Total videos: {len(all_videos)}")
21 await browser.close()
22 return all_videos
23# 実行
24videos = asyncio.run(scrape_tiktok_profile("charlidamelio"))
これで、初回ページ読み込み分と、スクロールで追加読み込みされた分の両方を含む動画オブジェクト一覧が手に入ります。
Playwright方式の制限
- 圧倒的に遅い方法(ページ全体の描画、ネットワーク往復、スクロール待ちが必要)
- リソース消費が大きい — ブラウザインスタンスごとにメモリとCPUをかなり使う
- 大規模運用ではIPブロックの対象になる — プロキシローテーションと併用すること
- 向いている用途:複雑な操作、ログイン壁のあるコンテンツ、CAPTCHA対応、または方法1・2がブロックされる場合
PythonでTikTok動画(.mp4)をダウンロードする方法
ここは、他のTikTokスクレイピング解説がほぼ必ず抜け落としている最大の空白を埋めるセクションです。メタデータの抽出は便利ですが、「TikTok動画をスクレイピング」と検索する人の多くは、実際には動画ファイルそのものが欲しいはずです。
TikTokは動画データオブジェクトの中にダウンロードURLを埋め込んでいます。
playAddr— 通常はウォーターマークなし、またはウォーターマークの少ない版downloadAddr— TikTokがアプリ内ダウンロード用として意図した版(TikTokのウォーターマーク付き)
どちらのURLも有効期限が短く、数時間ほどで失効することが多いため、抽出後はできるだけ早くダウンロードする必要があります。
ステップごとに解説:TikTok動画ファイルをダウンロードする
ステップ1:上の3つの方法のいずれかで動画URLを取得する。
1video_url = video["video"]["playAddr"] # ウォーターマークなし版
2# または
3video_url = video["video"]["downloadAddr"] # ウォーターマークあり版
ステップ2:適切なヘッダーでGETリクエストを送る。
ここで多くの人がつまずきます。単に requests.get(video_url) すると403になります。TikTokは Referer ヘッダーをチェックし、ブラウザらしい User-Agent を期待しています。
1import requests
2headers = {
3 "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",
4 "Referer": "https://www.tiktok.com/",
5}
6resp = requests.get(video_url, headers=headers, stream=True)
ステップ3:レスポンス内容を.mp4ファイルとして保存する。
stream=True を使い、チャンクごとに書き込みます。TikTok動画は大きいことがあるため、ファイル全体をメモリに載せないほうが安全です。
1video_id = video["id"]
2filename = f"tiktok_{video_id}.mp4"
3with open(filename, "wb") as f:
4 for chunk in resp.iter_content(chunk_size=1024 * 1024): # 1MB単位
5 if chunk:
6 f.write(chunk)
7print(f"Downloaded: {filename}")
これで、ローカルマシン上で再生可能な.mp4ファイルが保存されます。
ウォーターマークありとなしの違い
TikTokは、各動画のウォーターマーク版と非ウォーターマーク版の両方を保存しています。playAddr はたいていよりクリーンな版(プレイヤーが使用する版)を返し、downloadAddr は投稿者のユーザー名が入ったTikTokのウォーターマーク付きです。
倫理面について一言。ウォーターマークは投稿者のクレジットを示すためのものです。調査、分析、社内確認のために動画を保存するなら、playAddr を使うのは一般的に問題ありません。ただし、コンテンツを再配布したり再投稿したりする場合は、クレジットを消すことが倫理的にも著作権的にも問題になります。詳細は後述の法的セクションを参照してください。
より堅牢なダウンロード処理を組みたいなら、 も検討に値します。TikTok用の抽出機能が署名計算とURL解決を自動で処理してくれるので、ヘッダーやトークン期限を自分で管理する必要がありません。
比較:どのPython手法を使うべきか?
TikTokスクレイピングを始めた頃の自分にあればよかった、と思う比較表がこちらです。
| 比較項目 | 方法1:隠しJSON | 方法2:内部API | 方法3:Playwright |
|---|---|---|---|
| 難易度 | 初心者向け | 中級者向け | 中級者向け |
| 速度 | 速い(ページごとに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(自前) | 中級以上 | 無料(+プロキシ費用) | 高い(スクリプトが壊れやすい) | 完全な制御、独自パイプライン | | (Chrome拡張) | 初心者 | 無料プランあり | なし(AIが毎回サイトを読み直す) | 素早い動画データ抽出、Sheets/Excel出力 | | Apify TikTok Scraper | 初心者 | 有料(実行ごと課金) | 低い(Apifyが保守) | 定期実行の一括自動化 | | TikAPI | 開発者向け | 有料サブスクリプション | 中 | TikTokデータを使ったアプリ開発 |
ThunderbitでTikTokスクレイピングを行う仕組み
はThunderbitが提供するAIウェブスクレイパーで、従来のスクレイピングツールとは動き方が違います。あらかじめ用意されたCSSセレクタやXPathルール(TikTokがレイアウトを変えるたびに壊れるもの)に依存せず、ThunderbitのAIは毎回ページ構造を読み取り、キャプション、いいね数、ハッシュタグ、動画URL、投稿者など、関連する列を提案します。
実際の作業はたった2クリックです。
- ChromeでTikTokのプロフィールを開き、Thunderbit拡張機能をクリックして「AIで項目を提案」を押します。Thunderbitがページを解析し、表の構造を提案します。
- 提案された列を確認し、必要なら調整して「スクレイプ」をクリックします。
データはGoogle Sheets、Excel、Airtable、Notionに直接エクスポートできます。CSSセレクタの保守も、コードのデバッグも、プロキシ設定も不要です。数件のプロフィールから動画メタデータを集めたいマーケティングアナリストにとっては、Python環境を整えるより明らかに速く、TikTokのフロントエンド更新(コミュニティ報告ベースでは数週間おきに起こります)でも壊れません。
Thunderbitはにも対応しており、各動画ページを個別に訪問して、コメント数の詳細、音楽情報、動画の長さなどを加えてデータ表を充実させることもできます。
から無料で試せます。仕組みの詳細は、もチェックしてください。
TikTokスクレイピングにおける法的・倫理的な注意点
このテーマで上位に出てくるチュートリアルのほとんどは合法性について触れていませんが、TikTokがスクレイピングサービスに対して実際に法的措置を取っていることを考えると、これはかなり大きな抜けです。知っておくべきポイントをまとめます。
TikTokの利用規約(§ 4.1) は、自動アクセスを明確に禁止しています。利用規約違反は契約違反であって犯罪ではありませんが、アカウント停止、IPブロック、民事訴訟につながる可能性があります。
公開データに関する法的環境は、一般に思われているほど厳しくありません。 代表的な先例は Meta Platforms v. Bright Data(N.D. Cal., 2024年1月)で、ログアウト状態で公開データをスクレイピングすることは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ファイルをダウンロードする手順まで説明している点が特徴です。
- 非技術者向けには、 のほうが、コードを書くことも保守することもなく、同じデータへより速く到達できる現実的な手段です。AIベースのアプローチなので、TikTokのレイアウト変更でも壊れません。コミュニティ報告を見る限り、それは誰も望まないほど頻繁に起きています。
Pythonのセットアップなしですぐ始めたいなら、。無料プランだけでも、いくつかのプロフィールで試してワークフローに合うか確認できます。Pythonで進める場合は、まず方法1から始めてデータを検証し、必要に応じて拡張していくのがおすすめです。
Webスクレイピングのテクニックをもっと深く学びたい方は、、、 もご覧ください。
FAQ
PythonでTikTok動画をスクレイピングするのは合法ですか?
公開アクセス可能なデータのスクレイピングは、明確な違法行為というより法的にグレーな領域です。Meta v. Bright Data(2024年)の判断は、ログアウト状態で公開データを取得することがプラットフォームの利用規約に違反しないという立場を後押ししています。ただし、TikTokの利用規約は自動アクセスを明確に禁じており、個人データにはGDPR/CCPAの義務も関係します。多くの人が心配するほど即違法というわけではありませんが、リスクがないわけでもありません。具体的な用途については法律の専門家に相談してください。
TikTokスクレイピングに最適なPythonライブラリは何ですか?
アプローチによって異なります。隠しJSON抽出(方法1)なら、requests と beautifulsoup4 で十分です。内部API呼び出し(方法2)なら requests か httpx が使えます。ブラウザ自動化(方法3)なら、現在の標準は playwright です。新規スクレイピング案件での採用はSeleniumを上回っており、 を記録しています。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)は実ブラウザのセッションを模倣するため、ブロック耐性が最も高いです。本格的に大量取得するなら、プロキシ費用を見込んでおきましょう。主要プロバイダーの入門価格帯の住宅用プロキシは、 です。