Cole um perfil ou post público. O Web Unlocker devolve a página do X sem login: os seguidores, a bio e os 5 posts mais recentes de um perfil, cada post com curtidas, reposts, respostas e visualizações exatos. $0.98 por 1.000 páginas.
1.000 requisições grátis · Pague só se der certo · Mais de 195 países · Pronto para o Claude
As páginas do X costumam levar de 2 a 10 segundos. Ainda está em andamento, não precisa clicar de novo.
Pronto para suas próprias contas? Obtenha uma chave de API ou agende uma demo.
Conte um pouco sobre sua equipe e receba:
Páginas públicas, sem login, sem conta no X e sem chave da X API. Equipes de social listening, agências, marcas e agentes de IA leem estes dois tipos de página, cada um cobrado como uma página.





Quer testar você mesmo? Pegue sua chave de API com 1.000 requisições grátis.
O Web Unlocker cobra uma página de post uma vez, com as respostas, os reposts, as curtidas e as visualizações exatos, a $0.98 por 1.000 páginas. Um Twitter scraper na Apify cobra $0.05 por link de post, e a Bright Data, $1.50 por 1.000 registros.
A X API cobra $5.00 por 1.000 posts.
Aqui 1.000 custam $0.98.
Uma requisição que o serviço não consegue responder não custa nada. No nosso teste, 6 de 50 primeiras tentativas voltaram com uma recusa rápida, e pedir de novo trouxe a página.
Quanto custam 1.000 posts do X
1.000 posts públicos com curtidas, reposts, respostas e visualizações, a preços publicados
Gologin: $0.98 por 1.000 páginas, uma página por post. A Bright Data cobra cada registro, $1.50 por 1.000. A X API cobra $0.005 por post lido. O Twitter Scraper Lite na Apify cobra $0.05 por link de post, mais $0.0004 por post.
Pronto para rodar nos seus próprios posts? Obtenha sua chave de API e requisições grátis.
Nosso teste de web scraping do Twitter: 20 perfis de marcas e criadores, um post recente de cada, e 10 contas menores, cada página pedida até três vezes, como a demo acima faz. Veja o que voltou e com que rapidez.
44 de 50 voltaram na primeira tentativa.
Os outros 6 na segunda ou na terceira.
A X API oficial, os Twitter scrapers da Apify e a X Scraper API da Bright Data: o que cada um cobra pelos mesmos 1.000 posts e perfis e o que exige de você antes de começar.
| O que é preciso | ||||
|---|---|---|---|---|
| Você paga por | Uma página | Cada post ou perfil | Cada busca e post | Cada registro |
| 1.000 posts por link | $0.98 | $5.00 | $50.40 | $1.50 |
| 1.000 perfis | $0.98 | $10.00 | $4.40 | $1.50 |
| Conta de desenvolvedor | Não precisa | Precisa | Não precisa | Não precisa |
| Checagens repetidas de uma conta | Sim | Sim | Limitado | Sim |
| Busca por palavra-chave | Não | Sim | Sim | Sim |
| Número exato de seguidores | Arredondado | Sim | Sim | Sim |
| Grátis para começar | 1.000 requisições | Não | $5 por mês | 5.000 por mês |
| Mesmo preço em qualquer outro site | Sim | Não | Não | Não |
Faz scraping de mais do que o X? O Web Unlocker devolve qualquer página do mesmo jeito, pelo mesmo preço.
Uma página de perfil traz os 5 posts mais recentes de uma conta com curtidas, reposts, respostas e visualizações exatos. 100 contas dão 500 posts recentes por $0.098, quantas vezes você checar. O principal Twitter scraper da Apify pede que você não repita uma busca.
A X API cobra $5 por 1.000 posts.
Aqui 1.000 vêm de 200 perfis por $0.20.
O X envia a um visitante sem login os dados no HTML da página, com números exatos sob cada post. O Web Unlocker devolve esse HTML, e poucas linhas de código o leem. A aba Lista de contas é um pequeno crawler do Twitter: entra uma lista de contas, saem os posts mais recentes em um CSV.
Preencha o formulário acima. A chave chega por e-mail em até um dia útil.
Um perfil para os seguidores e os 5 posts mais recentes, um post para as curtidas, os reposts, as respostas e as visualizações exatos.
Confira se a página veio com dados e peça de novo quando o serviço enviar uma recusa rápida.
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`);Pronto para rodar nas suas próprias contas? Obtenha sua chave de API e requisições grátis.
Uma conta, uma rede de proxies, um ecossistema. Escolha o produto de que a tarefa precisa.
Faz scraping de mais sites? Veja os scrapers do Instagram, do Reddit e do YouTube, ou todas as ferramentas de web scraping.
Um Twitter scraper, hoje também chamado de X scraper, é uma ferramenta que lê páginas públicas do X (antigo Twitter) e as transforma em dados: o nome, a bio, os seguidores e os posts mais recentes de um perfil, e o texto, a hora, as respostas, os reposts, as curtidas e as visualizações de um post. O Gologin Web Unlocker é uma API de Twitter scraper: envie o endereço de uma página e ele a devolve com esses dados, a $0.98 por 1.000 páginas.
Sim, sem login. O X mostra perfis e posts públicos a visitantes sem login, com os dados na própria página. O Web Unlocker os abre como um visitante sem login a partir de um endereço IP dos EUA, então você não precisa de conta no X, de cookies nem de chave da X API: no nosso teste, 50 de 50 páginas voltaram com dados.
Envie o endereço do perfil ou do post ao Web Unlocker com a biblioteca requests e leia os números na página. A aba Python acima é um Twitter scraper completo em Python, testado na API real: ele mostra os seguidores de um perfil e os 5 posts mais recentes com curtidas, reposts, respostas e visualizações exatos.
Sim. A X API oficial é um jeito de ler posts, a página pública é outro. O Web Unlocker lê a página, então você dispensa a conta de desenvolvedor, a cobrança da X API e o teto mensal dela de 3 milhões de posts lidos.
Não para ler posts em escala. A X API agora cobra por uso: $0.005 por post lido e $0.010 por perfil, até 3 milhões de posts lidos por mês. O Web Unlocker vem com 1.000 requisições grátis, o suficiente para 1.000 posts ou perfis.
O preço da Twitter API agora é o preço da X API, cobrado por uso: $5.00 por 1.000 posts e $10.00 por 1.000 perfis. O Web Unlocker cobra $0.98 por 1.000 páginas nos dois casos, e uma página de perfil já traz os 5 posts mais recentes da conta: 1.000 posts de 200 perfis custam $0.20.
$980 se você ler cada post pelo próprio link, a $0.98 por 1.000 páginas. Leia pelas páginas de perfil e 1 milhão de posts ocupam 200.000 páginas de 5 posts cada: $196. A X API cobra $5,000 pelo mesmo milhão de posts.
Sim. Cada requisição carrega a página ao vivo, então os números são os que o X mostra naquele momento: no nosso teste, o mesmo post da NASA tinha 4.337 curtidas e, vinte minutos depois, 4.341.
Não com o Web Unlocker. O X só abre as páginas de busca e de hashtag com login, então uma requisição sem login cai na página de cadastro. Comece pelas contas e pelos posts que você acompanha: as páginas deles são públicas, e o exemplo Lista de contas acima checa uma lista inteira delas.
Em parte. Uma página de post traz as 3 ou 4 principais respostas, cada uma com autor, texto e curtidas, reposts e visualizações exatos. A lista completa de respostas só abre com login.
Não como lista: quem segue uma conta só aparece com login. O número de seguidores é público e vem com cada perfil, arredondado como o X o mostra a visitantes sem login (92.2M, 28M): a página não traz o número exato. Os números de cada post vêm exatos.
Os 5 mais recentes, como o X os mostra a um visitante sem login, cada um com respostas, reposts, curtidas, itens salvos e visualizações exatos. Um post fixado vem primeiro e marcado como fixado. Para posts mais antigos, use os links deles: cada página de post é uma requisição.
Depende da tarefa. Os scrapers da Apify buscam por palavra-chave e cobram cada post. A X API lê tudo, a $5 por 1.000 posts. O Web Unlocker devolve a página pública de perfil ou de post com números exatos por um preço por página, no X e em qualquer outro site.
Sim. O principal Twitter scraper da Apify só aceita buscas, com no mínimo 50 posts por busca, e pede que você não repita a mesma busca; posts avulsos passam pela versão Lite, a $0.05 por link. O Web Unlocker aceita qualquer link de perfil ou post a $0.98 por 1.000 páginas, quantas vezes você precisar.
Perfis e posts que carregam sem login são páginas públicas. No caso X Corp. v. Bright Data, em maio de 2024, um juiz federal dos EUA rejeitou a ação do X sobre o scraping de dados públicos. O que você coleta e como usa é decisão sua, então confira com as regras que valem para o seu projeto.
Sim. Um agente envia o endereço do perfil ou do post para a mesma API e lê os números na página. Com MCP & AI Skills, o Claude cria essa ferramenta a partir de uma descrição da tarefa.
Conte um pouco sobre sua equipe e receba: