Scraper de imagens do Twitter: baixe todas as imagens
Um scraper de imagens do Twitter encontra os posts de uma conta ou busca que têm fotos, lê o link pbs.twimg.com de cada foto e a baixa com name=orig, porque o link simples que o X serve para em 1.200 pixels de largura.
Resposta curta: Sem login, o x.com mostra só alguns dos posts mais novos de um perfil, então extensões de navegador e downloaders leem o X pelo seu login ou pelo cookie da sua sessão. Para coletar todas as imagens sem arriscar sua conta, use a Sorsa API: POST /search-tweets com filter:images devolve cerca de 20 posts com imagem por requisição, a partir de US$ 0,07 por 1.000, e 100 requisições grátis cobrem as primeiras 2.000.
- Endpoint
POST /search-tweets- Tamanho da página
- cerca de 20 posts por requisição
- Preço
- a partir de US$ 0,07 por 1.000
#Como funciona um scraper de imagens do Twitter
Todo scraper de imagens do Twitter faz as mesmas três coisas, seja qual for a base em que roda. Para um único post você não precisa de nenhuma delas: cole o link dele no Downloader de mídia, gratuito, e salve cada foto em tamanho original. Para centenas ou milhares de imagens, o trabalho é assim:
-
Encontre os posts que têm fotos. O operador de busca
filter:imagesdo X mantém só os posts com pelo menos uma imagem, de uma conta comfrom:ou sobre qualquer tema. -
Leia o link de cada foto. Toda imagem fica no servidor de mídia do X, em um link como
https://pbs.twimg.com/media/G4kQ2vXbIAAm7Rz.jpg. -
Baixe o original. Peça esse link com
?format=jpg&name=orig; sem isso, o X envia uma cópia que cabe em 1.200 pixels.
As ferramentas diferem no passo 1, na origem dos posts. O x.com mostra a um visitante sem login posts avulsos e alguns dos posts mais novos de um perfil, e manda a busca para a página de login. Extensões de navegador, downloaders de desktop e ferramentas de linha de comando, por isso, leem o X por meio de uma conta logada. A documentação delas mesmas diz isso: um downloader em lote muito usado pede o seu cookie auth_token e avisa que a conta pode ser suspensa.
Só uma API alcança as imagens de uma conta inteira: a API oficial do X, com uma conta de desenvolvedor e OAuth, ou uma API de dados do Twitter/X com uma única chave.
O guia sobre como fazer web scraping do Twitter cobre todas as rotas e o que as quebra, e o comparativo dos melhores scrapers de Twitter precifica as ferramentas uma a uma.
#Baixe todas as imagens de uma conta do X
A Sorsa API, uma API e scraper do Twitter (X), devolve os posts com imagem de uma conta como JSON, com o link de cada foto dentro, cerca de 20 posts por requisição e desde 2006. Quatro passos levam de um handle a uma pasta de arquivos originais.
-
Obtenha uma chave. Cadastre-se e copie a chave de API do seu painel. As primeiras 100 requisições são grátis, sem cartão.
-
Busque os posts com imagem da conta. Envie
from:maisfilter:imagesparaPOST /search-tweets(abre em uma nova aba), comorderdefinido comolatestpara trazer os mais novos primeiro.Terminal curl -X POST "https://api.sorsa.io/v3/search-tweets" \ -H "ApiKey: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"query": "from:northfield_photo_lab filter:images", "order": "latest"}'Response200 OK { "tweets": [ { "id": "1984213377309245441", "created_at": "2026-10-30T14:12:09Z", "full_text": "Fog over the north ridge this morning.", "likes_count": 412, "entities": [ { "type": "photo", "link": "https://pbs.twimg.com/media/G4kQ2vXbIAAm7Rz.jpg", "preview": "https://pbs.twimg.com/media/G4kQ2vXbIAAm7Rz.jpg" }, { "type": "photo", "link": "https://pbs.twimg.com/media/G4kQ2vZaQAEw9Lp.jpg", "preview": "https://pbs.twimg.com/media/G4kQ2vZaQAEw9Lp.jpg" } ], "user": { "username": "northfield_photo_lab", "display_name": "Northfield Photo Lab", "media_count": 1840 } } ], "next_cursor": "DAADDAABCgABG8vZ0Qm__-oKAAIbuv3MBVvA0AgAAwAAAAIAAA" } -
Siga o cursor. Um cursor é um token que marca onde a próxima página começa: envie
next_cursorde volta no corpo da requisição seguinte até ele voltar vazio.Cada requisição devolve cerca de 20 posts com imagem e um cursor para a próxima página; cada link de foto vira um arquivo em tamanho original e uma linha em images.csv. -
Salve cada foto em tamanho original. O script mantém só as entidades
photo, reescreve cada link paraname=orige nomeia os arquivos<post id>_<n>.jpg. Ele registra cada arquivo emimages.csve guarda o cursor depois de cada página, então uma execução interrompida continua de onde parou.import csv import os import sys import time from urllib.parse import parse_qs, urlparse import requests API = "https://api.sorsa.io/v3/search-tweets" HEADERS = {"ApiKey": "YOUR_API_KEY"} def orig(url): """Rewrite a pbs.twimg.com image link to its original size.""" u = urlparse(url) path = u.path fmt = parse_qs(u.query).get("format", ["jpg"])[0] if "." in path.rsplit("/", 1)[-1]: path, fmt = path.rsplit(".", 1) fmt = fmt.split(":")[0] return f"https://pbs.twimg.com{path}?format={fmt}&name=orig", fmt def photo_urls(tweet): """Original-size links of every photo in a post.""" for e in tweet.get("entities") or []: if e.get("type") != "photo": continue for link in (e.get("link"), e.get("preview")): if link and "pbs.twimg.com/media/" in link: yield orig(link) break def post(body): while True: r = requests.post(API, headers=HEADERS, json=body, timeout=60) if r.status_code == 429: # over 20 requests a second: wait time.sleep(1) continue r.raise_for_status() # 403: no key, or no requests left return r.json() def download(query, folder): os.makedirs(folder, exist_ok=True) state = os.path.join(folder, "cursor.txt") body = {"query": query, "order": "latest"} if os.path.exists(state): # resume a stopped run body["next_cursor"] = open(state).read().strip() log_path = os.path.join(folder, "images.csv") with open(log_path, "a", newline="", encoding="utf-8") as f: log = csv.writer(f) while True: page = post(body) for t in page.get("tweets", []): for n, (url, fmt) in enumerate(photo_urls(t), 1): path = os.path.join(folder, f"{t['id']}_{n}.{fmt}") if os.path.exists(path): continue img = requests.get(url, timeout=60) img.raise_for_status() with open(path, "wb") as out: out.write(img.content) log.writerow([t["id"], t["created_at"], url, path]) cursor = page.get("next_cursor") if not cursor: break body["next_cursor"] = cursor with open(state, "w") as s: s.write(cursor) if os.path.exists(state): os.remove(state) if __name__ == "__main__": download(sys.argv[1], sys.argv[2])
Rode-o com uma busca e um nome de pasta: python twitter_images.py "from:northfield_photo_lab filter:images" northfield_photo_lab. Uma resposta 403 significa que a chave está ausente ou sem requisições; um 429 significa mais de 20 requisições em um segundo, e o script espera um segundo e tenta de novo. Arquivos que já estão no disco são pulados, então rodar o mesmo comando de novo só acrescenta as imagens novas.
Bom saber
Um quote ou um retweet carrega fotos de outra pessoa: elas ficam em
quoted_status.entitieseretweeted_status.entities, e o script as deixa de fora. Acrescente essas duas listas aphoto_urlspara mantê-las. Para dimensionar o trabalho antes,GET /info(abre em uma nova aba) devolve omedia_countda conta, as fotos e vídeos que ela postou.
Para percorrer a timeline da conta post a post em vez de buscá-la, envie o handle para POST /user-tweets (abre em uma nova aba). Ele devolve os mesmos objetos de tweet, 20 por requisição, então photo_urls lê as imagens deles sem mudanças; posts só de texto vêm junto, então o trabalho leva mais requisições.
#Faça scraping das imagens de uma hashtag ou de uma busca
O mesmo script coleta as imagens de qualquer tema: só a consulta muda. filter:images se combina com todos os operadores de busca do X, e a busca alcança o passado até 2006.
| Trabalho | Consulta |
|---|---|
| Uma hashtag | #nightphotography filter:images |
| Uma palavra-chave em um mês | aurora filter:images since:2026-10-01 until:2026-11-01 |
| Só imagens populares | #interiordesign filter:images min_faves:500 |
| Uma conta sem as respostas dela | from:northfield_photo_lab filter:images -filter:replies |
| Várias contas ao mesmo tempo | (from:northfield_photo_lab OR from:harborline_studio_co) filter:images |
Uma hashtag
- Consulta
#nightphotography filter:images
Uma palavra-chave em um mês
- Consulta
aurora filter:images since:2026-10-01 until:2026-11-01
Só imagens populares
- Consulta
#interiordesign filter:images min_faves:500
Uma conta sem as respostas dela
- Consulta
from:northfield_photo_lab filter:images -filter:replies
Várias contas ao mesmo tempo
- Consulta
(from:northfield_photo_lab OR from:harborline_studio_co) filter:images
Para um tema grande, rode uma janela de datas por mês, cada uma em sua própria pasta. Cada execução fica curta, uma que falhou é fácil de repetir, e as janelas rodam lado a lado em uma única chave, até 20 requisições por segundo em todos os planos. Defina order como popular para os melhores posts do X primeiro ou latest para os mais novos. Todos os operadores, com exemplos, estão no guia de operadores de busca do Twitter.
As imagens de uma hashtag mudam conforme as pessoas postam, então um trabalho de monitoramento reexecuta a janela mais recente em intervalos. Como o script pula os arquivos que já tem e registra só os novos, cada nova execução acrescenta apenas as imagens postadas desde a anterior.
#Obtenha cada imagem em tamanho original
O X guarda cada upload inteiro, mas serve cópias menores, e a cópia que você recebe depende apenas do valor de name no link. Em 2 de novembro de 2026 pedimos quatro imagens públicas em todos os tamanhos que o X serve e medimos o que voltou; a escada abaixo é de uma foto postada no fim de outubro de 2026.
- O link simples é a cópia
medium. Um link pbs.twimg.com semnamedevolve uma imagem que cabe em 1.200 pixels. largepara em 2.048 pixels e4096x4096em 4.096. Um upload menor que isso volta no próprio tamanho.name=origdevolve o próprio upload. Para a foto acima, isso foram 8.000 × 4.501 pixels, 44 vezes os pixels do link simples.format=pngnão acrescenta detalhe. Ele recodifica um upload JPG em um PNG várias vezes maior, eformat=png&name=origdevolve 404 para um JPG, então mantenha o formato que o link já tem.
Baixar de pbs.twimg.com é uma requisição HTTP comum, sem chave, então os arquivos em si não gastam requisições da API: só encontrar os posts gasta.
#Baixe imagens em massa sem código
Sem código, o trabalho se divide em dois: exportar os links das imagens e depois baixar os arquivos.
-
Exporte os links dos posts recentes. A ferramenta Exportar tweets, gratuita, salva os posts mais recentes de uma conta em CSV, Excel ou JSON com uma coluna
media_urls; ative Somente posts com mídia. -
Exporte uma conta inteira ou uma busca. No playground da API, rode
POST /search-tweetscom sua chave e uma consulta comofrom:northfield_photo_lab filter:images; ele segue o cursor por você e exporta cada página para CSV ou JSON. -
Transforme os links em originais. Cole os links das imagens no conversor abaixo e copie os links em tamanho original que ele devolve.
-
Baixe a lista. Carregue os links em qualquer gerenciador de downloads que aceite uma lista de URLs, e ele salva os arquivos de uma vez.
Um por linha, ou cole uma coluna inteira de CSV.
3 linksCole quantos links do pbs.twimg.com quiser, um por linha ou direto de uma coluna de CSV; nada sai do seu navegador.
#Quanto custa baixar imagens em massa
Na Sorsa API, os posts com imagem custam a partir de US$ 0,07 por 1.000, porque uma página de busca com cerca de 20 posts é uma requisição, não importa quantas fotos ela tenha. Na API oficial do X, os links de imagem só vêm pela expansão de mídia. A partir de 22 de novembro de 2026, o X cobra cada imagem expandida (abre em uma nova aba) a US$ 0,005 além da leitura do post de US$ 0,005: US$ 10,00 por 1.000 posts com uma imagem, US$ 25,00 quando cada um tem quatro.
Lado a lado, as formas de obter os posts diferem no que exigem de você tanto quanto no preço.
| Forma de obter os posts | O que exige | Custo por 1.000 posts com imagem |
|---|---|---|
| Sorsa API | Uma chave de API | a partir de US$ 0,07 |
| API oficial do X | Conta de desenvolvedor e OAuth | US$ 10,00 a partir de 22 de nov. de 2026 (post e uma imagem) |
| Extensões e downloaders | Seu login do X ou o cookie da sua sessão | Grátis ou por assinatura, com a conta em risco |
Sorsa API
- O que exige
- Uma chave de API
- Custo por 1.000 posts com imagem
- a partir de US$ 0,07
API oficial do X
- O que exige
- Conta de desenvolvedor e OAuth
- Custo por 1.000 posts com imagem
- US$ 10,00 a partir de 22 de nov. de 2026 (post e uma imagem)
Extensões e downloaders
- O que exige
- Seu login do X ou o cookie da sua sessão
- Custo por 1.000 posts com imagem
- Grátis ou por assinatura, com a conta em risco
API oficial do X
US$ 10.000
para 1 milhão posts com imagem
US$ 0,010 por post com uma imagem, a partir de 22 de nov.
Sorsa API
a partir deUS$ 70
para 1 milhão posts com imagem
a partir de US$ 0,07 por 1.000
140x mais barato
O pagamento por uso (abre em uma nova aba) da API oficial do X também para em 3 milhões de leituras de posts por ciclo de cobrança; acima disso, o X vende só contratos Enterprise. Na Sorsa API, as 100 requisições grátis cobrem cerca de 2.000 posts com imagem, requisições com falha nunca são cobradas, e a tarifa do plano por 1.000 requisições vale para todos os endpoints.
O tempo decorre do limite de requisições, 20 por segundo por chave em todos os planos. 1 milhão de posts com imagem levam 50 mil requisições, cerca de 42 minutos com as janelas de datas rodando lado a lado; os arquivos de imagem então são baixados direto dos servidores do X, na velocidade da sua conexão.
#Obtenha as imagens de posts específicos
Para obter as imagens de posts que você já tem, envie os links ou IDs deles para POST /tweet-info-bulk (abre em uma nova aba): até 100 posts por requisição, a partir de US$ 0,014 por 1.000, com a mesma lista entities que a busca devolve.
curl -X POST "https://api.sorsa.io/v3/tweet-info-bulk" \
-H "ApiKey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"tweet_links": [
"https://x.com/northfield_photo_lab/status/1984213377309245441",
"1983850021164118016"]}'
Um único post vai para POST /tweet-info (abre em uma nova aba) com tweet_link. Passe o link de cada foto pela mesma função orig e você tem os arquivos em tamanho original. Na API oficial do X, a mesma consulta exige um bearer token mais expansions=attachments.media_keys e media.fields=url, e a partir de 22 de novembro cada imagem na resposta acrescenta US$ 0,005.
Vídeos e GIFs voltam na mesma lista entities com o próprio type. Os arquivos MP4 e as variantes de qualidade deles exigem mais um passo, coberto no guia para baixar mídia do Twitter por API; para exportações de texto completo com uma coluna de mídia, veja como baixar todos os tweets de um usuário.
#Comece o seu primeiro download de imagens
Para baixar todas as imagens de uma conta do X ou de uma busca em tamanho original, use a Sorsa API: cerca de 20 posts com imagem por requisição, a partir de US$ 0,07 por 1.000, sem risco para a sua conta do X. Copie o script, coloque sua chave, e suas 100 requisições grátis baixam os primeiros 2.000 posts com imagem.
#Perguntas frequentes
Existe um scraper de imagens do Twitter gratuito?
Sim, para trabalhos pequenos. O Downloader de mídia, gratuito, salva todas as fotos de um post em tamanho original, e a ferramenta Exportar tweets, também gratuita, exporta os posts mais recentes de uma conta com os links das imagens. Para contas inteiras e buscas, toda conta nova da Sorsa API ganha 100 requisições grátis: cerca de 2.000 posts com imagem, sem cartão, e as requisições nunca expiram.
Qual API devo usar para fazer scraping de imagens do Twitter?
Use a Sorsa API: POST /search-tweets com filter:images devolve cerca de 20 posts com imagem por requisição a partir de US$ 0,07 por 1.000, contra US$ 10,00 por 1.000 posts com uma imagem na API oficial do X a partir de 22 de novembro de 2026. Ela precisa de uma chave de API no lugar de uma conta de desenvolvedor e OAuth, busca desde 2006, roda a 20 requisições por segundo em todos os planos e nunca pede o seu login do X.
É legal fazer scraping de imagens do Twitter?
Sim. Fazer scraping de imagens públicas para pesquisa ou arquivo é legal e comum. Os direitos autorais de cada imagem continuam com quem a criou, então obtenha a permissão do dono antes de publicar ou vender os arquivos. A Sorsa API nunca pede o seu login do X, então sua conta do X fica fora disso.
Posso baixar imagens de uma conta privada do Twitter?
Não. Os posts de uma conta protegida só são visíveis aos seguidores que ela aprovou, então nenhuma API os devolve, a Sorsa API inclusive, e uma requisição por eles nunca é cobrada. Ferramentas que dizem o contrário leem o X pelo login de uma conta que segue a conta protegida.
O dono da conta vê que eu baixei as imagens dele?
Não. O X não avisa ninguém quando seus posts ou imagens são vistos ou baixados. Com a Sorsa API, as requisições vão da Sorsa API para o X, então nem o X nem o dono da conta ficam sabendo quem pediu, e a sua própria conta do X não participa de nada disso.
Posso baixar vídeos e GIFs do Twitter da mesma forma?
Em parte. Vídeos e GIFs ficam na mesma lista entities que as fotos, com o próprio type, e uma miniatura em preview, então a busca e o cursor funcionam do mesmo jeito. O arquivo MP4 reproduzível e as variantes de qualidade dele exigem mais um passo, que o guia para baixar mídia do Twitter por API percorre.
#Como verificamos
Em 2 de novembro de 2026, pedimos quatro imagens públicas de pbs.twimg.com em todos os tamanhos e formatos e registramos a largura e o tamanho do arquivo de cada resposta. Também passamos um post público pelo nosso Downloader de mídia gratuito, que roda na Sorsa API, para ver o link de foto que ele devolve. Testamos o tratamento de links e o salvamento de arquivos dos dois scripts contra um substituto da API e arquivos reais de pbs.twimg.com. Os endpoints, campos e tamanhos de página vêm da referência de API ao vivo da Sorsa API; os preços da API oficial do X vêm de docs.x.com e do aviso do X de 23 de outubro de 2026, ambos lidos no mesmo dia. As respostas de API mostradas são exemplos encurtados, montados a partir da referência.