Last ned Instagram-data med Python: To effektive metoder!

Instagram, en global gigant innen sosiale medier, tiltrekker seg over 1,21 milliarder brukere, noe som utgjør omtrent 28% av internettbefolkningen i 2021, ifølge Statista.

Denne artikkelen gir en detaljert veiledning i hvordan du kan hente data fra Instagram-profiler ved hjelp av Python, med fokus på to ulike metoder. Den første metoden dreier seg om å laste ned mediefiler ved hjelp av verktøyet Instaloader, mens den andre metoden omhandler å utvikle et enkelt Python-skript for å innhente profilinformasjon i JSON-format.

Det er viktig å være klar over at dataskraping potensielt kan være i strid med Instagrams bruksvilkår. Vi oppfordrer sterkt til å kun laste ned data fra dine egne kontoer.

Bruke Instaloader

Instaloader er en Python-pakke som er spesifikt utviklet for nedlasting av Instagram-innhold. Den er kjent for sin brukervennlighet og effektivitet, noe som gjør det raskt og enkelt å hente ut og lagre data. For å komme i gang, må du først installere pakken via pip:

pip install instaloader

Etter installasjon kan du benytte Instaloader direkte fra kommandolinjen eller integrere den i et Python-skript.

For å bruke Instaloader fra kommandolinjen, benytter du kommandoen «instaloader». Du kan få tilgang til hjelpeinformasjon ved å skrive følgende i terminalen:

instaloader --help

For å laste ned profilbildet til en bestemt bruker, angir du kommandoen med taggen «–profile», etterfulgt av brukernavnet, slik som dette:

instaloader --profile <BRUKERNAVN FOR PROFILEN>

For at denne kommandoen skal fungere, må du være logget inn. Dette gjøres ved å legge til innloggingsalternativet:

instaloader --login <DITT BRUKERNAVN> --profile <BRUKERNAVN FOR PROFILEN>

Hva kan lastes ned?

Instaloader tilbyr muligheten til å laste ned en rekke ulike mediefiler. Utdraget nedenfor fra brukerveiledningen viser alle de forskjellige filtypene som kan lastes ned:

  profile               Last ned profil. Hvis en allerede nedlastet profil har blitt omdøpt, finner Instaloader den automatisk basert på dens unike
                        ID og omdøper mappen deretter.
  @profile              Last ned alle som profilen følger. Krever --login. Vurder å bruke :feed i stedet for @yourself.
  "#hashtag"            Last ned #hashtag.
  %location_id          Last ned %location_id. Krever --login.
  :feed                 Last ned bilder fra din egen feed. Krever --login.
  :stories              Last ned historier fra de du følger. Krever --login.
  :saved                Last ned innlegg du har lagret. Krever --login.
  -- -shortcode         Last ned innlegget med den gitte shortcode.
  filename.json[.xz]    Last ned den gitte objektet på nytt.
  +args.txt             Les inn målene (og valgmulighetene) fra den gitte tekstfilen.

For å laste ned alle innleggene til en spesifikk bruker, benytter du denne kommandoen:

instaloader --login <DITT BRUKERNAVN> <MÅLBRUKERNAVN>

Her vil ditt brukernavn være brukernavnet til din autentiserte Instagram-konto, mens målbrukernavnet refererer til profilen du ønsker å laste ned innlegg fra.

For å laste ned innlegg fra de en profil følger, benytter du følgende kommando:

instaloader --login <DITT BRUKERNAVN> @<MÅLBRUKERNAVN>

Merk forskjellen fra forrige kommando – @-symbolet foran målbrukernavnet.

Et alternativ til å bruke Instaloader via kommandolinjen, er å bruke den som en Python-pakke. Dokumentasjonen for dette finner du her.

Med Instaloader er det mulig å laste ned en rekke ulike mediefiler. Men hvis du ønsker å hente ut metadata, som for eksempel en brukers bio, vil ikke Instaloader alene være tilstrekkelig. Den neste metoden presenterer et Python-skript som kan hente ut data fra en brukerprofil.

Utvikle et Python-skript for å laste ned Instagram-data

Oversikt

Denne metoden tar for seg utviklingen av et enkelt skript for å hente Instagram-data i Python. Metoden baserer seg på en relativt ukjent Instagram JSON API for å hente data fra offentlige profiler.

Denne API-en fungerer ved at Instagram returnerer JSON-data om profilen dersom du legger til spørringen __a=1&__d=1 på slutten av profilens URL.

Et eksempel: Hvis mitt brukernavn er 0xanesu, vil en forespørsel til https://instagram.com/0xanesu/?__a=1&__d=1 returnere JSON-data om min profil.

Skrive skriptet

For å utføre forespørselen i Python, benytter vi Python-modulen «requests». Du kan imidlertid også bruke pycURL, urllib eller et annet klientbibliotek for å utføre HTTP-forespørsler. For å starte, installer «requests» ved hjelp av pip.

pip install requests

Etter installasjon, opprett en ny fil for å skrive skriptet ditt, og importer funksjonen «get» fra «requests»-modulen. I tillegg importeres «loads»-funksjonen fra «json», som brukes til å analysere JSON-svaret.

from requests import get
from json import loads

Etter importering, opprett en variabel som lagrer URL-en til Instagram-profilen din.

url="https://instagram.com/<DITT BRUKERNAVN HER>"

Som tidligere nevnt, er det nødvendig å legge til spørringsparameterne __a=1 og __d=1 for å hente data fra en profil. Dette gjøres ved å opprette et dictionary-objekt med parameterne:

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

Instagram krever en session-ID for å godkjenne forespørslene. En detaljert forklaring på hvordan man henter session-ID-en kommer senere. Foreløpig kan du sette inn en plassholderverdi som skal erstattes.

cookies = { 'sessionid': '<DIN SESSION ID HER>' }

Deretter defineres en funksjon som kjøres ved en vellykket forespørsel.

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

Denne funksjonen tar inn responsobjektet, trekker ut JSON fra responsens innhold og analyserer JSON til et objekt. Deretter hentes det fulle navnet og biografien fra profilen.

Deretter defineres en funksjon som kjøres ved en feil.

def on_error(response):
    # Skriver ut feilen hvis noe går galt
    print('Noe gikk galt')
    print('Feilkode:', response.status_code)
    print('Årsak:', response.reason)

Deretter kalles «get»-funksjonen for å utføre forespørselen, med URL-en, parametere og cookies som argumenter.

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

Til slutt sjekkes statuskoden for feil. Hvis statuskoden er 200, kalles funksjonen «on_success». Ellers kalles funksjonen «on_error».

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

Med koden skrevet, gjenstår det å hente session-ID-en. For å finne session-ID-en, åpne Google Chrome og gå til Instagram på nettet. Sørg for at du er logget inn, og åpne deretter Dev Tools ved hjelp av Ctrl + Shift + I eller Cmd +Shift + I.

Åpne fanen «Applikasjon» i Dev Tools.

Klikk deretter på undermenyen «Cookies» for å se informasjonskapslene som brukes av Instagram.

Kopier verdien fra «sessionid»-informasjonskapselen fra listen som vises i Dev Tools-panelet.

Etter at du har kopiert session-ID-en, lim den inn i skriptet og kjør det. I mitt tilfelle, med «instagram» som brukernavn (https://instagram.com/instagram?__a=1&__d=1), er dette resultatet.

Med dette kan vi dynamisk laste ned profildata. Det er mye mer data som returneres av JSON API. Her er resultatet når man skriver ut alle dataene:

Dette viser hvordan man henter ut data og innlegg fra Instagram-profiler.

Avsluttende ord

I denne artikkelen har vi gjennomgått hvordan du laster ned innlegg og mediefiler ved hjelp av Instaloader. Vi har også utviklet et tilpasset skript for å hente JSON-profildata som inneholder mye mer enn bare medieinnhold. Hvis du har funnet dette prosjektet interessant, kan du sjekke ut vår artikkel om Python Timeit for å tidsmåle din kode.

Hvis du er interessert i å få mer ut av din Instagram-opplevelse, kan du se vår artikkel om Qoob Stories: en detaljert anmeldelse av Instagram-nedlasteren.