Pega un perfil o un post públicos. Web Unlocker devuelve la página de X sin iniciar sesión: de un perfil, los seguidores, la biografía y los 5 últimos posts, cada post con sus me gusta, reposts, respuestas y visualizaciones exactos. $0.98 por 1000 páginas.
1000 solicitudes gratis · Solo pagas si funciona · 195+ países · Listo para Claude
Las páginas de X suelen tardar de 2 a 10 segundos. Sigue en proceso, no hace falta volver a hacer clic.
¿Listo para tus propias cuentas? Obtén una clave de API o reserva una demo.
Cuéntanos un poco sobre tu equipo y recibe:
Páginas públicas, sin iniciar sesión, sin cuenta de X y sin clave de la X API. Equipos de social listening, agencias, marcas y agentes de IA leen estos dos tipos de página, y cada una se cobra como una página.





¿Quieres probarlo tú mismo? Consigue tu clave de API con 1000 solicitudes gratis.
Web Unlocker cobra una sola vez la página de un post, con sus respuestas, reposts, me gusta y visualizaciones exactos, a $0.98 por 1000 páginas. Un Twitter scraper en Apify cobra $0.05 por cada enlace a un solo post, y Bright Data $1.50 por 1000 registros.
La X API cobra $5.00 por 1000 posts.
Aquí 1000 cuestan $0.98.
Una solicitud que el servicio no puede responder no cuesta nada. En nuestra prueba, 6 de 50 primeros intentos recibieron un rechazo rápido, y al pedirla de nuevo llegó la página.
Lo que cuestan 1000 posts de X
1000 posts públicos con me gusta, reposts, respuestas y visualizaciones, a precios publicados
Gologin: $0.98 por 1000 páginas, una página por post. Bright Data cobra cada registro, $1.50 por 1000. La X API cobra $0.005 por cada post leído. Twitter Scraper Lite en Apify cobra $0.05 por cada enlace a un solo post, más $0.0004 por post.
¿Listo para ejecutarlo con tus propios posts? Obtén tu clave de API y solicitudes gratis.
Nuestra prueba de web scraping de Twitter: 20 perfiles de marcas y creadores, un post reciente de cada uno y 10 cuentas más pequeñas, cada página pedida hasta tres veces, como lo hace la demo de arriba. Esto es lo que volvió, y con qué rapidez.
44 de 50 volvieron al primer intento.
Los otros 6, al segundo o al tercero.
La X API oficial, los scrapers de Twitter de Apify y la X Scraper API de Bright Data: lo que cobra cada uno por los mismos 1000 posts y perfiles, y lo que te pide antes de empezar.
| Lo que exige | ||||
|---|---|---|---|---|
| Pagas por | Una página | Cada post o perfil | Cada consulta y post | Cada registro |
| 1000 posts por enlace | $0.98 | $5.00 | $50.40 | $1.50 |
| 1000 perfiles | $0.98 | $10.00 | $4.40 | $1.50 |
| Cuenta de desarrollador | No hace falta | Hace falta | No hace falta | No hace falta |
| Revisar una cuenta varias veces | Sí | Sí | Con límites | Sí |
| Búsqueda por palabra clave | No | Sí | Sí | Sí |
| Cifras exactas de seguidores | Redondeadas | Sí | Sí | Sí |
| Inicio gratis | 1000 solicitudes | No | $5 al mes | 5000 al mes |
| Mismo precio en cualquier otro sitio | Sí | No | No | No |
¿Haces scraping de algo más que X? Web Unlocker devuelve cualquier página de la misma forma y al mismo precio.
La página de un perfil trae los 5 últimos posts de la cuenta con sus me gusta, reposts, respuestas y visualizaciones exactos. 100 cuentas te dan 500 posts recientes por $0.098, tan a menudo como revises. El principal Twitter scraper de Apify te pide no repetir una consulta.
La X API cobra $5 por 1000 posts.
Aquí 1000 salen de 200 perfiles por $0.20.
X envía a un visitante sin sesión iniciada los datos dentro del HTML de la página, con cifras exactas bajo cada post. Web Unlocker devuelve ese HTML, y unas pocas líneas de código lo leen. La pestaña Lista de cuentas es un pequeño crawler de Twitter: entran cuentas, salen sus últimos posts en un CSV.
Rellena el formulario de arriba. La clave llega por correo en un día laborable.
Un perfil para sus seguidores y sus 5 últimos posts, o un post para sus me gusta, reposts, respuestas y visualizaciones exactos.
Comprueba que la página trae datos, y pídela de nuevo cuando el servicio envíe un rechazo rápido.
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`);¿Listo para ejecutarlo con tus propias cuentas? Obtén tu clave de API y solicitudes gratis.
Una cuenta, una red de proxies, un ecosistema. Elige el producto que necesita cada tarea.
¿Haces scraping de más sitios? Consulta los scrapers de Instagram, Reddit y YouTube, o todas las herramientas de web scraping.
Un Twitter scraper, ahora también llamado X scraper, es una herramienta que lee páginas públicas de X (antes Twitter) y las convierte en datos: el nombre, la biografía, los seguidores y los últimos posts de un perfil, y el texto, la hora, las respuestas, los reposts, los me gusta y las visualizaciones de un post. Gologin Web Unlocker es una Twitter scraper API: envíale la dirección de una página y la devuelve con esos datos, a $0.98 por 1000 páginas.
Sí, sin iniciar sesión. X muestra los perfiles y posts públicos a los visitantes sin sesión iniciada, con los datos en la propia página. Web Unlocker los abre como un visitante sin sesión iniciada desde una IP de EE. UU., así que no necesitas una cuenta de X, ni cookies, ni una clave de la X API: en nuestra prueba, 50 de 50 páginas volvieron con datos.
Envía la dirección del perfil o del post a Web Unlocker con la biblioteca requests y lee las cifras de la página. La pestaña Python de arriba es un Twitter scraper completo en Python, probado en la API real: muestra los seguidores de un perfil y sus 5 últimos posts con me gusta, reposts, respuestas y visualizaciones exactos.
Sí. La X API oficial es una forma de leer posts, y la página pública es otra. Web Unlocker lee la página, así que te ahorras la cuenta de desarrollador, la factura de la X API y su tope mensual de 3 millones de posts leídos.
No para leer posts a escala. La X API ahora cobra por uso: $0.005 por post leído y $0.010 por perfil, hasta 3 millones de posts leídos al mes. Web Unlocker incluye 1000 solicitudes gratis, suficientes para 1000 posts o perfiles.
Los precios de la Twitter API ahora son los de la X API, que cobra por uso: $5.00 por 1000 posts y $10.00 por 1000 perfiles. Web Unlocker cobra $0.98 por 1000 páginas en ambos casos, y la página de un perfil ya trae los 5 últimos posts de la cuenta: 1000 posts de 200 perfiles cuestan $0.20.
$980 si lees cada post desde su propio enlace, a $0.98 por 1000 páginas. Léelos desde las páginas de perfil y 1 millón de posts ocupan 200 000 páginas de 5 posts cada una: $196. La X API cobra $5000 por el mismo millón de posts.
Sí. Cada solicitud carga la página en vivo, así que las cifras son las que X muestra en ese momento: en nuestra prueba, el mismo post de NASA tenía 4337 me gusta, y 4341 veinte minutos después.
No con Web Unlocker. X abre las páginas de búsqueda y de hashtags solo tras iniciar sesión, así que una solicitud sin sesión iniciada acaba en la página de registro. Empieza por las cuentas y los posts que sigues: sus páginas son públicas, y el ejemplo Lista de cuentas de arriba revisa una lista entera de ellas.
En parte. La página de un post trae sus 3 o 4 respuestas destacadas, cada una con su autor, su texto y sus me gusta, reposts y visualizaciones exactos. La lista completa de respuestas solo se abre tras iniciar sesión.
No como lista: quién sigue a una cuenta solo se muestra tras iniciar sesión. El número de seguidores es público y llega con cada perfil, redondeado como X lo muestra a los visitantes sin sesión iniciada (92.2M, 28M): la página no trae la cifra exacta. Las cifras de cada post llegan exactas.
Los 5 últimos, como X los muestra a un visitante sin sesión iniciada, cada uno con sus respuestas, reposts, me gusta, elementos guardados y visualizaciones exactos. Un post fijado va primero y viene marcado como fijado. Para posts más antiguos, usa sus enlaces: cada página de post es una solicitud.
Depende de la tarea. Los scrapers de Apify buscan por palabra clave y cobran cada post. La X API lo lee todo, a $5 por 1000 posts. Web Unlocker devuelve la página pública del perfil o del post con cifras exactas a un precio por página, en X y en cualquier otro sitio.
Sí. El principal Twitter scraper de Apify solo acepta búsquedas, de al menos 50 posts por consulta, y te pide no repetir la misma consulta; los posts sueltos van por su versión Lite a $0.05 por enlace. Web Unlocker acepta cualquier enlace de perfil o de post a $0.98 por 1000 páginas, tan a menudo como lo necesites.
Los perfiles y posts que cargan sin iniciar sesión son páginas públicas. En el caso X Corp. v. Bright Data, en mayo de 2024, un juez federal de EE. UU. desestimó la demanda de X por el scraping de datos públicos. Qué recoges y cómo lo usas es decisión tuya, así que compruébalo con las normas que se apliquen a tu proyecto.
Sí. Un agente envía la dirección del perfil o del post a la misma API y lee las cifras de la página. Con MCP & AI Skills, Claude crea esa herramienta a partir de una descripción de la tarea.
Cuéntanos un poco sobre tu equipo y recibe: