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.405 ]

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

Verificando integridade de servidores POP com PHP/sockets

Rodando ASP em servidores web Linux

Corretor Ortográfico no Vim - Guia definitivo

Entrevista com um hacker, via Internet

Como camuflar seu WhatsApp Web usando Snippets JavaScript

Leitura recomendada

Interagindo com servidores HTTP com Python

Integração do ChatGPT em uma API Python

Gerar Códigos QRCode com Python

Construindo um portscanner TCP com Python

Alimentando Desktopcouch com Zeitgeist

  
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