インスタグラムをスクレイピングする方法:プロフィール、投稿、コメントなど
Advanced Data Extraction Specialist
TL;DR:
- Instagramは自社の内部JSON APIからレンダリングされる - 直接呼び出すこと。 プロフィールページは
web_profile_infoで水和され、投稿やコメントはGraphQLエンドポイントから取得される。そのJSONをレンダリングされたセッションの内部から取得する代わりに、DOMをスクレイピングする。 - API呼び出しが機能するためには2つの要素が必要:
x-ig-app-idヘッダーとページのクッキー。 まずinstagram.comを読み込んでセッションにクッキーを持たせ、その後、credentials: 'include'とapp-idヘッダーを使ってページ内からAPIをfetch()する。 - 地域と本物のブラウザはオプションではない。 InstagramはIPの評判とフィンガープリンティングを厳しく重視する; 一つの出口で停止する同じ呼び出しが別の出口からは正常に返ってくる。
proxyCountryを固定し、アンチデetectionブラウザで実行する。 - 戻ってくるのは構造化されたオブジェクトであり、HTMLではない。
web_profile_infoはフォロワー、フォロー中、投稿数、認証、自己紹介を含む完全なuserオブジェクトを返す - まさにInstagram自身のフロントエンドが消費する形式で。 - 1つのパターンがプロフィール、投稿、コメントをカバーする。 セッションを作成し、一致する内部エンドポイントにヒットし、JSONを解析する。表面的には変化するが、技術は変わらない。
- 始めるのは無料。 新しいScrapelessアカウントには無料のScraping Browserランタイムが含まれている — app.scrapeless.comでサインアップ。
はじめに: 自社APIからInstagramをスクレイピングする
Instagramのウェブページは内部JSONエンドポイントから水和されたReactシェルです。レンダリングされたDOMをスクレイピングするのは難しく、壊れやすい方法です - セレクタが変わり、ほとんどのデータは初期マークアップにも含まれていません。信頼性のある方法は、フロントエンドが呼び出すのと同じエンドポイントを< a href="https://datatracker.ietf.org/doc/html/rfc9110" rel="nofollow">呼び出すことです: プロフィールのためのweb_profile_info、投稿およびそのコメントのためのGraphQLクエリ。それらはきれいで構造化されたJSONを返します。
重要な点は、これらのエンドポイントは、Instagramウェブアプリから来たように見えるリクエストだけに応答するということです。これには3つの要素があります: リクエストにはx-ig-app-idヘッダーが含まれ、< a href="https://datatracker.ietf.org/doc/html/rfc6265" rel="nofollow">セッションのクッキーが含まれ、IPとInstagramが信頼するブラウザフィンガープリントに由来していることです。どれか1つが欠ければ、空のボディやチェックポイントを受け取ります。
このガイドは、PuppeteerをCDP経由で接続されたScrapeless Scraping Browserで実行されます - 住宅用出口を持つアンチデtection Chromium。まずinstagram.comをロードして実際のセッションを取得し、次にページの内部からそのAPIを呼び出します。以下のプロフィール抽出はリアルタイムでキャプチャされました。公開データのみ。
できること
- プロフィールを取得する - フォロワー、フォロー中、投稿数、認証、自己紹介、外部リンク。
- ショートコードによる単一投稿を取得する - メディア、キャプション、カウントを含む。
- 投稿のコメントを収集する - 作者、テキスト、いいねのカウント。
- ユーザーの投稿を辿る - タイムラインエンドポイントをページングする。
- 規模を拡大してプロフィールを強化する - ハンドルリスト上でプロフィール呼び出しをループする。
なぜScrapeless Scraping Browserなのか
Scrapeless Scraping Browserは、ウェブクローラーやAIエージェント向けに設計されたカスタマイズ可能なアンチデtectionクラウドブラウザです。特にInstagram向けには、次のことを提供します:
- 自己開発されたChromium - セッションを起動し、API呼び出しに必要なクッキーを保持する本物のブラウザ。
- アンチデetectionフィンガープリンティング - リクエストがInstagramウェブアプリとして読み取られるため、内部エンドポイントが応答し、チェックポイントを返すことはありません。
- 195カ国以上の住宅プロキシ - 国によって出口を固定; 正しい地域がクリーンな応答を得る要因です。
- 設定可能なセッションTTL - 複数のエンドポイント呼び出し間でセッションを生かしておくことができます。
- 標準のPuppeteer接続 - SDKでセッションを作成し、その後CDPを介して
puppeteer.connect(); 残りは普通の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 — セッションを作成し、Instagramをロードする
SDKがクラウドセッションを作成し、PuppeteerがCDPを介して接続します。最初にinstagram.comに移動することで、内部APIが期待するクッキーを持ったセッションを得ることができます:
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', // 出口を固定 — 地域がAPIの応答に影響を及ぼす
sessionTTL: 180,
});
const browser = await puppeteer.connect({ browserWSEndpoint });
const page = await browser.newPage();
javascript
await page.goto('https://www.instagram.com/', {
waitUntil: 'domcontentloaded',
timeout: 60000,
});
もし呼び出しが停止したり空のレスポンスを返す場合は、他のものを変更する前にproxyCountryを切り替えてください — 地域が最も一般的な原因です。
ステップ2 — web_profile_infoからプロフィールをスクレイピングする
セッションが温まったら、ページ内からプロファイルエンドポイントをfetch()してください。2つの重要な詳細は、x-ig-app-idヘッダーとcredentials: 'include'です(これにより、ページのクッキーが一緒に送信されます):
javascript
const user = await page.evaluate(async (username) => {
const res = await fetch(
`https://i.instagram.com/api/v1/users/web_profile_info/?username=${username}`,
{
headers: { 'x-ig-app-id': '936619743392459' }, // 公共のウェブアプリID
credentials: 'include',
},
);
const data = JSON.parse(await res.text());
return data.data.user;
}, 'nasa');
console.log({
username: user.username,
full_name: user.full_name,
verified: user.is_verified,
followers: user.edge_followed_by.count,
following: user.edge_follow.count,
posts: user.edge_owner_to_timeline_media.count,
});
// {
// username: 'nasa',
// full_name: 'NASA',
// verified: true,
// followers: 104420451,
// following: 91,
// posts: 4817
// }
これはInstagramの完全なuserオブジェクトをそのまま返します — 同じ構造がフロントエンドから表示されます。
無料プランでAPIキーを取得してください: app.scrapeless.com
ステップ3 — GraphQLからの投稿とコメント
個々の投稿とそのコメントはInstagramのGraphQLエンドポイントから取得されます。形は同じですが、投稿のショートコードをvariablesに持つPOSTです:
javascript
const shortcode = 'C1234567abc'; // instagram.com/p/<shortcode>/からのもの
const post = await page.evaluate(async (shortcode) => {
const variables = JSON.stringify({ shortcode });
// doc_idはウェブアプリが使用する永続的なGraphQLクエリを識別します
const body = `variables=${encodeURIComponent(variables)}&doc_id=YOUR_DOC_ID`;
const res = await fetch('https://www.instagram.com/graphql/query', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body,
credentials: 'include',
});
return JSON.parse(await res.text());
}, shortcode);
doc_idはInstagramのフロントエンドが送信する永続クエリIDです; 実際の投稿ビューのネットワークパネルから現在のものをキャプチャしてください。レスポンスからメディアオブジェクト(xdt_shortcode_media)を読み取って、キャプション、メディアURL、コメントエッジを取得します。
あなたが得られるもの
プロフィール呼び出しはInstagramのuserオブジェクトを返します。以下の形は実際のキャプチャです。カウントは時間とともに移動します:
json
{
"username": "nasa",
"full_name": "NASA",
"is_verified": true,
"is_private": false,
"biography": "Making the seemingly impossible, possible...",
"external_url": "https://...",
"edge_followed_by": { "count": 104420451 },
"edge_follow": { "count": 91 },
"edge_owner_to_timeline_media": { "count": 4817 }
}
// web_profile_infoからの実際のキャプチャ(@nasa)。完全なユーザーオブジェクトにはさらに多くのフィールドが含まれています; 必要なものを読み取ってください。
いくつかの誠実な観察:
userオブジェクトは大きいです。 ビジネスフラグ、AIエージェントフィールド、ハイライトカウントなどが含まれています — 必要なものをいくつか読み取り、残りは無視してください。- カウントは
edge_*.countにあります。 フォロワー、フォロー、投稿はそれぞれedge_followed_by、edge_follow、edge_owner_to_timeline_mediaの下にネストされています。 - プライベートアカウントはプロファイルの外観を返しますが、メディアは返しません。 投稿を期待する前に
is_privateを確認してください。 - 地域はヘッダーと同じくらい重要です。
proxyCountryを固定してください;不運な地域が空のボディの一般的な原因です。
結論:Instagramがすでに公開しているAPIを呼び出す
Instagramをクリーンにスクレイピングすることは、実際の温まったセッションから内部JSONエンドポイントを呼び出すことを意味します — プロフィールにはweb_profile_info、投稿とコメントにはGraphQLを使用します — x-ig-app-idヘッダーとページ自身のクッキー付きで。Scrapeless Scraping Browserを使用することで、これらの呼び出しに応答できるようになります:アンチ検出のChromiumと家庭用エグレスを使用し、Instagramはリクエストをその自社のウェブアプリとして扱います。他のソーシャルメディアで同じSDK-over-CDPパターンを見たい場合は、TikTokスクレイパーガイドを参照してください;Scraping Browser製品ページとドキュメントが完全なSDKサーフェスをカバーしています。地域を固定し、セッションを温め、アプリIDヘッダーを送信し、JSONを読み取ってください。
AI駆動のデータパイプラインを構築する準備はできましたか?
私たちのコミュニティに参加して、無料プランを取得し、ソーシャルデータパイプラインを構築している開発者とつながりましょう: Discord · Telegram。
app.scrapeless.com にサインアップして、無料のスクレイピングブラウザのランタイムを利用し、上記のパターンをあなたのワークフローに必要なプロフィール、投稿、ハッシュタグに適応させましょう。スケールについては料金をご覧ください。
よくある質問
Q: Instagramのスクレイピングは合法ですか?
公開されているデータを収集することは一般的に許可されていますが、Instagramの利用規約が適用され、ルールは地域によって異なります。公開データのみをスクレイピングし、利用規約を確認し、あなたの使用ケースについて弁護士に相談してください。
Q: プロフィールAPIが空のボディまたはチェックポイントを返すのはなぜですか?
通常、次の3つのうちの1つが原因です: x-ig-app-id ヘッダーが欠けている、セッションクッキーがない(instagram.comを最初に読み込むのをスキップした)、またはInstagramが信頼しない出力地域です。ヘッダーを送信し、credentials: 'include'を使用し、proxyCountryを指定してください。
Q: ログインする必要がありますか?
公開プロフィールと投稿については、Webアプリエンドポイントは匿名ですが、セッションが温められています。ログインした状態でのスクレイピングは異なる高リスクの方法であり、このガイドは公開データに留まっています。
Q: 投稿のdoc_idはどこから来るのですか?
それは、InstagramのフロントエンドがGraphQLに送信する永続化されたクエリIDです。実際の投稿ビューのネットワークパネルから現在の値を読み取ってください — 時間の経過とともに変化します。
Q: プロキシは必要ですか?
はい。InstagramはIPの評判を重視しています; 住宅の出力をproxyCountryで固定し、内部エンドポイントが応答するようにしてください。
Q: どれくらいのリクエストを行うことができますか?
控えめに — 地域ごとに数回のセッションと呼び出しの間に遅延を持たせて、IPの評判信号がクリーンに保たれるようにしましょう。
Q: AIエージェントなしで実行できますか?
はい。Scrapeless SDKとCDP上のプレーンPuppeteerで、エージェントは必要ありません。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



