Pular para o conteúdo

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.
Fábio Berbert de Paula fabio
Hits: 16.241 Categoria: Python Subcategoria: Outros
  • Indicar
  • Impressora
  • Denunciar

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:
   1. Introdução

Convertendo Texto em Fala com Python e pyttsx3

Como criar um clicador de sites com NodeJS

Docalysis: Análise de Documentos com Inteligência Artificial

Sorteio de camisetas promovido pela GeekWorld

Enviando email em formato HTML em PHP

Clicador automático de Tinder com Python

Trabalhando com permutações em ordem lexicográfica crescente

Como criar um keylogger em Python

Integração do ChatGPT em uma API Python

Splash Screen para Inkscape

#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

Entre na sua conta para comentar.