Jak stahovat data Instagramu pomocí Pythonu

Instagram, s přibližně 1,21 miliardami uživatelů v roce 2021, je jednou z nejrozšířenějších sociálních sítí na světě. Podle statistik společnosti Statista, ho využívá asi 28 % celkové internetové populace.

Tento článek vám poskytne návod, jak programově získávat data z Instagramových profilů s využitím Pythonu. Představíme si dvě různé metody. První se zaměří na stahování multimediálního obsahu pomocí nástroje Instaloader. Druhá metoda vám ukáže, jak napsat jednoduchý skript v Pythonu pro získání profilových dat ve formátu JSON.

Je důležité zdůraznit, že automatizované stahování dat může být v rozporu s podmínkami používání Instagramu. Proto doporučujeme stahovat data pouze z vlastních účtů.

Využití Instaloaderu

Instaloader je Python balíček, který umožňuje stahování médií z Instagramu. Je známý svou jednoduchostí a rychlostí při extrakci a stahování dat. Pro začátek je nutné Instaloader nainstalovat pomocí nástroje pip:

pip install instaloader

Po instalaci můžete Instaloader používat buď z příkazové řádky, nebo jako součást vašeho Python skriptu.

Pro použití z příkazové řádky zadejte do terminálu příkaz instaloader. Například pro zobrazení nápovědy použijte:

instaloader --help

Pro stažení profilového obrázku uživatele použijte parametr --profile následovaný uživatelským jménem, tedy:

instaloader --profile <UŽIVATELSKÉ JMÉNO PROFILU>

Nicméně, pro plnou funkčnost se musíte nejdříve přihlásit. Toho docílíte použitím parametru --login, například:

instaloader --login <VAŠE UŽIVATELSKÉ JMÉNO> --profile <UŽIVATELSKÉ JMÉNO PROFILU>

Co lze stahovat

Instalader umožňuje stahování různorodého obsahu. Následující výňatek z manuálu zobrazuje, jaké typy dat jsou dostupné ke stažení:

  profile               Stáhne profil. Pokud byl již stažený profil přejmenován, Instaloader jej automaticky vyhledá pomocí unikátního ID a přejmenuje složku.
  @profile              Stáhne všechny sledované profily uživatele. Vyžaduje přihlášení. Místo @yourself zvažte použití :feed.
  "#hashtag"            Stáhne příspěvky označené hashtagem.
  %location_id          Stáhne příspěvky z daného místa. Vyžaduje přihlášení.
  :feed                 Stáhne příspěvky z vašeho feedu. Vyžaduje přihlášení.
  :stories              Stáhne stories vašich sledovaných. Vyžaduje přihlášení.
  :saved                Stáhne uložené příspěvky. Vyžaduje přihlášení.
  -- -shortcode         Stáhne příspěvek s daným shortcodem
  filename.json[.xz]    Opakovaně stáhne zadaný objekt.
  +args.txt             Načte cíle (a volby) z textového souboru.

Pro stažení příspěvků konkrétního uživatele použijte příkaz:

instaloader --login <VAŠE UŽIVATELSKÉ JMÉNO> <CÍLOVÉ UŽIVATELSKÉ JMÉNO>

Kde vaše uživatelské jméno je jméno vašeho ověřeného Instagramového účtu a cílové uživatelské jméno je profil, ze kterého chcete příspěvky stáhnout.

Chcete-li stáhnout příspěvky od sledovaných cílového profilu, zadejte:

instaloader --login <VAŠE UŽIVATELSKÉ JMÉNO> @<CÍLOVÉ UŽIVATELSKÉ JMÉNO>

Zde si všimněte znaku @ před cílovým uživatelským jménem.

Kromě použití z příkazové řádky lze Instaloader integrovat do vašich Python skriptů. Detaily k balíčku naleznete v dokumentaci.

I když Instaloader efektivně stahuje mediální obsah, pro extrakci detailních metadat jako je uživatelské bio, je nutné použít jinou metodu. Následující sekce ukáže, jak vytvořit skript pro extrakci JSON dat z profilu.

Vytvoření Python skriptu pro získávání dat z Instagramu

Přehled

V této části si vytvoříme jednoduchý Python skript pro stahování dat z Instagramu. Skript využívá málo známé JSON API Instagramu pro extrakci dat z veřejných profilů.

Toto API funguje tak, že k URL adrese profilu přidáte parametry __a=1&__d=1, načež Instagram vrátí data profilu ve formátu JSON.

Například, pokud je moje uživatelské jméno 0xanesu, pak odesláním požadavku na URL https://instagram.com/0xanesu/?__a=1&__d=1 získám JSON data svého profilu.

Psaní skriptu

Pro vytváření požadavků v Pythonu použijeme modul requests. Můžete ale použít i pycURL, urllib nebo jinou HTTP klientskou knihovnu. Modul nainstalujte pomocí pip:

pip install requests

Po instalaci otevřete soubor, do kterého budete psát skript, a importujte funkci get z modulu requests a funkci loads z modulu json, která bude sloužit k parsování odpovědi JSON:

from requests import get
from json import loads

Dále vytvořte proměnnou, která uloží URL vašeho Instagram profilu:

url="https://instagram.com/<VAŠE UŽIVATELSKÉ JMÉNO ZDE>"

Jak bylo zmíněno, pro extrahování dat je nutné přidat parametry __a=1 a __d=1. Definujeme je tedy v objektu slovníku:

params = { '__a': 1, '__d': 1 }

Pro autentizaci požadavků Instagram vyžaduje ID relace. Způsob, jak získat ID relace si ukážeme později. Zatím zadáme zástupnou hodnotu:

cookies = { 'sessionid': '<VAŠE ID RELACE ZDE>' }

Dále definujte funkci, která se spustí při úspěšném požadavku:

def on_success(response):
    profile_data_json = response.text
    parsed_data = loads(profile_data_json)
    
    print('Celé jméno uživatele:', parsed_data['graphql']['user']['full_name'])
    print('Uživatelské bio:', parsed_data['graphql']['user']['biography'])

Tato funkce převezme odpověď, extrahuje z ní JSON, analyzuje ho do objektu a vypíše celé jméno a biografii profilu.

Nyní definujeme funkci, která se spustí při chybě:

def on_error(response):
    # Vypíše chybu, pokud se něco pokazí
    print('Nastala chyba')
    print('Kód chyby:', response.status_code)
    print('Důvod:', response.reason)

Poté zavoláme funkci get, předáme URL, parametry a cookies jako argumenty:

response = get(url, params, cookies=cookies)

Nakonec zkontrolujeme stavový kód chyby. Pokud je 200, zavoláme funkci on_success. V opačném případě zavoláme on_error:

if response.status_code == 200:
    on_success(response)
else:
    on_error(response)

Tímto je kód hotov. Zbývá získat sessionid. Pro jeho získání otevřete webový prohlížeč Google Chrome a přihlaste se na Instagram. Poté otevřete vývojářské nástroje pomocí Ctrl + Shift + I (nebo Cmd + Shift + I na macOS).

V otevřených vývojářských nástrojích přejděte na kartu Aplikace.

Poté klikněte na podmenu Soubory cookie a uvidíte cookies používané Instagramem.

Zkopírujte hodnotu souboru cookie sessionid ze seznamu.

Po zkopírování vložte ID relace do skriptu a spusťte jej. V mém případě, při použití instagramového uživatelského jména (https://instgram.com/instagram?__a=1&__d=1), je výstup následující:

Tímto způsobem můžeme dynamicky stahovat data profilu. JSON API vrací mnohem více dat. Následující je výstup, pokud vypíšete všechna data:

A takto se získávají data a příspěvky z Instagramových profilů.

Závěrem

V tomto článku jsme si ukázali, jak stahovat příspěvky a média pomocí nástroje Instaloader. Následně jsme si vytvořili vlastní skript pro extrakci profilových dat ve formátu JSON, který zahrnuje mnohem více informací než jen mediální obsah. Pokud se vám tento projekt líbil, možná vás zaujme i náš článek o Python Timeit pro měření výkonu kódu.

Pokud se chcete o Instagramu dozvědět více, podívejte se na náš článek o Qoob Stories: podrobná recenze stahovače Instagramu.