Exportar Perfis, Postagens e Dados da Loja do TikTok para CSV
Senior Web Scraping Engineer
TL;DR:
- A exportação de dados do TikTok para CSV requer uma tabela por nível de entidade. Perfis, postagens, produtos e SKUs não compartilham um esquema plano seguro.
- Identificadores devem permanecer como texto. IDs de conta, postagem, produto, vendedor e SKU podem perder precisão quando softwares de planilhas os interpretam como números.
- Métricas numéricas precisam de conversão explícita. Preserve valores ausentes enquanto converte contagens e preços válidos para os tipos pretendidos.
- Listas aninhadas precisam de serialização deliberada. Hashtags e pares de opções podem usar texto delimitado legível ou tabelas filhas separadas.
- CSV é criado pelo chamador. Os atores documentados retornam JSON em vez de planilhas nativas do Excel.
- Gratuito para começar. Novas contas do Scrapeless incluem crédito gratuito através do Painel do Scrapeless.
Introdução: achatando JSON é uma decisão de modelo de dados
JSON pode representar estatísticas aninhadas, arrays, opções de produtos e objetos SKU. Um arquivo CSV não pode. Uma exportação útil, portanto, começa decidindo qual entidade pertence a cada linha e como valores nulos, strings e coleções aninhadas sobreviverão à conversão.
Este tutorial mapeia as respostas de perfil, postagem e loja do Scrapeless TikTok em quatro arquivos CSV: perfis, postagens, produtos e SKUs. A conversão preserva a precisão do identificador, mantém as respostas brutas disponíveis e evita copiar arquivos de mídia quando um URL é suficiente.
A visão geral dos atores de dados do TikTok mapeia as entradas da solicitação que produzem esses objetos JSON.
Pipeline em um Relance
| Objeto JSON | Grão CSV | Candidato a chave primária |
|---|---|---|
| Detalhe do Usuário | Um perfil observado | ID da conta + hora de coleta |
| Item de Trabalho do Usuário | Uma postagem observada | ID da postagem + hora de coleta |
| Produto da Página da Loja | Um produto observado | ID do produto + região + hora de coleta |
| SKU da Página da Loja | Uma variante observada | ID do produto + região + ID do SKU + hora de coleta |
A exportação é uma transformação do lado da aplicação. Não afirma que os atores retornam arquivos CSV ou Excel diretamente.
Pré-requisitos
- Respostas JSON salvas de
scraper.tiktok.user.detail,scraper.tiktok.user.workouscraper.tiktok.shop.page - Um carimbo de data/hora de coleta registrado pela aplicação chamadora
- Um dicionário de campos definindo tipo e manipulação de nulos
- Software de planilha ou análise compatível com UTF-8 para inspeção
A transformação abaixo pode ser executada localmente com arquivos JSON fornecidos pelo leitor. Nenhuma credencial do Scrapeless é necessária após as respostas terem sido salvas.
Etapa 1: Defina Quatro Esquemas de Exportação
Perfis e postagens se conectam através de identificadores de conta, enquanto produtos e SKUs se conectam através do ID do produto e região. Mantenha esses níveis de entidade separados:
| Arquivo | Campos selecionados |
|---|---|
profiles.csv |
ID da conta, nome de usuário, sec_uid, estatísticas públicas, bandeiras, hora de coleta |
posts.csv |
ID da postagem, ID da conta, URL, descrição, hashtags, métricas públicas, hora de coleta |
products.csv |
ID do produto, região, ID do vendedor, nome, preço, moeda, estoque, avaliação, contagens, hora de coleta |
skus.csv |
ID do produto, região, ID do SKU, opções, preço do SKU, disponibilidade, hora de coleta |
O RFC 4180 define um formato CSV comum e regras de citação; a especificação do formato CSV é útil quando as exportações transitam entre sistemas. A documentação do módulo CSV do Python explica por que os arquivos devem ser abertos com newline="".
Etapa 2: Preserve IDs e Nulos
Todo identificador que parece numérico deve ser convertido para uma string antes da exportação. Isso se aplica a IDs de conta, postagem, produto, vendedor, música e SKU. Uma planilha pode, de outra forma, exibir notação científica ou arredondar dígitos.
Valores ausentes devem permanecer vazios ou usar um marcador de nulo documentado. Não transforme uma contagem de seguidores ausente, preço, quantidade de estoque, avaliação ou métrica de engajamento em zero.
A documentação Decimal do Python descreve a aritmética decimal exata para preços. Para uma exportação CSV simples, preservar o texto de preço da fonte é muitas vezes mais seguro do que convertê-lo para ponto flutuante binário.
Comece a Raspagem com o Scrapeless
Potencialize seu fluxo de trabalho de raspagem da web e automação com o Scrapeless!
Inscreva-se hoje e ganhe $5 em crédito gratuito — sem necessidade de cartão de crédito.Reclame seu crédito gratuito agora no Painel do Scrapeless.
Etapa 3: Achatar Campos Aninhados Sem Perder o Significado
Listas de exibição pequenas podem usar um delimitador que os dicionários de campo registram. Por exemplo, hashtags podem ser unidas com |, e opções de SKU podem se tornar Color=Black | Size=M. Mantenha uma tabela filha separada quando os elementos da lista precisarem de seus próprios campos ou análise.
Dicionários aninhados devem ser mapeados explicitamente. A moeda e os preços do produto vivem sob price; a quantidade agregada e a disponibilidade vivem sob stock; as contagens de perfil vivem sob statistics. Um nivelador recursivo genérico tende a produzir nomes de coluna instáveis e misturar níveis de entidade.
Etapa 4: Exporte as Quatro Tabelas em Python
O script espera até três arquivos salvos no diretório atual: profile.json, posts.json, e shop-product.json. Ele escreve um CSV somente quando a fonte correspondente 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)
O carimbo de data/hora é intencionalmente fornecido pelo leitor porque pertence ao evento de coleta, não à execução da exportação. Substitua o marcador antes da execução pelo carimbo de data/hora armazenado ao lado da resposta da fonte.
Etapa 5: Valide a Saída CSV
A validação deve checar o arquivo e o significado analítico:
- Abra cada CSV como UTF-8 e confirme que as descrições e os nomes dos produtos permanecem legíveis.
- Importe colunas de identificador explicitamente como texto e compare seus dígitos com o JSON da fonte.
- Conte entidades da fonte e linhas exportadas no mesmo nível de detalhe.
- Verifique se os valores ausentes permanecem vazios em vez de zero.
- Confirme que o preço sempre viaja com a moeda e o contexto do produto ou SKU.
- Inspecione descrições, hashtags e strings de opções contendo vírgulas, aspas ou quebras de linha.
Mantenha um pequeno dicionário de campo ao lado dos arquivos com caminho da fonte, coluna CSV, tipo, política de nulo e grão da entidade. Isso torna cada exportação reproduzível quando os campos selecionados ou ferramentas a jusante mudam.
Mantenha a Mídia como Referências
Os campos de imagem de avatar, capa, produto e SKU podem conter URLs. Exporte apenas os links necessários para a análise e evite baixar mídia não relacionada para o conjunto de dados. A duração das URLs pode variar, portanto um link CSV não deve ser tratado como um arquivo de mídia permanente.
Para pipelines maiores, mantenha o JSON bruto e os metadados da coleção em armazenamento durável, depois regenere visualizações CSV para cada analista ou ferramenta. Scrapeless fornece os atores através da Scraping API; revise a página de preços atual ao planejar o volume de coleta.
Conclusão: exporte por entidade, não por formato de resposta
Exportar dados do TikTok para CSV funciona quando a conversão preserva o grão da entidade, strings de identificador, nulos, significado de campo aninhado, moeda e tempo de coleta. Quatro arquivos focados são mais fáceis de validar e juntar do que uma tabela ampla que mistura perfis, postagens, produtos e variantes.
Pronto para Construir Exportações CSV Prontas para Análise?
Junte-se ao Scrapeless Discord ou à comunidade Telegram para comparar esquemas de exportação. Crie uma conta no Painel do Scrapeless quando estiver pronto para coletar o JSON da fonte.
FAQ
Q: Os atores do TikTok podem exportar arquivos CSV ou Excel diretamente?
Os atores documentados retornam JSON. O aplicativo chamador converte a resposta em CSV ou outro formato analítico.
Q: Por que os IDs do TikTok devem ser exportados como texto?
Texto preserva cada dígito quando ferramentas de planilhas e análises, de outra forma, forçariam um identificador longo que parece numérico.
Q: Perfis, postagens, produtos e SKUs devem compartilhar um CSV?
Perfis, postagens, produtos e SKUs devem usar tabelas separadas porque cada um tem um grão de linha e chave diferentes.
Q: Como as métricas ausentes do TikTok devem aparecer no CSV?
Métricas ausentes devem permanecer vazias ou usar um marcador de nulo documentado. Elas não devem se tornar zero sem evidência da fonte.
Q: A exportação precisa baixar imagens e vídeos?
A exportação não precisa baixar mídia. Armazene apenas as URLs da fonte necessárias para a análise e respeite a política de retenção do projeto.
Q: Exportar dados públicos do TikTok é legal?
A legalidade depende da jurisdição, propósito, método de acesso, dados e termos aplicáveis. Minimize os campos exportados e obtenha aconselhamento jurídico para o uso pretendido.
Na Scorretless, acessamos apenas dados disponíveis ao público, enquanto cumprem estritamente as leis, regulamentos e políticas de privacidade do site aplicáveis. O conteúdo deste blog é apenas para fins de demonstração e não envolve atividades ilegais ou infratoras. Não temos garantias e negamos toda a responsabilidade pelo uso de informações deste blog ou links de terceiros. Antes de se envolver em qualquer atividade de raspagem, consulte seu consultor jurídico e revise os termos de serviço do site de destino ou obtenha as permissões necessárias.



