Како преузети податке са Инстаграма користећи Питхон

Instagram, globalno poznata platforma društvenih medija, broji impresivnih 1,21 milijardu korisnika u 2021. godini, što čini otprilike 28% ukupne internet populacije, prema podacima Statista.

Ovaj tekst služi kao vodič za programsko preuzimanje podataka sa Instagram profila putem Pythona, koristeći dve različite metode. Prva metoda uključuje preuzimanje medijskih sadržaja pomoću alata Instaloader. Druga metoda se bazira na pisanju jednostavnog Python skripta za dobijanje JSON podataka o profilu.

Važno je napomenuti da prikupljanje podataka sa web stranica može biti u suprotnosti sa Instagramovim uslovima korišćenja, te se preporučuje preuzimanje podataka isključivo sa vlastitog naloga.

Upotreba Instaloader-a

Instaloader je Python paket namenjen za preuzimanje Instagram medija. Jednostavan je za korišćenje i omogućava brzo i lako izdvajanje i preuzimanje različitih podataka. Za početak, potrebno je instalirati Instaloader koristeći pip komandu:

pip install instaloader

Nakon instalacije, može se koristiti putem komandne linije ili integrisan kao paket u Python skriptu.

Za upotrebu iz komandne linije, koristite komandu `instaloader`. Na primer, da biste prikazali informacije o dostupnim opcijama, unesite sledeću komandu u terminal:

instaloader --help

Za preuzimanje profilne fotografije korisnika, koristite komandu sa oznakom `–profile` praćenu korisničkim imenom, na sledeći način:

instaloader --profile <KORISNIČKO_IME_PROFILA>

Međutim, da bi ova komanda funkcionisala, morate se prvo prijaviti. To možete učiniti propuštanjem opcije za prijavu:

instaloader --login <VAŠE_KORISNIČKO_IME> --profile <KORISNIČKO_IME_PROFILA>

Šta se može preuzeti

Sa Instaloaderom je moguće preuzeti različite vrste medija. Sledeći izvod iz priručnika prikazuje sve što možete preuzeti:

  profile               Preuzima profil. Ako je preuzeti profil preimenovan, Instaloader ga automatski pronalazi po jedinstvenom ID-u i preimenuje folder.
  @profile              Preuzima sve profile koje profil prati. Zahteva --login. Razmotrite upotrebu :feed umesto @yourself.
  "#hashtag"            Preuzima #hashtag.
  %location_id          Preuzima %location_id. Zahteva --login.
  :feed                 Preuzima fotografije iz vašeg feeda. Zahteva --login.
  :stories              Preuzima priče profila koje pratite. Zahteva --login.
  :saved                Preuzima objave koje ste sačuvali. Zahteva --login.
  -- -shortcode         Preuzima objavu sa datim shortcode-om
  filename.json[.xz]    Ponovo preuzima dati objekat.
  +args.txt             Čita ciljeve (i opcije) iz date tekstualne datoteke.

Da biste preuzeli objave određenog korisnika, uneli biste komandu:

instaloader --login <VAŠE_KORISNIČKO_IME> <CILJNO_KORISNIČKO_IME>

U ovom slučaju, `VAŠE_KORISNIČKO_IME` je korisničko ime vašeg autentifikovanog Instagram naloga, dok je `CILJNO_KORISNIČKO_IME` profil čije objave želite preuzeti.

Za preuzimanje objava profila koje pratite, koristite komandu:

instaloader --login <VAŠE_KORISNIČKO_IME> @<CILJNO_KORISNIČKO_IME>

Obratite pažnju na razliku između ove i prethodne komande; `@` simbol se nalazi ispred ciljnog korisničkog imena.

Alternativa korišćenju Instaloader-a putem komandne linije je upotreba kao Python paketa. Detaljna dokumentacija paketa je dostupna online.

Sa Instaloaderom možete preuzimati razne medijske fajlove. Međutim, za izdvajanje metapodataka, kao što je biografija korisnika, Instaloader sam po sebi nije dovoljan. Sledeća metoda opisuje kako napisati Python skriptu za ekstrakciju podataka korisničkog profila.

Pisanje Python skripte za preuzimanje Instagram podataka

Pregled

U ovoj metodi, fokus je na kreiranju jednostavnog skripta za preuzimanje Instagram podataka koristeći Python. Ova metoda se oslanja na korišćenje relativno nepoznatog Instagram JSON API-ja za ekstrakciju podataka iz javnih profila.

Ovaj API funkcioniše na taj način što se na kraju URL-a vašeg profila doda upit `__a=1&__d=1`. Instagram će tada odgovoriti sa JSON podacima o profilu.

Na primer, ako je vaše korisničko ime `0kanesu`, upitom `https://instagram.com/0kanesu/?__a=1&__d=1`, dobićete JSON podatke o vašem profilu.

Pisanje skripte

Za slanje zahteva u Pythonu koristićemo `requests` modul. Međutim, možete koristiti i `picURL`, `urllib` ili bilo koju drugu biblioteku za pravljenje HTTP zahteva. Za početak, instalirajte `requests` modul koristeći pip:

pip install requests

Kada je instalacija završena, otvorite datoteku u koju ćete pisati skriptu i importujte funkciju `get` iz `requests` modula, kao i funkciju `loads` iz `json`. Ova poslednja će se koristiti za raščlanjivanje JSON odgovora.

from requests import get
from json import loads

Nakon importovanja, kreirajte varijablu za čuvanje URL-a vašeg Instagram profila.

url="https://instagram.com/<VAŠE_KORISNIČKO_IME>"

Kao što je ranije pomenuto, za izdvajanje podataka, potrebno je dodati parametre upita `__a=1` i `__d=1`. Za definisanje ovih parametara, kreiraćemo rečnik sa njima.

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

Za autentifikaciju zahteva, Instagramu je potreban ID sesije. U nastavku teksta će biti objašnjeno kako se dobija ID sesije. Za sada, ostavite privremenu vrednost.

cookies = { 'sessionid': '<VAŠ_SESSION_ID>' }

Zatim, definišite funkciju koja će se pozvati nakon uspešnog zahteva.

def on_success(response):
    profile_data_json = response.text
    parsed_data = loads(profile_data_json)
    
    print('Puno ime korisnika:', parsed_data['graphql']['user']['full_name'])
    print('Korisnička biografija:', parsed_data['graphql']['user']['biography'])

Ova funkcija uzima odgovor, izdvaja JSON iz odgovora, i raščlanjuje ga u objekat. Zatim, funkcija izdvaja samo puno ime i biografiju profila.

Definišite funkciju koja će se pozvati u slučaju greške.

def on_error(response):
    # Ispisivanje greške ukoliko nešto pođe po zlu
    print('Došlo je do greške')
    print('Kod greške:', response.status_code)
    print('Razlog:', response.reason)

Pozivamo `get` funkciju za slanje zahteva, prosleđujući URL, parametre i kolačiće kao argumente.

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

Na kraju, proveravamo statusni kod greške. Ako je status 200, pozivamo `on_success` funkciju, a inače, pozivamo `on_error` funkciju.

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

U ovom trenutku, pisanje koda je završeno. Preostaje još da se dobije sessionid. Za dobijanje ID sesije, otvorite Google Chrome i idite na Instagram putem web pretraživača. Uverite se da ste prijavljeni, a zatim otvorite Dev Tools (Ctrl + Shift + I ili Cmd + Shift + I).

Kada je Dev Tools otvoren, idite na tab „Application“.

Zatim, kliknite na podmeni „Cookies“ kako biste videli kolačiće koje koristi Instagram.

Kopirajte vrednost kolačića `sessionid` sa liste kolačića.

Nakon kopiranja ID sesije, nalepite ga u skriptu i pokrenite je. U primeru korišćenja Instagram naloga (https://instgram.com/instagram?__a=1&__d=1), izlaz je sledeći.

I time, dinamički možete preuzimati podatke o profilu. JSON API vraća još dosta drugih informacija. Ovo je izlaz kada se odštampa ceo objekat:

I to je način za izdvajanje podataka i objava sa Instagram profila.

Završne reči

U ovom članku smo objasnili kako preuzeti objave i medije koristeći Instaloader. Zatim smo napisali prilagođenu skriptu za izdvajanje JSON podataka profila, koji uključuju mnogo više od samog medijskog sadržaja. Ako ste uživali u ovom projektu, možete pogledati i post o Python Timeit-u za merenje brzine izvršavanja vašeg koda.

Ako ste zainteresovani za poboljšanje svog iskustva na Instagramu, pogledajte i post o Koob Stories: detaljni pregled Instagram alata za preuzimanje.