Scraping de Twitter (X) con Python: tweets, seguidores y exportación a CSV
Tutorial de Python: extrae tweets y seguidores públicos de X (Twitter) con la API REST de TwexAPI, recorre las páginas y guárdalos en CSV. Sin navegador, proxies ni cuenta de X.
Esta guía extrae datos públicos de X (Twitter) desde Python con peticiones HTTP normales. Buscas tweets con operadores de búsqueda avanzada, recorres las páginas de resultados, exportas una lista de seguidores y lo guardas todo en CSV. No necesitas un navegador headless, proxies ni una cuenta de X, solo una clave de API de TwexAPI.
Antes de empezar
- Crea una cuenta en twexapi.io para recibir 20.000 Credits gratis, unas 4.000 lecturas.
- Copia tu clave de API desde el panel y expórtala:
export TWEXAPI_KEY="twexapi_xxx"
pip install requests
Buscar tweets
El endpoint de búsqueda avanzada recibe una lista de searchTerms, un sortBy con Latest o Top y un next_cursor para paginar. Cada página devuelve hasta 20 tweets.
import os
import time
import requests
API = "https://api.twexapi.io"
HEADERS = {"Authorization": f"Bearer {os.environ['TWEXAPI_KEY']}"}
def paginate(path, body, max_items):
"""POST a cursor endpoint until max_items rows or the last page."""
items, cursor = [], ""
while len(items) < max_items:
res = requests.post(f"{API}{path}", headers=HEADERS, json={**body, "next_cursor": cursor}, timeout=30)
res.raise_for_status()
page = res.json()
items += [row for row in page.get("data", []) if row]
cursor = page.get("next_cursor")
if not page.get("has_next_page") or not cursor:
break
time.sleep(5) # free Starter plan: 1 request per 5 seconds; paid plans allow 5+ per second
return items[:max_items]
tweets = paginate(
"/twitter/advanced_search/page",
{"searchTerms": ["openai", "lang:en", "min_faves:100", "since:2026-10-01"], "sortBy": "Latest"},
max_items=200,
)
print(len(tweets), "tweets")
searchTerms acepta los mismos operadores que el buscador de X:
| Operador | Ejemplo | Significado |
|---|---|---|
from: |
from:nasa |
Publicaciones de una cuenta |
since: / until: |
since:2026-10-01 |
Rango de fechas |
lang: |
lang:es |
Idioma |
min_faves: |
min_faves:100 |
Mínimo de me gusta |
-filter:replies |
Excluir respuestas |
Guardar los tweets en CSV
import csv
with open("tweets.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(["tweet_id", "created_at", "user", "likes", "retweets", "text"])
for t in tweets:
writer.writerow([
t.get("tweet_id"),
t.get("created_at"),
(t.get("user") or {}).get("screen_name"),
t.get("favorite_count"),
t.get("retweet_count"),
(t.get("text") or "").replace("\n", " "),
])
Con utf-8-sig, los acentos y emojis se ven bien al abrir el archivo en Excel.
Extraer seguidores
El endpoint de seguidores usa la misma paginación por cursor, así que la función paginate sirve sin cambios.
followers = paginate("/twitter/followers/page", {"screen_name": "nasa"}, max_items=1000)
with open("followers.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(["username", "name", "followers", "location", "bio"])
for u in followers:
writer.writerow([u.get("username"), u.get("name"), u.get("followersCount"), u.get("location"), u.get("description")])
Coste
Una lectura típica cuesta 5 Credits, unos $0,05 por cada 1.000 tweets o seguidores. Los 200 tweets y 1.000 seguidores del ejemplo cuestan unos $0,06 en total. Consulta los precios para ver las tarifas exactas.
¿Por qué no Selenium, Playwright o twscrape?
Desde que X cerró el acceso de invitados a principios de 2024, los scrapers basados en navegador y los de código abierto necesitan cuentas de X con sesión iniciada y proxies rotativos, y se rompen cuando X cambia su sitio. Una API te quita ese mantenimiento. Para una comparación más completa, consulta Scraper propio de Twitter vs TwexAPI.
Siguientes pasos
- Resumen de la API de scraping de Twitter: qué datos puedes extraer y cómo se compara con Apify y la API oficial.
- Manejo de errores: reintentos y espera ante respuestas
429y5xx. - Recoge solo datos públicos y respeta la normativa de privacidad y los términos de X.