Jak stahovat data Instagramu pomocí Pythonu

Instagram je jednou z největších sociálních sítí na světě, s přibližně 1,21 miliardami uživatelů v roce 2021, nebo asi 28 % internetu, podle Statista.

Tento článek je průvodcem, jak programově stáhnout data Instagramu z profilu pomocí Pythonu dvěma způsoby. První metodou je stahování médií pomocí Instaladeru. Druhým je psaní jednoduchého skriptu v Pythonu pro získání dat JSON o profilu.

Je důležité si uvědomit, že seškrabování dat může porušovat smluvní podmínky Instagramu, a proto doporučujeme stahovat data pouze ze svého účtu.

Pomocí instalačního programu

Instaloader je balíček Pythonu pro stahování instagramových médií. Jeho použití je neuvěřitelně snadné a umožňuje rychlé a snadné extrahování a stahování dat. Chcete-li začít používat Instaloader, nejprve jej nainstalujte pomocí pip:

pip install instaloader

Po instalaci jej můžete použít z rozhraní příkazového řádku nebo jako balíček ve skriptu Python.

Chcete-li jej použít z příkazového řádku, použijte příkaz instaloader. Chcete-li například zobrazit informace nápovědy, zadejte do terminálu následující příkaz:

instaloader --help

Chcete-li stáhnout profilový obrázek uživatele, zadejte příkaz s tagem –profile a za ním uživatelské jméno. Jako tak:

instaloader --profile <USERNAME OF THE PROFILE>

Ale aby tento příkaz fungoval, musíte se nejprve přihlásit. Chcete-li tak učinit, předáte možnost přihlášení, takže:

instaloader --login <YOUR USERNAME> --profile <USERNAME OF THE PROFILE>

Co stáhnout

Pomocí Instaladeru si můžete stáhnout různá média. Tento výňatek z manuálové stránky ukazuje všechny různé věci, které si můžete stáhnout:

  profile               Download profile. If an already-downloaded profile has been renamed, Instaloader automatically finds it by its unique
                        ID and renames the folder likewise.
  @profile              Download all followees of profile. Requires --login. Consider using :feed rather than @yourself.
  "#hashtag"            Download #hashtag.
  %location_id          Download %location_id. Requires --login.
  :feed                 Download pictures from your feed. Requires --login.
  :stories              Download the stories of your followees. Requires --login.
  :saved                Download the posts that you marked as saved. Requires --login.
  -- -shortcode         Download the post with the given shortcode
  filename.json[.xz]    Re-Download the given object.
  +args.txt             Read targets (and options) from given textfile.

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

instaloader --login <YOUR USERNAME> <TARGET USERNAME>

V tomto případě je vaše uživatelské jméno uživatelské jméno vašeho ověřeného účtu Instagram; cílové uživatelské jméno je profil, jehož příspěvky chcete stáhnout.

  10 výukových zdrojů a návodů pro Affinity Designer

Chcete-li stáhnout příspěvky od fanoušků profilu, zadejte příkaz:

instaloader --login <YOUR USERNAME> @<TARGET USERNAME>

Všimněte si, že rozdíl mezi tímto příkazem a předchozím je znak @ před cílovým uživatelským jménem.

Alternativou k použití rozhraní příkazového řádku Instaloaderu je použití jako balík Pythonu. Balíček je zde dobře zdokumentován.

Pomocí Instaladeru si můžete stáhnout různé mediální soubory. Pokud byste však chtěli extrahovat metadata, jako je bio stránka uživatele, samotný Instaloader by nestačil. Další metodou napíšete skript Python pro extrahování dat uživatelského profilu.

Psaní skriptu Python pro stahování dat Instagramu

Přehled

V této metodě napíšeme jednoduchý skript pro stažení dat Instagramu v Pythonu. Tato metoda se spoléhá na použití relativně neznámého Instagram JSON API pro extrakci dat z veřejných profilů.

Toto rozhraní API funguje tak, že pokud na konec adresy URL svého profilu přidáte dotaz __a=1&__d=1, Instagram odpoví daty JSON o profilu.

  Jak zjistit, zda je váš počítač poškozen vodou

Například moje uživatelské jméno je 0xanesu. V důsledku toho, když zašlu požadavek na https://instagram.com/instagram/?__a=1&__d=1, dostanu zpět data JSON o svém profilu jako odpověď.

Psaní scénáře

K vytvoření požadavku v Pythonu budeme používat modul požadavků Pythonu. Můžete však také použít pycURL, urllib nebo jakoukoli jinou klientskou knihovnu, kterou chcete používat k vytváření požadavků HTTP. Chcete-li začít, nainstalujte modul požadavků pomocí pip.

pip install requests

Jakmile to bude nainstalováno, otevřete soubor, do kterého zapíšete svůj skript, a importujte funkci get z modulu požadavků. Kromě toho také importujte funkci zatížení z json. To bude použito k analýze odpovědi JSON.

from requests import get
from json import loads

Po importu dat vytvořte proměnnou, která uloží adresu URL vašeho profilu na Instagramu.

url="https://instagram.com/<YOUR USERNAME HERE>"

Jak již bylo zmíněno, abyste mohli extrahovat data Instagramu z profilu, musíte přidat parametry dotazu __a=1 a __d=1. Pro jejich definování vytvoříme objekt slovníku s parametry.

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

Aby bylo možné autorizovat naše požadavky, Instagram vyžaduje ID relace. Později vám ukážu, jak získat ID relace. Prozatím stačí zadat zástupnou hodnotu, kterou nahradíte později.

cookies = { 'sessionid': '<YOUR SESSION ID HERE>' }

Dále definujte funkci, která se spustí, když je požadavek úspěšný.

def on_success(response):
    profile_data_json = response.text
    parsed_data = loads(profile_data_json)
    
    print('User fullname:', parsed_data['graphql']['user']['full_name'])
    print('User bio:', parsed_data['graphql']['user']['biography'])

Funkce, kterou jsem definoval, vezme objekt odpovědi, extrahuje JSON z těla odpovědi a poté analyzuje JSON do objektu. Poté vytahuji pouze celé jméno a biografii profilu.

Dále definujte funkci, která se spustí, pokud dojde k chybě.

def on_error(response):
    # Printing the error if something went wrong
    print('Something went wrong')
    print('Error Code:', response.status_code)
    print('Reason:', response.reason)

Poté zavoláme funkci get, abychom provedli požadavek, předáme URL, parametry a soubory cookie jako argumenty.

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

Nakonec zkontrolujeme stavový kód chyby. Pokud je stav 200, zavoláme funkci on_success. Jinak zavoláme funkci on_error.

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

V tomto okamžiku jsme s psaním kódu hotovi. Co zbývá, je získat sessionid. Chcete-li získat ID relace, otevřete svůj Google Chrome a otevřete Instagram na webu. Ujistěte se, že jste přihlášeni, a poté otevřete Dev Tools pomocí Ctrl + Shift + I nebo Cmd + Shift + I.

  Proč jsem připojen k Wi-Fi, ale ne k internetu?

S otevřenými nástroji pro vývojáře otevřete kartu Aplikace.

Poté klikněte na podnabídku Soubory cookie a zobrazte soubory cookie používané Instagramem.

Poté zkopírujte hodnotu souboru cookie sessionid ze seznamu souborů cookie, který bude uveden na panelu Nástroje pro vývojáře.

Jakmile zkopírujete ID relace, vložte jej do skriptu a spusťte skript. V mém případě, kdy jako uživatelské jméno používám Instagram (https://instgram.com/instagram?__a=1&__d=1), je toto výstup.

A stejně tak jsme schopni dynamicky stahovat profilová data. Z rozhraní JSON API se vrací mnohem více dat. Toto je výstup, když to všechno vytisknete:

A takto získáváte data a příspěvky z instagramových profilů.

Závěrečná slova

V tomto článku jsme prošli, jak stahovat příspěvky a média pomocí Instaladeru. Poté jsme napsali vlastní skript pro extrahování profilových dat JSON, která zahrnují mnohem víc než jen mediální obsah. Pokud se vám tento projekt líbil, možná se budete chtít podívat na náš příspěvek na Python Timeit to Time Your Code.

Pokud vás zajímá, jak ze své zkušenosti s Instagramem vytěžit víc, podívejte se na náš příspěvek na Qoob Stories: podrobnou recenzi na stahovači Instagramu.