公開プロフィールかポストを貼り付けてください。Web UnlockerがログインなしでXのページを返します。プロフィールならフォロワー数、自己紹介、最新のポスト5件、各ポストには正確ないいね数、リポスト数、返信数、表示回数が載っています。1,000ページで$0.98です。
無料リクエスト1,000件 · 課金は成功時のみ · 195以上の国 · Claude対応
チームについて簡単にご記入いただくと、次の内容をお届けします。
対象は公開ページで、ログインもXアカウントもX APIキーも不要です。ソーシャルリスニングチーム、代理店、ブランド、AIエージェントが読み取るのは次の2種類のページで、どれも1ページとして課金されます。





ご自身で試してみますか?無料リクエスト1,000件付きのAPIキーを入手しましょう。
Web Unlockerはポストのページを、正確な返信数、リポスト数、いいね数、表示回数を含めて1回だけ課金し、料金は1,000ページあたり$0.98です。ApifyのTwitterスクレイパーはポストのリンク1件ごとに$0.05、Bright Dataは1,000レコードあたり$1.50を課金します。
X APIはポスト1,000件で$5.00を課金します。
ここでは1,000件が$0.98です。
サービスが応答できなかったリクエストは無料です。テストでは最初の試行50件中6件ですぐに拒否が返りましたが、もう一度リクエストするとページが返りました。
Xのポスト1,000件の料金
いいね数、リポスト数、返信数、表示回数付きの公開ポスト1,000件、公開価格で
Gologin:1,000ページあたり$0.98で、ポスト1件が1ページです。Bright Dataはレコードごとに課金し、1,000件あたり$1.50です。X APIはポストの読み取り1件あたり$0.005を課金します。ApifyのTwitter Scraper Liteは、ポストのリンク1件ごとに$0.05、さらにポスト1件ごとに$0.0004を課金します。
ご自身のポストで実行しますか?APIキーと無料リクエストを入手しましょう。
X(Twitter)スクレイピングのテスト:ブランドとクリエイターのプロフィール20件、それぞれの新しいポスト1件ずつ、小規模なアカウント10件を、上のデモと同じく各最大3回までリクエストしました。返ってきた結果と、その速さは次のとおりです。
50件中44件が1回目で返りました。
残りの6件は2回目か3回目で返りました。
公式のX API、ApifyのTwitterスクレイパー、Bright DataのX Scraper API。同じポスト1,000件とプロフィール1,000件にそれぞれいくら課金し、始める前に何が必要かは次のとおりです。
| 必要なもの | ||||
|---|---|---|---|---|
| 課金の対象 | 1ページ | ポストかプロフィールごと | クエリとポストごと | レコードごと |
| リンク指定のポスト1,000件 | $0.98 | $5.00 | $50.40 | $1.50 |
| プロフィール1,000件 | $0.98 | $10.00 | $4.40 | $1.50 |
| 開発者アカウント | 不要 | 必要 | 不要 | 不要 |
| アカウントの繰り返しチェック | あり | あり | 制限あり | あり |
| キーワード検索 | なし | あり | あり | あり |
| 正確なフォロワー数 | 丸めた数 | あり | あり | あり |
| 無料で開始 | 1,000リクエスト | なし | 月$5 | 月5,000件 |
| ほかのサイトでも同じ料金 | あり | なし | なし | なし |
X以外もスクレイピングしますか?Web Unlockerなら、どのページも同じ方法、同じ料金で返します。
プロフィールページには、アカウントの最新ポスト5件が正確ないいね数、リポスト数、返信数、表示回数とともに載っています。100アカウントなら、チェックのたびに新しいポスト500件が$0.098で手に入ります。ApifyのメインのTwitterスクレイパーは、同じクエリを繰り返さないよう求めています。
X APIはポスト1,000件で$5を課金します。
ここではプロフィール200件から1,000件が$0.20です。
Xはログアウト状態の訪問者に、ページのHTMLの中にデータを入れて送り、各ポストの下には正確な数値があります。Web UnlockerがそのHTMLを返し、数行のコードで読み取れます。「アカウント一覧」タブは小さなTwitterクローラーで、アカウントを渡すと最新のポストをCSVで出力します。
上のフォームにご記入ください。キーは1営業日以内にメールで届きます。
フォロワー数と最新のポスト5件ならプロフィール、正確ないいね数、リポスト数、返信数、表示回数ならポストを選びます。
ページにデータが含まれているか確認し、サービスがすぐに拒否を返したときはもう一度リクエストします。
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python x_profile.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport html
import json
import os
import re
import time
from datetime import datetime, timezone
import requests
username = "NASA"
def scrape(url):
for attempt in range(3):
address = url if attempt == 0 else f"{url}?fresh={int(time.time())}"
response = requests.get(
"https://parsing.webunlocker.gologin.com/v1/scrape",
params={"url": address, "geo": "us", "format": "json"},
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
timeout=90,
)
page = response.json().get("data", {}).get("html", "") if response.ok else ""
if 'role="group"' in page:
return page
time.sleep(3)
raise RuntimeError("The page came back without data, try again later")
def meta(page, name):
found = re.search(rf'<meta (?:property|name)="{name}" content="([^"]*)"', page)
return html.unescape(found.group(1)) if found else None
def count(page, word):
found = re.search(rf">([\d.,]+[KMB]?)</span>\s*<span[^>]*>{word}<", page)
return found.group(1) if found else None
def text_of(chunk):
start = chunk.find('aria-label="More"')
if start < 0:
return ""
start = chunk.find("</button>", start) + len("</button>")
ends = [chunk.find(mark, start) for mark in ('inert=""', "data-press-control", "<video", 'role="group"', "<article")]
end = min([chunk.rfind("<", 0, at) for at in ends if at > 0] or [len(chunk)])
words = re.sub(r"<script.*?</script>|<[^>]+>", "", chunk[start:end], flags=re.S)
return html.unescape(words).strip()
page = scrape(f"https://x.com/{username}")
posts = []
start = 0
for match in re.finditer(r'aria-label="([^"]*)"[^>]*role="group"', page):
chunk = page[start : match.start()]
start = match.end()
link = re.search(r'href="/(\w+)/status/(\d+)', chunk)
stamp = re.search(r'"timestamp":(\d+)', chunk)
counts = {word.rstrip("s").replace("replie", "reply"): int(value) for value, word in re.findall(r"(\d+) (\w+)", match.group(1))}
posts.append(
{
"url": f"https://x.com/{link.group(1)}/status/{link.group(2)}",
"time": datetime.fromtimestamp(int(stamp.group(1)) / 1000, timezone.utc).isoformat() if stamp else None,
"pinned": ">Pinned</span>" in chunk[: chunk.find("data-post-avatar")],
"text": text_of(chunk),
"replies": counts.get("reply", 0),
"reposts": counts.get("repost", 0),
"likes": counts.get("like", 0),
"bookmarks": counts.get("bookmark", 0),
"views": counts.get("view"),
}
)
profile = {
"username": meta(page, "profile:username"),
"name": meta(page, "author"),
"bio": meta(page, "description"),
"followers": count(page, "Followers"),
"following": count(page, "Following"),
"posts": meta(page, "twitter:data1"),
"joined": meta(page, "twitter:data2"),
"latest_posts": posts,
}
print(json.dumps(profile, indent=2, ensure_ascii=False))
print(f"@{username}: {profile['followers']} followers, {len(posts)} latest posts with exact counts from one page")GOLOGIN_SCRAPING_API_KEY=your_key node x-posts.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const links = [
'https://x.com/NASA/status/2120305504295510080',
'https://x.com/SpaceX/status/2120808224324510133',
'https://x.com/Spotify/status/2120607242374504556',
];
async function scrape(url) {
for (let attempt = 1; attempt <= 3; attempt++) {
const address = attempt === 1 ? url : `${url}?fresh=${Date.now()}`;
const params = new URLSearchParams({ url: address, geo: 'us', format: 'json' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const page = response.ok ? (await response.json()).data?.html : '';
if (page?.includes('role="group"')) return page;
await new Promise((resolve) => setTimeout(resolve, 3000));
}
throw new Error(`${url} came back without data, try again later`);
}
const meta = (page, name) => page.match(new RegExp(`<meta (?:property|name)="${name}" content="([^"]*)"`))?.[1] ?? '';
const count = (label, word) => Number(label.match(new RegExp(`(\\d+) ${word}`))?.[1] ?? 0);
const posts = [];
for (const url of links) {
const page = await scrape(url);
const label = page.match(/aria-label="([^"]*)"[^>]*role="group"/)[1];
posts.push({
url,
author: meta(page, 'og:title').replace(/ on X$/, ''),
date: meta(page, 'article:published_time').slice(0, 10),
replies: count(label, 'repl'),
reposts: count(label, 'repost'),
likes: count(label, 'like'),
bookmarks: count(label, 'bookmark'),
views: count(label, 'view'),
});
}
writeFileSync('posts.csv', ['url,author,date,replies,reposts,likes,bookmarks,views', ...posts.map((post) => Object.values(post).map((value) => JSON.stringify(value)).join(','))].join('\n'));
console.table(posts);
console.log(`${posts.length} posts in ${posts.length} pages: $${(posts.length * 0.00098).toFixed(4)} on the Growth plan`);GOLOGIN_SCRAPING_API_KEY=your_key node x-accounts.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const accounts = ['NASA', 'NatGeo', 'SpaceX', 'Spotify', 'YouTube'];
async function scrape(url) {
for (let attempt = 1; attempt <= 3; attempt++) {
const address = attempt === 1 ? url : `${url}?fresh=${Date.now()}`;
const params = new URLSearchParams({ url: address, geo: 'us', format: 'json' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const page = response.ok ? (await response.json()).data?.html : '';
if (page?.includes('role="group"')) return page;
await new Promise((resolve) => setTimeout(resolve, 3000));
}
return '';
}
const count = (label, word) => Number(label.match(new RegExp(`(\\d+) ${word}`))?.[1] ?? 0);
const rows = [];
for (const account of accounts) {
const page = await scrape(`https://x.com/${account}`);
const followers = page.match(/>([\d.,]+[KMB]?)<\/span>\s*<span[^>]*>Followers</)?.[1] ?? '';
let start = 0;
for (const group of page.matchAll(/aria-label="([^"]*)"[^>]*role="group"/g)) {
const chunk = page.slice(start, group.index);
start = group.index + group[0].length;
const [, author, id] = chunk.match(/href="\/(\w+)\/status\/(\d+)/) ?? [];
const time = chunk.match(/"timestamp":(\d+)/)?.[1];
rows.push({
account,
followers,
post: `https://x.com/${author}/status/${id}`,
date: time ? new Date(Number(time)).toISOString().slice(0, 10) : '',
replies: count(group[1], 'repl'),
reposts: count(group[1], 'repost'),
likes: count(group[1], 'like'),
views: count(group[1], 'view'),
});
}
}
writeFileSync('latest-posts.csv', ['account,followers,post,date,replies,reposts,likes,views', ...rows.map((row) => Object.values(row).map((value) => JSON.stringify(value)).join(','))].join('\n'));
console.table(rows);
console.log(`${rows.length} posts from ${accounts.length} accounts in ${accounts.length} pages: $${(accounts.length * 0.00098).toFixed(4)} on the Growth plan`);ご自身のアカウント一覧で実行しますか?APIキーと無料リクエストを入手しましょう。
1つのアカウント、1つのプロキシネットワーク、1つのエコシステム。用途に合った製品をお選びください。
ほかのサイトもスクレイピングしますか?Instagram、Reddit、YouTubeのスクレイパー、またはすべてのWebスクレイピングツールをご覧ください。
Twitterスクレイパー(現在はXスクレイパーとも呼ばれます)は、公開されているX(旧Twitter)のページを読み取り、データに変えるツールです。プロフィールなら名前、自己紹介、フォロワー数、最新のポスト、ポストならテキスト、日時、返信数、リポスト数、いいね数、表示回数が対象です。Gologin Web UnlockerはTwitterスクレイパーAPIで、ページのアドレスを送ると、そのデータが載ったページを1,000ページあたり$0.98で返します。
はい、ログインなしで可能です。Xは公開プロフィールとポストをログアウト状態の訪問者にも表示し、データはページそのものに含まれています。Web Unlockerはログアウト状態の訪問者として米国のIPアドレスからページを開くため、Xアカウントも、Cookieも、X APIキーも不要です。テストでは50件中50件のページがデータ付きで返りました。
requestsライブラリでプロフィールまたはポストのアドレスをWeb Unlockerに送り、ページから数値を読み取ります。上のPythonタブは完全なPython製Twitterスクレイパーで、実際のAPIでテスト済みです。プロフィールのフォロワー数と最新のポスト5件を、正確ないいね数、リポスト数、返信数、表示回数とともに出力します。
はい。公式のX APIはポストを読み取る方法の1つで、公開ページはもう1つの方法です。Web Unlockerはページを読み取るため、開発者アカウントも、X APIの請求も、ポスト読み取り月300万件という上限も関係ありません。
大量のポストを読み取る用途では使えません。X APIは現在従量課金で、ポストの読み取り1件あたり$0.005、プロフィール1件あたり$0.010、ポストの読み取りは月300万件までです。Web Unlockerには1,000件の無料リクエストが付き、ポストまたはプロフィール1,000件に相当します。
Twitter APIの料金は現在X APIの料金になり、従量課金です。ポスト1,000件で$5.00、プロフィール1,000件で$10.00です。Web Unlockerはどちらも1,000ページあたり$0.98で、プロフィールページにはすでにアカウントの最新ポスト5件が含まれています。プロフィール200件から取得するポスト1,000件は$0.20です。
各ポストを個別のリンクから読み取ると、1,000ページあたり$0.98で$980です。プロフィールページから読み取れば、100万件のポストは1ページ5件で200,000ページになり、$196です。X APIは同じ100万件のポストに$5,000を課金します。
はい。リクエストのたびにライブのページを読み込むので、数値はその時点でXが表示しているものです。テストでは同じNASAのポストのいいね数が4,337件、20分後には4,341件でした。
Web Unlockerではできません。Xは検索ページとハッシュタグページをログイン後にしか開かないため、ログアウト状態のリクエストは登録ページに行き着きます。フォローしているアカウントとポストから始めてください。それらのページは公開されており、上の「アカウント一覧」サンプルならリスト全体をまとめてチェックできます。
一部は可能です。ポストのページには上位3〜4件の返信が載り、それぞれに投稿者、テキスト、正確ないいね数、リポスト数、表示回数が付いています。返信の一覧全体はログイン後にしか開けません。
一覧としてはできません。アカウントをフォローしているユーザーは、ログイン後にしか表示されません。フォロワー数は公開されていてどのプロフィールにも付いてきますが、Xがログアウト状態の訪問者に表示するとおり丸められています(92.2M、28M)。ページに正確な数値はありません。ポストの数値はすべて正確です。
Xがログアウト状態の訪問者に表示する最新の5件で、それぞれに正確な返信数、リポスト数、いいね数、ブックマーク数、表示回数が付いています。固定されたポストは最初に表示され、固定と示されます。それより古いポストはリンクから取得します。ポストのページ1つが1リクエストです。
目的によります。Apifyのスクレイパーはキーワードで検索し、ポストごとに課金します。X APIはすべてを読み取れますが、ポスト1,000件で$5です。Web Unlockerは公開プロフィールやポストのページを正確な数値付きで1ページ1つの料金で返し、Xでもほかのどのサイトでも同じです。
はい。ApifyのメインのTwitterスクレイパーは検索しか受け付けず、1クエリあたり最低50件のポストで、同じクエリを繰り返さないよう求めています。単体のポストはLite版で扱い、リンク1件あたり$0.05です。Web Unlockerは、どのプロフィールやポストのリンクも1,000ページあたり$0.98で、必要なだけ何度でも受け付けます。
ログインなしで読み込めるプロフィールとポストは公開ページです。2024年5月のX Corp.対Bright Data訴訟で、米国連邦裁判所の判事は、公開データのスクレイピングをめぐるXの訴えを棄却しました。何を収集し、どう使うかはお客様の判断ですので、プロジェクトに適用されるルールに照らして確認してください。
はい。エージェントがプロフィールまたはポストのアドレスを同じAPIに送り、ページから数値を読み取ります。MCP & AI Skillsを使えば、作業内容を説明するだけでClaudeがそのツールを作ります。
チームについて簡単にご記入いただくと、次の内容をお届けします。