TikTokの月間アクティブユーザー数は現在およそに達しており、クリエイターは毎日推定2,300万本もの動画を投稿しています。その洪水みたいなデータのほんの一部を取ろうとしただけでも、苦労したことがある人は多いはずです。
よくある流れはこんな感じです。「TikTok動画をPythonでスクレイピング」と検索して、チュートリアルのコードをコピペするか、ChatGPTに書かせて動かしてみる。でも返ってくるのは……何もなし。空っぽのHTML、403エラー、あるいはおなじみの「Process finished with exit code 0」で出力ゼロ。GitHubのIssueやRedditのスレッドで何度も同じ光景を見てきたので、このガイドをまとめました。2025年でもちゃんと使えるPythonの3つの方法を紹介し、実際の.mp4動画ファイルをダウンロードする手順まで、つまり多くの解説記事が触れない部分までしっかり解説します。さらに、用途に合った方法を選びやすいように比較表も用意しました。Pythonが不要な人向けに、 のようなノーコード代替手段も紹介します。たった2クリックほどで同じデータを取れます。
「TikTok動画をスクレイピングする」とは、実際には何を指すのか?
コードの話に入る前に、「TikTok動画をスクレイピングする」という表現が何を意味するのか整理しておきましょう。というのも、この言い方にはまったく違う2つの作業が含まれているからです。
- 動画メタデータの抽出: キャプション、ハッシュタグ、いいね数、コメント数、シェア数、再生数、投稿日時、投稿者情報など。多くのチュートリアルはここに重点を置いています。
- 実際の動画ファイル(.mp4)のダウンロード: 動画そのものを自分の端末に保存することです。検索で「TikTok動画をスクレイピング」と打つ人の多くが本当に欲しいのはこっちですが、ここまで扱う記事はほとんどありません。
このガイドでは両方をカバーします。以下の各方法では、メタデータを抽出できるだけでなく、.mp4ファイルを保存するために必要なダウンロードURLも取得できます。
なぜPythonでTikTok動画をスクレイピングするのか?
ことや、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/データなし | JSで描画されるため、requests ではJavaScriptを実行できない | 方法1(隠しJSON)または方法3(Playwright) |
| 403/アクセス拒否 | ヘッダー不足または不正、ボット検知 | 適切なヘッダーを付けた方法1 |
| 一度は動くが、その後止まる | レート制限/IPブロック | プロキシのローテーション(すべての方法) |
| ログイン壁が出る | セッション/Cookieが必要 | 方法3(保存済みセッション付きブラウザ) |
| ChatGPT生成コードが何も返さない | 学習データ以降にTikTokの構造が変わった | 3つすべての方法(最新の手法) |
レート制限の閾値は、IPあたり1分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
依存関係をインストールします。
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: TikTok内部API経由で動画をスクレイピングする
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 を取得する。
これは隠しJSON(方法1)またはプロフィールページの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) 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: 低レベルJSONからデータを抽出する(Playwrightでも同じ)。
ブラウザを使っていても、いちばん確実なのはやはり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方式の制限
- 圧倒的に遅い方法です(ページ全体の描画、ネットワーク往復、スクロール待ちが必要)
- リソース消費が大きい — ブラウザインスタンス1つでもメモリと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解決を自動でやってくれるので、ヘッダーやトークンの有効期限を自分で管理する必要がありません。
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が提供するAIウェブスクレイパーで、従来型のスクレイピングツールとは仕組みが違います。TikTokのレイアウトが変わるたびに壊れがちな既製のCSSセレクタやXPathルールに頼るのではなく、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(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ファイルをダウンロードする手順まで説明しています。
- 非技術系ユーザー には、 が、コードを書いたり保守したりせずに同じデータへたどり着く、より速い選択肢です。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)は、実ブラウザのセッションを模倣するため、最もブロックされにくい方法です。本格運用では、プロキシ費用を見込むべきです。主要プロバイダーのエントリーレベル住宅プロキシは、およそです。
- さらに学ぶ