Como baixar fotos e vídeos do Instagram com Python

Neste artigo criaremos um script em Python capaz de fazer download de fotos e vídeos do Instagram.

[ Hits: 14.536 ]

Por: Fábio Berbert de Paula em 17/07/2020 | Blog: https://fabio.automatizando.dev


Introdução



Existem aplicativos e sites que tornam essa tarefa simples, mas como somos curiosos e usuários Linux raiz, vamos criar nossa própria solução usando nada mais que conhecimentos básicos em Python.

Existem duas possibilidades de download de posts do Instagram: fotos e vídeos. E também existem duas possibilidades de acesso aos posts desejados: os de conta pública e privada.

Para os posts de conta privada, será necessário usar credenciais de uma conta que siga a pessoa dona do post em questão.

Dependências

Para o nosso projeto vamos precisar de:
  • Python 3
  • Módulo instaloader

Partindo do princípio que o Python 3 já está instalado em sua distribuição, vamos instalar o instaloader usando o pip3:

pip3 install instaloader

NOTA: o código do artigo irá funcionar tanto no Linux, quanto no macOS, Windows, BSD e qualquer outro sistema que possua o interpretador Python 3 disponível.

Desenvolvendo o código

O primeiro passo será importar o módulo instaloader:

import instaloader

Em seguida vamos verificar se a URL foi informada como argumento via linha de comando, caso contrário exibir uma mensagem de ajuda e sair:

import sys

<strong>#verificar se a URL foi informada</strong><br
try:
    url = sys.argv[1]
except IndexError:
    print("Forma de uso:\n\n", sys.argv[0], "URL\n\nInforme uma URL válida\n\n")
    sys.exit()

Definir qual será o diretório destino dos downloads:

#diretório de download
downloadDir = '/home/fabio/Downloads'

import os
os.chdir(downloadDir)

Agora iremos iniciar em "loader" uma instância da classe Instaloader:

loader = instaloader.Instaloader(
  download_pictures=True,
  download_videos=True,
  download_video_thumbnails=False,
  download_geotags=False,
  download_comments=False,
  save_metadata=False,
  compress_json=False,
  filename_pattern='{profile}_{mediaid}'
  )

Onde:
  • download_pictures=True :: fazer download de imagens
  • download_videos=True :: fazer download de vídeos
  • download_video_thumbnails=False :: não baixar miniaturas de vídeo
  • download_geotags=False :: não baixar geotags
  • download_comments=False :: não baixar comentários
  • save_metadata=False :: não baixar metadata do post
  • compress_json=False :: não compactar o json de metadata
  • filename_pattern='{profile}_{mediaid} :: formato do nome de arquivo baixado, onde {profile} é o nome do usuário e {mediaid} o valor numérico que identifica o post

O bloco a seguir é opcional, só é necessário fazer download se você for baixar posts de contas privadas. Caso esteja baixando conteúdo de contas públicas, pode comentar as linhas a seguir:

from getpass import getpass

username = input('Usuário: ')
password = getpass('Senha: ')
loader.login(username,password)

Agora vamos tratar a URL do post e extrair somente o que nos interessa, que é a "shortcode" da URL.

import re

#extrair "short_code" da URL
#exemplo: https://www.instagram.com/p/CCfeQV-AssF/
expr = r'\/p\/([^\/]*)/'
found = re.search(expr, url)

if found:
  print("Baixando ", found.group(1), "...")
  post = instaloader.Post.from_shortcode(loader.context, found.group(1))
  loader.download_post(post, ".")

Em suma, no bloco acima se a URL informada for um post válido, o script irá criar uma instância de Post a partir do shortcode e armazenar na variável "post". Em seguida usará esse objeto "post" para executar o método "download_post() no diretório corrente.

A seguir o código completo:

#!/usr/bin/env python3
import instaloader
from getpass import getpass
import os
import re
import sys

#verificar se a URL foi informada
try:
    url = sys.argv[1]
except IndexError:
    print("Forma de uso:\n\n", sys.argv[0], "URL\n\nInforme uma URL válida\n\n")
    sys.exit()

#diretório de download
downloadDir = '/home/fabio/Downloads'
os.chdir(downloadDir)

loader = instaloader.Instaloader(
  download_pictures=True,
  download_videos=True,
  download_video_thumbnails=False,
  download_geotags=False,
  download_comments=False,
  save_metadata=False,
  compress_json=False,
  filename_pattern='{profile}_{mediaid}'
  )

#o login é opcional, necessário somente no
#caso de download de posts de contas privadas
#comente as próximas 3 linhas caso esteja
#fazendo download de posts de contas públicas
# username = input('Usuário: ')
# password = getpass('Senha: ')
# loader.login(username,password)

#extrair "short_code" da URL
#exemplo: https://www.instagram.com/p/CCfeQV-AssF/
expr = r'\/p\/([^\/]*)/'
found = re.search(expr, url)

if found:
  print("Baixando ", found.group(1), "...")
  post = instaloader.Post.from_shortcode(loader.context, found.group(1))
  loader.download_post(post, ".")

Salve o arquivo com um nome qualquer, como por exemplo "insta-dl", dê permissão de execução e copie para algum diretório do seu $PATH:

chmod +x insta-dl
sudo cp insta-dl /usr/local/bin

Em seguida basta executar:

insta-dl https://www.instagram.com/p/CClaMqigoeS/

E verificar o download em ~/Downloads:

ls ~/Downloads/

Você terá um arquivo com a imagem ou vídeo do post e um arquivo txt com o texto.

O código apresentado neste artigo ficará disponível e será atualizado em:
Também gravei um vídeo hands-on explicando o código em:
   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Criando sites para celular com WML

Diversão e Entretenimento no Linux

Integrando o Exim4 com o SendGrid

Usando o "at" para agendamento de tarefas

Verificando integridade de servidores POP com PHP/sockets

Leitura recomendada

Interagindo com servidores HTTP com Python

Como criar um keylogger em Python

Download de Arquivos com Verificação do Hash SHA 256

Monitorando produtos no ML com Python 3 via BeautifulSoup

Python - Enviando Backup para Servidor Secundário

  
Comentários
[1] Comentário enviado por Viktor_Santus em 18/07/2020 - 00:21h

Ótimo trabalho! Aprendendo muito com seu artigo!

[2] Comentário enviado por leoberbert em 20/07/2020 - 15:47h

Bem interessante!

[3] Comentário enviado por out-of-system em 01/12/2020 - 02:34h

Com poucas linhas de código e já tem uma ferramenta em mãos, Python é incrível!
Nice post mano!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts