TikTokデータをブロックされずにスクレイピングする方法
Advanced Data Extraction Specialist
主なポイント:
- TikTokは、ページ内にデータを送信し、その後XHRを通じて残りを補充します。 プロフィールと最初の投稿は
#__UNIVERSAL_DATA_FOR_REHYDRATION__JSONブロブに保存されています。コメントや深い投稿は、スクロールトリガーのXHRとしてネットワークからキャプチャされます。 - 地域はクリーンレンダリングに関わります。 一つの出口でタイムアウトする同じプロフィールが、別の出口からはすぐにレンダリングされます —
proxyCountryを固定し、セッションが水分補給XHRを受け取るのに十分なTTLを与えます。 - ネットワークから抽出します、セレクタを推測するのではなく。 ページがスクロールする際に
xhr/fetchの応答を聞き、TikTokがすでに返すJSONを解析します — 脆弱なDOMスクレイピングは行いません。 - TikTokは厳重にフィンガープリンティングを行うため、ブラウザは本物である必要があります。 Scrapeless Scraping Browserを実行することで — 住宅用出口を持つ検出回避Chromium — 水分補給が行われるのです。
- 1つのセッション、5つの表面。 プロフィール、投稿、コメント、検索、チャンネルはすべて、単一のクラウドセッションを介した同じレンダリング-抽出パターンに収束します。
- 無料で始められる。 新しいScrapelessアカウントには無料のScraping Browserランタイムが含まれています — app.scrapeless.comでサインアップしてください。
イントロダクション: TikTokはどこにデータを保持しているか
TikTokは、ウェブページを2段階でレンダリングします。初期HTMLは大きなJSONアイランドを持ち — <script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"> ブロブ — プロフィール、その統計、最初の投稿ページを保持しています。それ以降(スクロール時にさらに投稿、コメントスレッド、検索ページ)のすべては、ページが起動した後にXHRを介して取得されます。したがって、TikTokをスクレイピングするには2つのテクニックがあります: すでにあるデータのために水分補給JSONを読み取り、需要に応じてロードされるXHR応答をキャプチャします。
両方の段階は、TikTokが本物のブラウザが操作していると信じることに依存しています。プラットフォームは積極的にフィンガープリンティングを行い、通常のHTTPリクエストまたはデフォルトのヘッドレスブラウザは使用可能なデータのないシェルを取得します。レンダリングは単に完了しません。
このガイドは、Scrapeless Scraping Browserで実行されます — 住居プロキシと組み合わせた独自開発のChromiumを使用した検出回避クラウドブラウザ — CDPを介してPuppeteerに接続されます。以下のプロフィール抽出はライブでキャプチャされました。投稿とコメントのパターンは、同じレンダリング-ネットワークを読むアプローチを使用します。公的データのみを通じて。
これでできること
- クリエイタープロフィールを取得する — 自己紹介、認証、フォロワー/ハート/動画カウント — 水分補給JSONから。
- クリエイターの投稿を収集する キャプション、動画メタデータ、作成者、エンゲージメント統計を含む。
- コメントスレッドをスクレイピングする テキスト、いいね数、返信数、作成者のハンドルを含む。
- キーワード検索を実行し、結果フィードをキャプチャする。
- チャンネル/ハッシュタグフィードを歩く 同じスクロール-キャプチャループを使用して。
なぜScrapeless Scraping Browserなのか
Scrapeless Scraping Browserは、ウェブクローラーやAIエージェント向けに設計されたカスタマイズ可能な検出回避クラウドブラウザです。特にTikTok用に次のような機能を提供します:
- 独自開発のChromium — 本物のエンジンなので、水分補給JSONが人口され、XHRが発火します。
- 検出回避フィンガープリンティング — セッションは通常のブラウザとして読み取られるので、TikTokは空のシェルではなく本物のデータを提供します。
- 195か国以上の住宅用プロキシ — 国別に出口を固定して、ページをクリーンかつ一貫してレンダリングします。
- 構成可能なセッションTTL — スクロールトリガーのXHRが終了する前に到達するのに十分長くセッションを維持します。
- 標準的なPuppeteer接続 — SDKを使用してセッションを生成し、その後
puppeteer.connect()をCDP経由で呼び出します。抽出はプレーンなPuppeteerです。
無料プランでのAPIキーは、app.scrapeless.comで取得できます。
前提条件
- Node.js 18以上
- ScrapelessアカウントとAPIキー — app.scrapeless.comでサインアップ
- PuppeteerとJSONの基本的な理解
インストール
bash
npm install @scrapeless-ai/sdk puppeteer-core
bash
export SCRAPELESS_API_KEY="your_api_token_here"
ステップ1 — セッションを生成し、Puppeteerに接続する
SDKはクラウドセッションを生成し(プロキシ国とTTLを固定)、WebSocketエンドポイントを返します。PuppeteerはCDPを介してそれに接続します:
javascript
import { Scrapeless } from '@scrapeless-ai/sdk';
import puppeteer from 'puppeteer-core';
const client = new Scrapeless({ apiKey: process.env.SCRAPELESS_API_KEY });
const { browserWSEndpoint } = await client.browser.create({
proxyCountry: 'US', // 出口を固定 — 地域がページのレンダリングに影響
sessionTTL: 300, // 秒; 水分補給XHRが到達するのに十分長い
});
const browser = await puppeteer.connect({ browserWSEndpoint });
const page = await browser.newPage();
実際の経験からの注意: ある出口地域で繰り返しタイムアウトした同じプロフィールが、別の場所で初回の試行でレンダリングされました。レンダリングがハングした場合は、他のことに先立って proxyCountry を切り替えてください。
ステップ2 — 水分補給JSONからプロフィールをスクレイピングする
プロファイル、その統計、および最初の投稿は、ページがロードされるときにすでに #__UNIVERSAL_DATA_FOR_REHYDRATION__ スクリプトタグ内にあります。このノードを待ち、解析し、webapp.user-detail スコープを読み取ります:
javascript
await page.goto('https://www.tiktok.com/@oddanimalspecimens', {
waitUntil: 'domcontentloaded',
timeout: 120000,
});
await page.waitForSelector('#__UNIVERSAL_DATA_FOR_REHYDRATION__', { timeout: 60000 });
const userInfo = await page.evaluate(() => {
const el = document.getElementById('__UNIVERSAL_DATA_FOR_REHYDRATION__');
const data = JSON.parse(el.textContent);
return data.__DEFAULT_SCOPE__['webapp.user-detail'].userInfo;
});
console.log(userInfo.user.uniqueId, '—', userInfo.stats);
これにより、TikTokの独自のuserInfoオブジェクトがそのまま返されます — userオブジェクトとstatsオブジェクト。DOMのスクレイピングはなく、TikTokが自身のページをレンダリングするために提供したデータを読み取っています。
無料プランでAPIキーを取得: app.scrapeless.com
ステップ3 — XHRから投稿とコメントを取得
最初のページを超えた投稿とすべてのコメントスレッドは、ページが起動した後、スクロールすることでXHRとして到着します。パターンは、ナビゲートする前にresponseリスナーを追加し、取得をトリガーするためにスクロールし、その後JSONボディを解析することです:
javascript
const xhrCalls = [];
page.on('response', async (resp) => {
const rt = resp.request().resourceType();
if (rt !== 'xhr' && rt !== 'fetch') return;
try {
xhrCalls.push({ url: resp.url(), body: await resp.text() });
} catch { /* 一部のボディは読み取れないので、スキップ */ }
});
await page.goto('https://www.tiktok.com/@oddanimalspecimens', { waitUntil: 'domcontentloaded' });
// レイジーロードされた投稿/コメントをトリガーするためにスクロール
for (let i = 0; i < 5; i++) {
await page.evaluate(() => window.scrollBy(0, document.body.scrollHeight));
await new Promise((r) => setTimeout(r, 2000));
}
// アイテム/コメントリストエンドポイントをフィルタリングし、ボディをJSON.parse
const itemLists = xhrCalls.filter((c) => /\/api\/(post|comment)\//.test(c.url));
そこから、キャプチャされた各ボディをJSON.parseし、アイテムまたはコメントの配列を引き出します。これはプロファイルと同じレンダリング後にネットワークを読み取るアプローチですが、単一のハイドレーションブロブではなく、スクロールによって駆動されています。
受け取る内容
プロファイル抽出はTikTokのuserInfoオブジェクトを返します。以下の形状は、ライブ実行で生成されたものと正確に一致しています; カウントは実際のキャプチャであり、時間とともに変動します:
json
{
"user": {
"id": "...",
"uniqueId": "oddanimalspecimens",
"nickname": "Odd Animal Specimens",
"avatarLarger": "https://...",
"signature": "...",
"verified": false,
"secUid": "...",
"privateAccount": false
},
"stats": {
"followerCount": 4000000,
"followingCount": 9,
"heartCount": 78000000,
"videoCount": 179,
"diggCount": 0,
"friendCount": 6
}
}
// 形状はTikTokのuserInfoそのまま; "..."として表示される文字列フィールドは例示的なサンプルであり、カウントは実際のキャプチャであり、時間とともに変動します。
いくつかの率直な観察:
userオブジェクトは幅広い — TikTokは多数のフィールド(設定、secUid、関係フラグ)を含んでいます。必要な数個を読み取り、残りは無視します。heartとheartCountの両方が存在し、同じ合計を持ちます —heartCountを使用します。- カウントはスケールで丸められます。 大きなアカウントは、TikTokがUIで表示する方法と同様に、丸められた合計(例:4,000,000)を報告します。
- レンダリングに地域が重要です。データだけでなく、
proxyCountryを指定し、セッションに十分なTTLを持たせます。
結論:すべてのTikTok表面に共通するパターン
TikTokのスクレイピングは、ページにすでに存在するもののために#__UNIVERSAL_DATA_FOR_REHYDRATION__を解析し、スクロールでハイドレートされるもののためにXHRレスポンスをキャプチャすることに集約されます。プロファイル、投稿、コメント、検索、およびチャンネルはすべて、その単一のレンダリング・エクストラクトループのバリエーションです。Scrapeless Scraping Browserで実行することで、レンダリングが実現します — 検出防止のChromiumに加え、TikTokがリアルなデータを提供するための居住者の出口です。同じSDK-over-CDPパターンのeコマースバリアントについては、Etsyスクレイパーガイドを参照してください; Scraping Browser商品ページおよびドキュメントで、完全なSDKサーフェスをカバーしています。地域を指定し、スクロールが多いサーフェスのTTLを延長し、TikTokがすでに提供するJSONを読み取ってください。
AI駆動のデータパイプラインを構築する準備はできましたか?
無料プランを取得し、ソーシャルデータパイプラインを構築している開発者とつながるためにコミュニティに参加してください: Discord · Telegram。
無料のスクレイピングブラウザランタイムにサインアップするには、app.scrapeless.comに登録してください。そして、上記のパターンをあなたのワークフローに必要なプロファイル、クエリ、チャンネルに適応させてください。スケールについては料金をご覧ください。
よくある質問
Q: TikTokのスクレイピングは合法ですか?
公開されているデータの収集は一般的には許可されていますが、地域によってルールが異なり、TikTokの利用規約が適用されます。公開データのみをスクレイピングし、利用規約を確認し、使用ケースについて弁護士に相談してください。
Q: スクレイピングしても空のページが返ってくるか、タイムアウトします。なぜですか?
一般的な原因は二つあります:TikTokがあなたを通す出力リージョンと、ハイドレーションが完了する前にセッションが終了してしまうことです。proxyCountryを固定してください(レンダリングがハングする場合は切り替え)そしてsessionTTLを上げてください。
Q: プロキシは必要ですか?
はい。TikTokはIPの評判を重視しています;ページがレンダリングされ、XHRが発火するように、proxyCountryで住宅用出力を固定してください。
Q: 最初のページを超えて投稿を取得するにはどうすればいいですか?
ページをスクロールしてレイジーロードされたXHRリクエストをトリガーし、それをresponseリスナーでキャッチしてください。その後、JSONのボディを解析します — リハイドレーション・ブロブは最初のバッチのみを保持します。
Q: DOMマークアップが変更され、セレクタが壊れてしまいました。どうすればいいですか?
レンダリングされたグリッドをスクレイピングするのではなく、JSONソース — リハイドレーション・ブロブとXHRのボディ — に依存してください。これらは視覚的なマークアップよりもはるかに変化しません。必要なセレクタのみを再確認してください。
Q: TikTokに対していくつのワーカーを実行できますか?
同時実行を控えめに保ってください — ホストあたり数セッション — そうすればIPの評判信号がクリーンに保たれます。
Q: AIエージェントなしでこれを実行できますか?
はい。Scrapeless SDKとCDPの上にあるプレーンなPuppeteerです — エージェントは必要ありません。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



