TikTokの投稿と動画メトリクスをPythonでスクレイピングする方法
Senior Web Scraping Engineer
TL;DR:
- TikTokビデオスクレイパーは既知の公開アカウントから始まります。
scraper.tiktok.user.detailでユーザー名を解決し、次にそのsec_uidをscraper.tiktok.user.workに渡します。 - 投稿応答は制限されたサンプルです。 ドキュメント化されたリクエストは
cursorとcountを受け入れますが、1つの応答はクリエイターの完全な投稿履歴として記述されるべきではありません。 - 公開投稿メトリクスにはコンテキストが必要です。 再生、いいね、コメント、共有、収集、再投稿数の横に収集時間を保存する必要があります。これらの値は変化する可能性があるからです。
- 写真投稿とオプションフィールドには寛容な解析が必要です。 有効なアイテムにはメディアや字幕フィールドが空である場合があり、投稿タイプは仮定ではなく返されたレコードから取得すべきです。
- 安定したエクスポートは識別子を文字列として保持します。 生のJSONを保存し、分析用に正規化されたCSVを書き出します。
- 開始は無料です。 新しいScrapelessアカウントには無料のクレジットが含まれています。Scrapelessダッシュボードでアカウントを作成しましょう。
はじめに:投稿リストは時間スタンプ付きサンプルです
クリエイターの公開フィードは識別子、キャプション、メディアメタデータ、ハッシュタグ、音楽、および累積エンゲージメント数を混ぜ合わせています。そのフィードを有用なテーブルに変えるには、2つのAPI呼び出しと少しの注意深い正規化が必要です。
このガイドは、既知のアカウントのためのTikTokビデオスクレイパーを構築します。アカウントのsec_uidを解決し、公開投稿の制限されたセットを要求し、各アイテムごとに1行のCSVを書き出します。このワークフローは、最初の応答を完全なアーカイブとしてラベル付けせず、公開再生数をユニークリーチとして扱いません。
利用可能なプロフィール、投稿、およびShopのアクターのマップについては、TikTok Scraper APIガイドをお読みください。
既知のアカウントから収集できるもの
scraper.tiktok.user.workアクターは、指定されたsec_uidに対してitems配列を返します。投稿アイテムには、そのIDとURL、説明、ステッカーテキスト、作成時間、公開エンゲージメント数、メディアの詳細、ハッシュタグ、言語、ピン留めおよび広告フラグ、音楽、字幕、権限、およびプロフィールコンテキストが含まれる場合があります。
その形状は、いくつかの実用的な出力をサポートします:
- 選択された公開アカウントの投稿インベントリ
- 説明、ハッシュタグ、日付、および投稿URLのテーブル
- 特定の時点でのエンゲージメントスナップショット
- ピン留めされた、プロモーションまたはeコマース関連の投稿のレビューキュー
- 後のコンテンツ分類のためのクリーンな入力テーブル
アクターは、コメントテキスト、オーディエンスの人口統計、フォロワーリスト、ユニークビューア、コンバージョン、または収益配分を文書化していません。それらのフィールドは、推測による代替物として正規化された出力に現れるべきではありません。
TikTokスクレイパーAPIを使用する理由
管理されたアクターは、安定したHTTPリクエストから構造化されたJSONを返します。呼び出し元は、レンダリングされたページのセレクタを維持するのではなく、名前付きフィールドを使用して作業し、メディア特有のレイアウトを処理したり、すべての視覚的変化をパーサーの更新に翻訳したりする必要がありません。
リクエストには明確なスコープが必要です。TikTok投稿スクレイパーは、ユーザーによって選択されたアカウントから始まり、サンプルが収集された時刻を記録し、各行を監査するために十分なソースコンテキストを保持する必要があります。HTTP交換は、RFC 9110で定義された意味論に従い、PythonのJSONドキュメントは、以下で使用されるシリアル化について説明しています。
前提条件
- ScrapelessダッシュボードからのScrapelessアカウントとAPIトークン
- 標準ライブラリを持つPython 3
- 調査するアカウントの公開ユーザー名
- 許可された目的、定義されたサンプルサイズ、および保持ポリシー
- 以下のコードブロック用のライブAPIトークン。
SCRAPELESS_API_KEYとしてエクスポートします。
例は前提条件のギャップとしてマークされています。この記事にはAPIトークンが埋め込まれていません。これは完全なリクエストパスですが、読者は自分自身の資格情報とターゲットユーザー名を提供する必要があります。
TikTok投稿スクレイパーの動作
ワークフローは1つのエンドポイントと2つのアクターを使用します:
POST https://api.scrapeless.com/api/v1/scraper/request
unique_idをscraper.tiktok.user.detailに送信します。- プロファイル応答から
sec_uidを読み取ります。 - その値を制限された
countを持つscraper.tiktok.user.workに送信します。 - 不足しているフィールドを発明することなく、返された
itemsを正規化します。
TikTokの公式開発者ドキュメントでは、アカウント認可されたビデオのリスト化を専用のビデオリスト操作に分けています。これは、アイデンティティの解決とコンテンツ取得が異なるステップであることを思い出させる便利なリマインダーです。最初のパーティインターフェースについては、TikTokのビデオリストのドキュメントを参照してください。
リクエストパラメータ
プロファイルアクターはunique_idを必要とし、前頭の@なしで書かれています。その応答には、公共のプロファイルフィールドおよび統計と共にaccount_id、unique_id、およびsec_uidを含むことができます。
ポストアクターはsec_uidを必要とします。また、cursorを文字列として、countを正の整数として受け入れます。文書化されたデフォルトは"0"と35です。文書はカーソル入力を確認しますが、表示された応答は普遍的な継続フィールドや完全な履歴保証を設定しません。
curlを使ったクイックキャプチャ
この最初のリクエストは、投稿者アクターに必要なアカウントIDを解決します。
注: 以下のコードは、
SCRAPELESS_API_KEYの生のScrapeless APIトークンと、読者によって選択された公共のユーザー名を必要とします。
bash
curl --request POST 'https://api.scrapeless.com/api/v1/scraper/request' \
--header "x-api-token: ${SCRAPELESS_API_KEY}" \
--header 'content-type: application/json' \
--data '{
"actor": "scraper.tiktok.user.detail",
"input": {"unique_id": "tiktok"}
}'
返されたsec_uidをscraper.tiktok.user.workリクエストにコピーするか、Pythonプログラムが両方の呼び出しを実行させてください。
応答エンベロープ
ポスト応答にはitems配列が含まれています。各要素を観測された公共のポストレコードの一つと見なします。表を作成する際に便利な以下のグループがあります:
| グループ | 例のフィールド | 正規化ルール |
|---|---|---|
| 身元 | ポストID、ポストURL | IDを文字列として保存し、ソースURLを保持 |
| コンテンツ | 説明、ステッカーテキスト、ハッシュタグ、言語 | 空のテキストと空のリストを保持 |
| 時間 | 作成日 | ソース値を保持し、別のコレクション時間を追加 |
| エンゲージメント | プレイ、いいね、コメント、シェア、コレクト、リポストカウント | スナップショットとして記録し、ユニークリーチではない |
| 形式 | メディア、写真またはビデオの詳細、字幕 | 空白を許可し、返されたアイテムを検査 |
| フラグ | ピン留め、広告、eコマースビデオ | 意図を割り当てずにブーリアンを保持 |
Scrapelessでスクレイピングを開始
Scrapelessでウェブスクレイピングと自動化ワークフローをパワーアップしましょう!
今日はサインアップして、$5の無料クレジットを手に入れましょう — クレジットカードは不要です。Scrapeless Dashboardで今すぐ無料クレジットを獲得しましょう。
PythonでのAPI統合
以下のプログラムはプロファイルを解決し、最初に文書化されたカーソルから最大20アイテムを収集し、生の応答を保存し、コンパクトなメトリクステーブルをエクスポートします。PythonのCSVモジュールドキュメントは、正規化されたファイルに使用されるライターについて説明しています。
注: 以下のコードは
SCRAPELESS_API_KEYの生のScrapeless APIトークンを必要とします。この外部資格情報がない場合、リクエスト部分の実行はできません。
python
import csv
import json
import os
from datetime import datetime, timezone
from urllib.request import Request, urlopen
ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"
TOKEN = os.environ["SCRAPELESS_API_KEY"]
USERNAME = os.environ.get("TIKTOK_USERNAME", "tiktok").lstrip("@")
def run_actor(actor, actor_input):
payload = json.dumps({"actor": actor, "input": actor_input}).encode()
request = Request(
ENDPOINT,
data=payload,
headers={
"x-api-token": TOKEN,
"content-type": "application/json",
},
method="POST",
)
with urlopen(request, timeout=60) as response:
return json.load(response)
profile = run_actor(
"scraper.tiktok.user.detail",
{"unique_id": USERNAME},
)
posts = run_actor(
"scraper.tiktok.user.work",
{"sec_uid": profile["sec_uid"], "cursor": "0", "count": 20},
)
collected_at = datetime.now(timezone.utc).isoformat()
items = posts.get("items") or []
with open("tiktok-posts-raw.json", "w", encoding="utf-8") as raw_file:
json.dump(posts, raw_file, ensure_ascii=False, indent=2)
fieldnames = [
"collected_at",
"account_unique_id",
"post_id",
"post_url",
"description",
"created_at",
"play_count",
"like_count",
"comment_count",
"share_count",
"collect_count",
"repost_count",
"is_pinned",
"hashtags",
]
with open("tiktok-post-metrics.csv", "w", newline="", encoding="utf-8") as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
for item in items:
writer.writerow({
"collected_at": collected_at,
"account_unique_id": profile.get("unique_id", USERNAME),
"post_id": str(item.get("id") or item.get("post_id") or ""),
"post_url": item.get("url") or item.get("post_url") or "",
"description": item.get("description") or "",
"created_at": item.get("create_time") or item.get("date") or "",
"play_count": item.get("play_count"),
"like_count": item.get("like_count"),
"comment_count": item.get("comment_count"),
"share_count": item.get("share_count"),
"collect_count": item.get("collect_count"),
"repost_count": item.get("repost_count"),
"is_pinned": item.get("is_pinned"),
"hashtags": "|".join(
str(tag.get("name", tag)) if isinstance(tag, dict) else str(tag)
for tag in (item.get("hashtags") or [])
),
})
print(f"Saved {len(items)} sampled post records for @{USERNAME}")
正規化器のフォールバックフィールド名は、1つのオプションキーがエクスポートをクラッシュさせるのを防ぎます。生のJSONを保持しておき、変換を後で修正できるようにしておきます。
写真投稿、固定フラグ、および空白のフィールドを解釈する
空白のビデオURLは、コレクションが失敗したことを証明するものではありません。TikTokは従来のビデオオブジェクトを超えるコンテンツフォーマットをサポートしており、オプションのメディア、音楽、または字幕フィールドは有効な応答で空白になることがあります。形式ラベルは返された構造に基づき、不完全な証拠の場合にはunknown状態を保持します。
ピン留めフラグは、コレクション時にプロファイル上の配置を示します。それはクリエイターがポストをいつピン留めしたか、なぜそれをピン留めしたか、またはスナップショット後にピン留めされたままだったかを確立するものではありません。
公共メトリクスにも同じ規律が適用されます。プレイカウントは、ポストと一緒に公開される累積プラットフォームカウンターであり、一意の人のカウントではありません。いいね、コメント、シェア、コレクション、およびリポストは、キャンペーンの帰属ではなく、可視的なインタラクションを示します。
カーソルとサンプルスコープを注意深く扱う
文書化されたリクエストはcursorを受け入れますが、利用可能な応答例はすべてのクライアントにコピーできる単一のページネーションルールを確認していません。生の応答と現在の文書が確認された継続値を提供しない限り、最初の応答を有界サンプルとして使用してください。
出力の傍にリクエストカーソル、要求されたカウント、返されたアイテムカウント、およびコレクション時間を記録します。これらの4つのフィールドがスコープを可視化します。また、「20の観測されたポスト」をラベルのない合計を通じて「すべてのポスト」に変換することを防ぎます。
防ぐべき一般的な問題
- ポストアクターに
unique_idを渡す。 まずプロフィールを解決し、そのsec_uidを使用します。 - 長いIDを数字に変換する。 アカウントと投稿識別子は文字列のままにしておきます。
- 欠落をゼロとして扱う。 空白のオプションのメトリックまたはメディアフィールドは、その意味が確立されるまで未知のままでなければなりません。
- 最初の応答を完全な履歴と呼ぶ。 カーソル、要求されたカウント、コレクション時間と共にサンプルとしてラベルを付けます。
- ソースURLを削除する。 ポストURLは、レビュアーが観測された公共のアイテムに戻るための直接のルートを提供します。
- 累積カウントと間隔成長の混合。 単一のスナップショットはレベルを提供しますが、差分には繰り返しタイムスタンプ付きのスナップショットが必要です。
Scrapelessは、俳優をScraping APIの下にパッケージ化します。プロダクションコレクションスケジュールを設定する前に、現在の価格ページを確認してください。
結論: 分析する前にサンプルを保存する
信頼できるTikTokビデオスクレイパーは、既知のアカウントを解決し、制限された投稿サンプルを要求し、平坦化する前に応答を保存します。役立つ出力はメトリクスCSV以上のもので、安定した文字列識別子、ソースURL、コレクションタイムスタンプ、生のJSON、範囲の正直な声明を含みます。
公開TikTok投稿メトリクスを収集する準備はできましたか?
Scrapeless DiscordまたはTelegramコミュニティに参加して、実装メモを比較してください。ワークフローをテストする準備ができたら、Scrapeless Dashboardにアカウントを作成してください。
FAQ
Q: TikTokビデオスクレイパーとは何ですか?
TikTokビデオスクレイパーは、サポートされている公開投稿フィールドを収集し、それらを構造化された形で返します。このガイドのワークフローでは、プロフィールアクターを使用してsec_uidを解決し、投稿アクターを使用してitemsサンプルを返します。
Q: TikTok投稿スクレイパーはアカウントからすべての投稿を取得できますか?
1つのアクターの応答は、すべての投稿として記述されるべきではありません。リクエストはcursorとcountの文書ですが、完全なカバレッジは検証済みの継続ルール、アカウントのアクセス可能な公開コンテンツ、および意図された範囲にわたる成功したコレクションに依存します。
Q: どのTikTokビデオメトリクスが利用可能ですか?
投稿アイテムには、公開再生、いいね、コメント、シェア、コレクト、再投稿のカウントが含まれる可能性があります。これらは時点的なカウンターであり、ユニークなリーチ、販売、またはキャンペーンの帰属を表すものではありません。
Q: 写真投稿はどのように処理すべきですか?
写真投稿は、返されたアイテムに存在するフィールドから解析する必要があります。メディアフィールドはヌル可能に保ち、従来のビデオフィールドが空だからといって、単に失敗したスクレイプと宣言しないようにしてください。
Q: ワークフローにはプロキシまたはブラウザパーサーが必要ですか?
管理されたアクターは、APIリクエストの背後でそのコレクションサーフェスを処理します。呼び出し側は有効な識別子を提供し、サンプルを制限し、応答を検証し、結果を責任を持って保存します。
Q: 公開TikTok投稿のスクレイピングは合法ですか?
合法性は管轄区、目的、データ、アクセス方法、および適用される条件に依存します。許可された使用のために必要な公開フィールドのみを収集し、保持を最小限に抑え、特定のプロジェクトについて法的アドバイスを求めてください。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



