Collez un profil ou un post public. Web Unlocker renvoie la page X sans connexion : les abonnés, la bio et les 5 derniers posts d'un profil, chaque post avec ses J'aime, reposts, réponses et vues exacts. $0.98 pour 1 000 pages.
1 000 requêtes gratuites · Facturé en cas de succès · 195+ pays · Prêt pour Claude
Les pages X mettent généralement de 2 à 10 secondes à se charger. Le travail continue, inutile de cliquer à nouveau.
Prêt pour vos propres comptes ? Obtenez une clé API ou réservez une démo.
Parlez-nous un peu de votre équipe et recevez :
Des pages publiques, sans connexion, sans compte X et sans clé X API. Équipes de social listening, agences, marques et agents IA lisent ces deux types de page, chacun facturé comme une page.





Envie d'essayer vous-même ? Prenez votre clé API avec 1 000 requêtes gratuites.
Web Unlocker facture une page de post une seule fois, avec ses réponses, reposts, J'aime et vues exacts, à $0.98 pour 1 000 pages. Un Twitter scraper sur Apify facture $0.05 chaque lien de post individuel, et Bright Data $1.50 pour 1 000 enregistrements.
La X API facture $5.00 pour 1 000 posts.
Ici, 1 000 coûtent $0.98.
Une requête à laquelle le service ne peut pas répondre ne coûte rien. Dans notre test, 6 des 50 premiers essais ont reçu un refus rapide, et une nouvelle demande a apporté la page.
Ce que coûtent 1 000 posts X
1 000 posts publics avec J'aime, reposts, réponses et vues, aux prix publiés
Gologin : $0.98 pour 1 000 pages, une page par post. Bright Data facture chaque enregistrement, $1.50 pour 1 000. La X API facture $0.005 par post lu. Twitter Scraper Lite sur Apify facture $0.05 par lien de post individuel, plus $0.0004 par post.
Prêt à le lancer sur vos propres posts ? Obtenez votre clé API et des requêtes gratuites.
Notre test de scraping web Twitter : 20 profils de marques et de créateurs, un post récent de chacun, et 10 comptes plus petits, chaque page demandée jusqu'à trois fois, comme le fait la démo ci-dessus. Voici ce qui revient, et à quelle vitesse.
44 sur 50 reviennent du premier coup.
Les 6 autres au deuxième ou au troisième essai.
La X API officielle, les scrapers Twitter d'Apify et la X Scraper API de Bright Data : ce que chacun facture pour les mêmes 1 000 posts et profils, et ce qu'il vous demande avant de commencer.
| Ce que cela demande | ||||
|---|---|---|---|---|
| Vous payez | Une page | Chaque post ou profil | Chaque requête et post | Chaque fiche |
| 1 000 posts par lien | $0.98 | $5.00 | $50.40 | $1.50 |
| 1 000 profils | $0.98 | $10.00 | $4.40 | $1.50 |
| Compte développeur | Pas nécessaire | Nécessaire | Pas nécessaire | Pas nécessaire |
| Vérifier un compte plusieurs fois | Oui | Oui | Limité | Oui |
| Recherche par mot-clé | Non | Oui | Oui | Oui |
| Nombre exact d'abonnés | Arrondi | Oui | Oui | Oui |
| Gratuit pour démarrer | 1 000 requêtes | Non | $5 par mois | 5 000 par mois |
| Même prix sur tout autre site | Oui | Non | Non | Non |
Vous scrapez d'autres sites que X ? Web Unlocker renvoie n'importe quelle page de la même façon, au même prix.
Une page de profil apporte les 5 derniers posts d'un compte avec leurs J'aime, reposts, réponses et vues exacts. 100 comptes vous donnent 500 posts récents pour $0.098, aussi souvent que vous vérifiez. Le principal Twitter scraper d'Apify vous demande de ne pas répéter une requête.
La X API facture $5 pour 1 000 posts.
Ici, 1 000 viennent de 200 profils pour $0.20.
X envoie à un visiteur non connecté les données dans le HTML de la page, avec les chiffres exacts sous chaque post. Web Unlocker renvoie ce HTML, et quelques lignes de code le lisent. L'onglet Liste de comptes est un petit crawler Twitter : des comptes en entrée, les derniers posts dans un CSV en sortie.
Remplissez le formulaire ci-dessus. La clé arrive par e-mail sous un jour ouvré.
Un profil pour ses abonnés et ses 5 derniers posts, un post pour ses J'aime, reposts, réponses et vues exacts.
Vérifiez que la page est arrivée avec des données, et redemandez-la quand le service a envoyé un refus rapide.
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`);Prêt à le lancer sur vos propres comptes ? Obtenez votre clé API et des requêtes gratuites.
Un compte, un réseau de proxys, un écosystème. Choisissez le produit dont la tâche a besoin.
Vous scrapez d'autres sites ? Voir les scrapers Instagram, Reddit et YouTube, ou tous les outils de web scraping.
Un Twitter scraper, aujourd'hui aussi appelé X scraper, est un outil qui lit les pages publiques de X (anciennement Twitter) et les transforme en données : le nom, la bio, les abonnés et les derniers posts d'un profil, le texte, l'heure, les réponses, reposts, J'aime et vues d'un post. Gologin Web Unlocker est une API de scraping Twitter : envoyez-lui l'adresse d'une page et il renvoie la page avec ces données, à $0.98 pour 1 000 pages.
Oui, sans connexion. X montre les profils et posts publics aux visiteurs non connectés, avec les données dans la page elle-même. Web Unlocker les ouvre comme un visiteur non connecté depuis une IP américaine : vous n'avez besoin ni de compte X, ni de cookies, ni de clé X API. Dans notre test, 50 pages sur 50 sont revenues avec des données.
Envoyez l'adresse du profil ou du post à Web Unlocker avec la bibliothèque requests et lisez les chiffres dans la page. L'onglet Python ci-dessus est un Twitter scraper complet en Python, testé sur l'API en production : il affiche les abonnés d'un profil et ses 5 derniers posts avec leurs J'aime, reposts, réponses et vues exacts.
Oui. La X API officielle est une façon de lire les posts, la page publique en est une autre. Web Unlocker lit la page : vous évitez le compte développeur, la facture de la X API et son plafond mensuel de 3 millions de posts lus.
Pas pour lire des posts à grande échelle. La X API facture désormais à l'usage : $0.005 par post lu et $0.010 par profil, jusqu'à 3 millions de posts lus par mois. Web Unlocker inclut 1 000 requêtes gratuites, de quoi couvrir 1 000 posts ou profils.
Le prix de la Twitter API est désormais celui de la X API, facturé à l'usage : $5.00 pour 1 000 posts et $10.00 pour 1 000 profils. Web Unlocker facture $0.98 pour 1 000 pages dans les deux cas, et une page de profil contient déjà les 5 derniers posts du compte : 1 000 posts tirés de 200 profils coûtent $0.20.
$980 si vous lisez chaque post depuis son propre lien, à $0.98 pour 1 000 pages. Lisez-les depuis les pages de profil et 1 million de posts demandent 200 000 pages de 5 posts chacune : $196. La X API facture $5,000 pour le même million de posts.
Oui. Chaque requête charge la page en direct, donc les chiffres sont ceux que X affiche à ce moment-là : dans notre test, le même post de la NASA avait 4 337 J'aime, puis 4 341 vingt minutes plus tard.
Pas avec Web Unlocker. X n'ouvre les pages de recherche et de hashtag qu'après connexion, donc une requête sans connexion arrive sur la page d'inscription. Partez des comptes et des posts que vous suivez : leurs pages sont publiques, et l'exemple Liste de comptes ci-dessus en vérifie toute une liste.
En partie. Une page de post apporte ses 3 ou 4 meilleures réponses, chacune avec son auteur, son texte et ses J'aime, reposts et vues exacts. La liste complète des réponses ne s'ouvre qu'après connexion.
Pas sous forme de liste : qui suit un compte ne s'affiche qu'après connexion. Le nombre d'abonnés est public et arrive avec chaque profil, arrondi comme X le montre aux visiteurs non connectés (92.2M, 28M) : la page ne porte aucun chiffre exact. Les chiffres de chaque post arrivent exacts.
Les 5 derniers, tels que X les montre à un visiteur non connecté, chacun avec ses réponses, reposts, J'aime, signets et vues exacts. Un post épinglé arrive en premier et est marqué comme épinglé. Pour les posts plus anciens, utilisez leurs liens : chaque page de post est une requête.
Cela dépend de votre besoin. Les scrapers d'Apify cherchent par mot-clé et facturent chaque post. La X API lit tout, à $5 pour 1 000 posts. Web Unlocker renvoie la page publique de profil ou de post avec les chiffres exacts à un prix unique par page, sur X comme sur n'importe quel autre site.
Oui. Le principal Twitter scraper d'Apify n'accepte que des recherches, au moins 50 posts par requête, et vous demande de ne pas répéter la même requête ; les posts individuels passent par sa version Lite à $0.05 le lien. Web Unlocker accepte n'importe quel lien de profil ou de post à $0.98 pour 1 000 pages, aussi souvent que nécessaire.
Les profils et posts qui se chargent sans connexion sont des pages publiques. Dans l'affaire X Corp. v. Bright Data, en mai 2024, un juge fédéral américain a rejeté la plainte de X portant sur le scraping de données publiques. Ce que vous collectez et l'usage que vous en faites relèvent de vous : vérifiez-le au regard des règles applicables à votre projet.
Oui. Un agent envoie l'adresse du profil ou du post à la même API et lit les chiffres dans la page. Avec MCP & AI Skills, Claude construit cet outil à partir d'une description de la tâche.
Parlez-nous un peu de votre équipe et recevez :