Web scraping é de comer?
O web scraping é uma técnica muito usada para coletar dados de plataformas online, como sites e redes sociais, que de outra forma, seriam obtidos manualmente por um usuário. É uma tecnologia utilizada para automatizar processos de consulta de dados públicos e pode ser particularmente útil para análises de social listening.
Como Coletar Dados do Instagram Usando Python: Um Guia Passo a Passo
Neste artigo, vamos explorar como você pode usar Python para coletar dados de posts no Instagram. Vamos explicar o código passo a passo, começando pela importação das bibliotecas necessárias.
Passo 1: Importar Bibliotecas
Para começar, precisamos importar algumas bibliotecas que nos ajudarão a fazer a coleta de dados e a manipulação dos mesmos. No Python, as bibliotecas são conjuntos de códigos prontos que você pode usar em seus próprios projetos. A principal biblioteca que vou utilizar aqui, é a Instaloader e você pode consultar a documentação dela neste link.
import instaloader
import csv
import time
import threading
from datetime import datetime
O que cada biblioteca faz:
instaloader:
Esta biblioteca é usada para baixar informações do Instagram, como posts e comentários.csv:
Utilizamos essa biblioteca para criar e manipular arquivos CSV, onde armazenaremos os dados coletados.time:
Ajuda a adicionar pausas entre as ações, o que é útil para não sobrecarregar o Instagram com muitas solicitações.threading:
Permite executar várias tarefas ao mesmo tempo (chamadas de threads), o que acelera o processo de coleta de dados.datetime
: Usada para trabalhar com datas e horas, permitindo que filtremos posts com base na data.
Passo 2: Configurar o Script
No início do script, definimos a data limite para a coleta de dados. Também configuramos a conexão com o Instagram e preparamos o arquivo onde vamos salvar os dados.
data_limite = datetime(2024, 1, 1)
instagram = instaloader.Instaloader()
instagram.load_session_from_file('insira_aqui_seu_@')
dados = []
csvfile = open('coleta.csv', 'a', encoding='utf-8')
writer = csv.writer(csvfile)
writer.writerow(['numero_post', 'username', 'likes', 'views', 'data',
'link_post', 'imagem', 'descricao_post', 'comentarios'])
Explicação:
data_limite = datetime(2024, 1, 1)
: Define a data até a qual queremos coletar posts. No nosso caso, estamos interessados apenas em posts feitos após 1º de janeiro de 2024.instagram = instaloader.Instaloader()
: Cria um objeto que nos permite interagir com o Instagram.instagram.load_session_from_file('insira_aqui_seu_@')
: Carrega uma sessão salva para evitar a necessidade de login repetido. (No campoinsira_aqui_seu_@
você deve inserir seu @ do instagram. Como eu não possuo uma conta, precisei criar apenas para essa coleta, mas depois logo excluí, minha saúde mental agradece).dados = []
: Inicializa uma lista vazia para armazenar os dados coletados.csvfile = open('coleta.csv', 'a', encoding='utf-8')
: Abre (ou cria) um arquivo CSV para salvar os dados.writer = csv.writer(csvfile)
: Cria um objeto que permite escrever no arquivo CSV.writer.writerow(['numero_post', 'username', 'likes', 'views', 'data', 'link_post', 'imagem', 'descricao_post', 'comentarios'])
: Escreve o cabeçalho no arquivo CSV, definindo os nomes das colunas.
Passo 3: Criar Função para Coletar Posts
A próxima parte do código define uma função que coleta posts de um usuário específico no Instagram.
def get_posts_by_username(username):
numero_post = 0
for post in instaloader.Profile.from_username(instagram.context, username).get_posts():
time.sleep(10)
numero_post += 1
print('Post: ' + post.shortcode)
print(numero_post)
if post.date > data_limite and numero_post > 4:
print("Data do post é menor que 01/01/2024 e número de post maior que 4. Parando a coleta.")
break
substring = "insira_aqui_a_palavra_que_voce_quer_buscar"
if post.caption is not None and substring in post.caption.lower():
comentarios = []
for comment in post.get_comments():
comentarios.append(comment.text)
descricao_formatada = post.caption.replace('\n', ' ') if post.caption else ''
dado = {
"username": post.owner_username,
"likes": post.likes,
"views": post.video_view_count,
"data": post.date.strftime("%m/%d/%Y"),
"link_post": post.shortcode,
"imagem": post.url,
"descricao_post": descricao_formatada,
"comentarios": comentarios,
"contagem_comentarios": post.comments
}
comentarios_formatados = [comentario.replace('\n', ' ') for comentario in comentarios]
with lock:
for comentario in comentarios_formatados:
writer.writerow([numero_post, dado['username'], dado['likes'], dado['views'], dado['data'],
dado['link_post'], dado['imagem'], dado['descricao_post'], comentario])
print('Finalizado usuário: ' + username)
Explicação:
def get_posts_by_username(username)
: Define uma função que coleta posts de um usuário.numero_post = 0
: Inicializa um contador de posts.for post in instaloader.Profile.from_username(instagram.context, username).get_posts()
: Obtém todos os posts do usuário.time.sleep(10)
: Pausa por 10 segundos entre as solicitações para evitar sobrecarregar o Instagram.if post.date > data_limite and numero_post > 4
: Verifica se o post é recente e se o número de posts excede 4. Se sim, interrompe a coleta.substring = "insira_aqui_a_palavra_que_voce_quer_buscar"
: Define a palavra-chave para filtrar os posts.if post.caption is not None and substring in post.caption.lower()
: Verifica se o post contém a palavra-chave.comentarios = []
: Inicializa uma lista para armazenar comentários.for comment in post.get_comments()
: Obtém e armazena todos os comentários do post.descricao_formatada = post.caption.replace('\n', ' ') if post.caption else ''
: Formata a descrição do post.dado = { ... }
: Cria um dicionário com as informações do post.comentarios_formatados = [comentario.replace('\n', ' ') for comentario in comentarios]
: Formata os comentários.with lock:
: Garante que a escrita no arquivo CSV seja segura quando várias threads estão em execução.
Passo 4: Executar a Coleta de Dados em Múltiplas Threads
Para acelerar a coleta de dados, usamos múltiplas threads, uma para cada usuário.
lock = threading.Lock()
usernames = ["insira_aqui_o_@1_que_voce_quer_buscar", "insira_aqui_o_@2_que_voce_quer_buscar"]
threads = []
for username in usernames:
thread = threading.Thread(target=get_posts_by_username, args=[username])
threads.append(thread)
while len(threads) > 10:
threads.remove(threads[0])
for thread in threads:
thread.start()
for thread in threads:
thread.join()
csvfile.close()
Explicação:
lock = threading.Lock()
: Cria um bloqueio para garantir a segurança ao escrever no arquivo CSV.usernames = [...]
: Lista de usuários para coletar dados.threads = []
: Inicializa uma lista de threads.for username in usernames
: Cria uma thread para cada usuário.while len(threads) > 10
: Limita o número de threads em execução para 10.for thread in threads: thread.start()
: Inicia todas as threads.for thread in threads: thread.join()
: Aguarda a conclusão de todas as threads.csvfile.close()
: Fecha o arquivo CSV após a coleta de dados.
Conclusão
Neste artigo, mostramos como usar Python para coletar dados do Instagram, incluindo posts e comentários, e salvar essas informações em um arquivo CSV. Utilizando este código, é possível buscar uma palavra-chave em várias contas do instagram e análisar os dados encontrados.
Se você seguir estes passos e entender o código explicado, poderá adaptar e expandir este exemplo para atender às suas necessidades específicas de coleta de dados.
Nos bastidores
📚 Leitura: Atualmente, estou lendo "Projeto de Banco de Dados" de Carlos Alberto Heuser.
🎧Podcast: Estou ouvindo “Caso 63: Enigma” no Spotify. Adoro a série original e estou ouvindo esse spin-off em espanhol.
📝Estudos: Sigo estudando espanhol e também estou estudando as estruturas de dados do Python.
Recomendações
📒 Meu e-book Planejamento Estratégico de Carreira voltado para pessoas que querem fazer uma transição, mas não sabem como estruturar esse processo.
🤝🏻 Meus programas de mentoria de carreira voltados para ingresso na área de dados, voltados para pessoas que querem um planejamento mais personalizado.
📰 Minha newsletter com conteúdos semanais sobre a área de dados, voltada para quem quer estar sempre informado sobre o mercado e boas práticas.