Exportar perfiles de TikTok, publicaciones y datos de tienda a CSV
Senior Web Scraping Engineer
TL;DR:
- Exportar datos de TikTok a CSV requiere una tabla por nivel de entidad. Perfiles, publicaciones, productos y SKUs no comparten un esquema plano seguro.
- Los identificadores deben seguir siendo texto. Las ID de cuenta, publicación, producto, vendedor y SKU pueden perder precisión cuando el software de hojas de cálculo los interpreta como números.
- Las métricas numéricas necesitan conversión explícita. Preserva los valores faltantes mientras conviertes cuentas y precios válidos a los tipos deseados.
- Las listas anidadas necesitan serialización deliberada. Los hashtags y los pares de opciones pueden usar texto delimitado legible o tablas hijas separadas.
- CSV es creado por el llamador. Los actores documentados devuelven JSON en lugar de libros de trabajo nativos de Excel.
- Gratis para comenzar. Las nuevas cuentas de Scrapeless incluyen crédito gratuito a través del Dashboard de Scrapeless.
Introducción: aplanar JSON es una decisión de modelo de datos
JSON puede representar estadísticas anidadas, arreglos, opciones de productos y objetos SKU. Un archivo CSV no puede. Por lo tanto, una exportación útil comienza decidiendo qué entidad pertenece en cada fila y cómo los valores nulos, cadenas y colecciones anidadas sobrevivirán la conversión.
Este tutorial mapea las respuestas de perfil, publicación y tienda de TikTok de Scrapeless en cuatro archivos CSV: perfiles, publicaciones, productos y SKUs. La conversión preserva la precisión de los identificadores, mantiene las respuestas en bruto disponibles y evita copiar archivos multimedia cuando una URL es suficiente.
La visión general del actor de datos de TikTok mapea las entradas de solicitud que producen estos objetos JSON.
Pipeline a grandes rasgos
| Objeto JSON | Grano CSV | Candidato a clave primaria |
|---|---|---|
| Detalle del Usuario | Un perfil observado | ID de cuenta + tiempo de colección |
| Artículo de Trabajo del Usuario | Una publicación observada | ID de publicación + tiempo de colección |
| Producto de la Página de la Tienda | Un producto observado | ID de producto + región + tiempo de colección |
| SKU de la Página de la Tienda | Una variante observada | ID de producto + región + ID de SKU + tiempo de colección |
La exportación es una transformación del lado de la aplicación. No afirma que los actores devuelvan archivos CSV o de Excel directamente.
Requisitos previos
- Respuestas JSON guardadas de
scraper.tiktok.user.detail,scraper.tiktok.user.workoscraper.tiktok.shop.page - Una marca de tiempo de colección registrada por la aplicación que llama
- Un diccionario de campos que define el tipo y el manejo de nulos
- Software de hojas de cálculo o análisis compatible con UTF-8 para inspección
La transformación a continuación es ejecutable localmente con archivos JSON suministrados por el lector. No se requiere ninguna credencial de Scrapeless después de que las respuestas hayan sido guardadas.
Etapa 1: Definir Cuatro Esquemas de Exportación
Los perfiles y las publicaciones se conectan a través de identificadores de cuenta, mientras que los productos y los SKUs se conectan a través de ID de producto y región. Mantén estos niveles de entidad separados:
| Archivo | Campos seleccionados |
|---|---|
profiles.csv |
ID de cuenta, nombre de usuario, sec_uid, estadísticas públicas, banderas, tiempo de colección |
posts.csv |
ID de publicación, ID de cuenta, URL, descripción, hashtags, métricas públicas, tiempo de colección |
products.csv |
ID de producto, región, ID de vendedor, nombre, precio, moneda, stock, calificación, conteos, tiempo de colección |
skus.csv |
ID de producto, región, ID de SKU, opciones, precio de SKU, disponibilidad, tiempo de colección |
RFC 4180 define un formato CSV común y reglas de citación; la especificación del formato CSV es útil cuando las exportaciones se mueven entre sistemas. La documentación del módulo CSV de Python explica por qué los archivos deben abrirse con newline="".
Etapa 2: Preservar IDs y Nulos
Cada identificador que parezca numérico debe convertirse en una cadena antes de la exportación. Esto se aplica a las ID de cuenta, publicación, producto, vendedor, música y SKU. Una hoja de cálculo de lo contrario puede mostrar notación científica o redondear dígitos.
Los valores faltantes deben permanecer vacíos o usar un marcador de nulo documentado. No conviertas un conteo de seguidores faltante, precio, cantidad de stock, calificación o métrica de participación en cero.
La documentación Decimal de Python describe la aritmética decimal exacta para precios. Para una exportación CSV simple, preservar el texto de precio fuente suele ser más seguro que convertirlo a punto flotante binario.
Empieza a Raspar con Scrapeless
¡Potencia tu flujo de trabajo de raspeo web y automatización con Scrapeless!
Regístrate hoy y obtén $5 en crédito gratuito — sin necesidad de tarjeta de crédito.Reclama tu crédito gratuito ahora en el Dashboard de Scrapeless.
Etapa 3: Aplanar Campos Anidados Sin Perder Significado
Las listas de visualización pequeñas pueden usar un delimitador que registre el diccionario de campos. Por ejemplo, los hashtags se pueden unir con |, y las opciones de SKU pueden convertirse en Color=Black | Size=M. Mantenga una tabla hijo separada cuando los elementos de la lista necesiten sus propios campos o análisis.
Los diccionarios anidados deben estar mapeados explícitamente. La moneda del producto y los precios viven bajo price; la cantidad agregada y la disponibilidad viven bajo stock; los recuentos de perfiles viven bajo statistics. Un aplanador recursivo genérico tiende a producir nombres de columnas inestables y mezclar niveles de entidad.
Etapa 4: Exportar las Cuatro Tablas en Python
El script espera hasta tres archivos guardados en el directorio actual: profile.json, posts.json, y shop-product.json. Solo escribe un CSV cuando la fuente correspondiente existe.
python
import csv
import json
from pathlib import Path
COLLECTED_AT = "reader-supplied-utc-timestamp"
def load_if_present(path):
return json.loads(path.read_text(encoding="utf-8")) if path.exists() else None
def text_id(value):
return "" if value is None else str(value)
def write_csv(path, rows):
if not rows:
return
with path.open("w", newline="", encoding="utf-8") as output:
writer = csv.DictWriter(output, fieldnames=list(rows[0]))
writer.writeheader()
writer.writerows(rows)
profile = load_if_present(Path("profile.json"))
posts_response = load_if_present(Path("posts.json"))
shop = load_if_present(Path("shop-product.json"))
if profile:
statistics = profile.get("statistics") or {}
write_csv(Path("profiles.csv"), [{
"collected_at": COLLECTED_AT,
"account_id": text_id(profile.get("account_id")),
"unique_id": profile.get("unique_id"),
"sec_uid": profile.get("sec_uid"),
"followers": statistics.get("followers"),
"following": statistics.get("following"),
"likes": statistics.get("likes"),
"videos": statistics.get("videos"),
"is_verified": profile.get("is_verified"),
"is_private": profile.get("is_private"),
}])
if posts_response:
post_rows = []
for item in posts_response.get("items") or []:
post_rows.append({
"collected_at": COLLECTED_AT,
"post_id": text_id(item.get("post_id")),
"author_id": text_id(item.get("author_id")),
"post_url": item.get("post_url"),
"description": item.get("description"),
"create_time": item.get("create_time"),
"hashtags": "|".join(str(v) for v in (item.get("hashtags") or [])),
"play_count": item.get("play_count"),
"like_count": item.get("like_count"),
"comment_count": item.get("comment_count"),
"share_count": item.get("share_count"),
"collect_count": item.get("collect_count"),
"is_pinned": item.get("is_pinned"),
})
write_csv(Path("posts.csv"), post_rows)
if shop:
price = shop.get("price") or {}
stock = shop.get("stock") or {}
product_id = text_id(shop.get("product_id"))
region = shop.get("region")
write_csv(Path("products.csv"), [{
"collected_at": COLLECTED_AT,
"product_id": product_id,
"region": region,
"seller_id": text_id(shop.get("seller_id")),
"name": shop.get("name"),
"currency": price.get("currency"),
"sale_price": price.get("sale_price"),
"original_price": price.get("original_price"),
"available_quantity": stock.get("available_quantity"),
"in_stock": stock.get("in_stock"),
"rating": shop.get("rating"),
"review_count": shop.get("review_count"),
"sold_count": shop.get("sold_count"),
}])
sku_rows = []
for sku in shop.get("skus") or []:
sku_price = sku.get("price") or {}
sku_rows.append({
"collected_at": COLLECTED_AT,
"product_id": product_id,
"region": region,
"sku_id": text_id(sku.get("sku_id")),
"options": " | ".join(
f"{v.get('name', '')}={v.get('value', '')}"
for v in (sku.get("options") or [])
),
"currency": sku_price.get("currency"),
"sale_price": sku_price.get("sale_price"),
"available_quantity": sku.get("available_quantity"),
"in_stock": sku.get("in_stock"),
})
write_csv(Path("skus.csv"), sku_rows)
La marca de tiempo es deliberadamente suministrada por el lector porque pertenece al evento de colección, no a la ejecución de exportación. Reemplace el marcador de posición antes de la ejecución con la marca de tiempo almacenada al lado de la respuesta de la fuente.
Etapa 5: Validar la Salida CSV
La validación debe verificar el archivo y el significado analítico:
- Abra cada CSV como UTF-8 y confirme que las descripciones y los nombres de los productos sigan siendo legibles.
- Importe explícitamente las columnas de identificadores como texto y compare sus dígitos con el JSON de la fuente.
- Cuente las entidades de la fuente y las filas exportadas en el mismo grano.
- Verifique que los valores faltantes permanezcan vacíos en lugar de cero.
- Confirme que el precio siempre viaje con el contexto de moneda y producto o SKU.
- Inspeccione descripciones, hashtags y cadenas de opciones que contengan comas, comillas o saltos de línea.
Mantenga un pequeño diccionario de campos al lado de los archivos con la ruta de origen, columna CSV, tipo, política de nulos y grano de entidad. Esto hace que cada exportación sea reproducible cuando los campos seleccionados o las herramientas posteriores cambian.
Mantener los Medios como Referencias
Los campos de imagen de avatar, portada, producto y SKU pueden contener URLs. Exportar solo los enlaces necesarios para el análisis y evitar descargar medios no relacionados en el conjunto de datos. Las vidas útiles de las URL pueden variar, por lo que un enlace CSV no debería tratarse como un archivo de medios permanente.
Para tuberías más grandes, mantenga el JSON sin procesar y los metadatos de colección en almacenamiento duradero, luego regenere las vistas CSV para cada analista o herramienta. Scrapeless proporciona los actores a través de Scraping API; revise la página de precios actual al planear el volumen de colección.
Conclusión: exportar por entidad, no por forma de respuesta
Exportar datos de TikTok a CSV funciona cuando la conversión preserva el grano de la entidad, las cadenas de identificador, los nulos, el significado de campo anidado, la moneda y el tiempo de colección. Cuatro archivos enfocados son más fáciles de validar y unir que una tabla amplia que mezcla perfiles, publicaciones, productos y variantes.
¿Listo para Construir Exportaciones CSV Listas para Análisis?
Únase al Scrapeless Discord o a la comunidad de Telegram para comparar esquemas de exportación. Cree una cuenta en el Scrapeless Dashboard cuando esté listo para recoger el JSON de la fuente.
Preguntas Frecuentes
P: ¿Pueden los actores de TikTok exportar archivos CSV o Excel directamente?
Los actores documentados devuelven JSON. La aplicación que llama convierte la respuesta en CSV u otro formato analítico.
P: ¿Por qué se deben exportar los ID de TikTok como texto?
El texto preserva cada dígito cuando las herramientas de hoja de cálculo y analíticas de otro modo coercionan un identificador que parece un número largo.
P: ¿Deben los perfiles, publicaciones, productos y SKUs compartir un CSV?
Los perfiles, publicaciones, productos y SKUs deben usar tablas separadas porque cada uno tiene un grano de fila diferente y clave.
P: ¿Cómo deben aparecer las métricas faltantes de TikTok en CSV?
Las métricas faltantes deben permanecer vacías o usar un marcador de nulo documentado. No deben convertirse en cero sin evidencia de la fuente.
P: ¿Es necesario que la exportación descargue imágenes y videos?
La exportación no necesita descargar medios. Almacene solo las URL de origen requeridas por el análisis y respete la política de retención del proyecto.
P: ¿Es legal exportar datos públicos de TikTok?
La legalidad depende de la jurisdicción, el propósito, el método de acceso, los datos y los términos aplicables. Minimice los campos exportados y obtenga asesoramiento legal para el uso previsto.
En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.



