Sådan downloader du Instagram-data ved hjælp af Python

Instagram er et af verdens største sociale medier med omkring 1,21 milliarder brugere i 2021, eller omkring 28 % af internettet, ifølge Statista.

Denne artikel er en guide til, hvordan du programmatisk downloader Instagram-data fra en profil ved hjælp af Python på to metoder. Den første metode er at downloade medier ved hjælp af Instaloader. Den anden er at skrive et simpelt Python-script for at få JSON-data om profilen.

Det er vigtigt at bemærke, at skrabning af data kan være i strid med Instagrams servicevilkår, og vi anbefaler, at du kun downloader data fra din konto.

Brug af Instaloader

Instaloader er en Python-pakke til download af Instagram-medier. Det er utrolig nemt at bruge og gør det hurtigt og nemt at udtrække og downloade data. For at begynde at bruge Instaloader skal du først installere det ved hjælp af pip:

pip install instaloader

Når den er installeret, kan du bruge den fra dens kommandolinjegrænseflade eller som en pakke i et Python-script.

For at bruge det fra kommandolinjen, bruger du kommandoen instaloader. For at vise hjælpeoplysninger skal du f.eks. indtaste følgende kommando i din terminal:

instaloader --help

For at downloade profilbilledet af en bruger, indtaster du kommandoen med et –profile-tag efterfulgt af brugernavnet. Ligesom:

instaloader --profile <USERNAME OF THE PROFILE>

Men for at denne kommando skal virke, skal du først logge ind. For at gøre det skal du gå ind i login-muligheden således:

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

Hvad skal du downloade

Med Instaloader kan du downloade forskellige medier. Dette uddrag af manualsiden viser dig alle de forskellige ting, du kan downloade:

  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.

For at downloade indlæg fra en bestemt bruger skal du indtaste kommandoen:

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

I dette tilfælde er dit brugernavn brugernavnet på din godkendte Instagram-konto; målbrugernavnet er den profil, hvis indlæg du vil downloade.

  Sådan svarer du på en bestemt besked på Instagram

For at downloade indlæg fra tilhængere af en profil skal du indtaste kommandoen:

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

Bemærk, at forskellen mellem denne kommando og den før er @ før målbrugernavnet.

Et alternativ til at bruge Instaloaders kommandolinjegrænseflade er at bruge det som en Python-pakke. Pakken er veldokumenteret her.

Med Instaloader kan du downloade forskellige mediefiler. Men hvis du ville udtrække metadata såsom en brugers bio-side, ville Instaloader alene ikke være nok. Med den næste metode vil du skrive et Python-script for at udtrække en brugerprofils data.

At skrive et Python-script for at downloade Instagram-data

Oversigt

I denne metode vil vi skrive et simpelt script til at downloade Instagram-data i Python. Denne metode er afhængig af at bruge en relativt ukendt Instagram JSON API til at udtrække data fra offentlige profiler.

Måden denne API fungerer på er, at hvis du tilføjer forespørgslen __a=1&__d=1 til slutningen af ​​din profil-URL, svarer Instagram med JSON-data om profilen.

  Sådan fastgøres kommentarer i Instagram på iPhone og Android

For eksempel er mit brugernavn 0xanesu. Som et resultat heraf, hvis jeg sender en anmodning til https://instagram.com/instagram/?__a=1&__d=1, vil jeg få JSON-data om min profil tilbage som et svar.

At skrive manuskriptet

For at lave anmodningen i Python, skal vi bruge Python-anmodningsmodulet. Du kan dog også bruge pycURL, urllib eller ethvert andet klientbibliotek, du foretrækker at bruge til at lave HTTP-anmodninger. For at begynde skal du installere anmodningsmodulet ved hjælp af pip.

pip install requests

Når det er blevet installeret, skal du åbne en fil for at skrive dit script i og importere get-funktionen fra anmodningsmodulet. Importer desuden også loads-funktionen fra json. Dette vil blive brugt til at parse JSON-svaret.

from requests import get
from json import loads

Når du har importeret dataene, skal du oprette en variabel, der gemmer URL’en til din Instagram-profil.

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

Som nævnt før, for at udtrække Instagram-data fra en profil, skal du tilføje forespørgselsparametrene __a=1 og __d=1. For at definere dem opretter vi et ordbogsobjekt med parametrene.

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

For at godkende anmodninger, vi fremsætter, kræver Instagram et sessions-id. Senere vil jeg vise dig, hvordan du får dit sessions-id. Indtil videre skal du bare indsætte en pladsholderværdi, som du vil erstatte senere.

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

Dernæst skal du definere en funktion, der skal køre, når anmodningen er vellykket.

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'])

Den funktion, jeg har defineret, vil tage svarobjektet ind, udtrække JSON fra svarlegemet og derefter parse JSON til et objekt. Herefter udtrækker jeg kun profilens fulde navn og biografi.

Dernæst skal du definere den funktion, der skal køre, hvis der er en fejl.

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)

Derefter kalder vi get-funktionen for at lave anmodningen, og sender URL’en, parametre og cookies som argumenter.

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

Så til sidst tjekker vi statuskoden for fejlen. Hvis status er 200, kalder vi on_success-funktionen. Ellers kalder vi bare on_error-funktionen.

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

På dette tidspunkt er vi færdige med at skrive koden. Hvad der er tilbage er at få session-id’et. For at få sessions-id’et skal du åbne din Google Chrome og åbne Instagram på nettet. Sørg for, at du er logget ind, og åbn derefter Dev Tools ved hjælp af Ctrl + Shift + I eller Cmd +Shift + I.

  Sådan muter du en brugers Instagram-historie

Med Dev Tools åbne skal du åbne fanen Application.

Klik derefter på undermenuen Cookies for at se cookies, der bruges af Instagram.

Kopier derefter værdien af ​​sessionid-cookien fra listen over cookies, der vil blive vist i panelet Dev Tools.

Når du har kopieret session-id’et, skal du indsætte det i scriptet og udføre scriptet. I mit tilfælde, ved at bruge Instagram som brugernavn (https://instgram.com/instagram?__a=1&__d=1), er dette output.

Og ligesom det er vi i stand til dynamisk at downloade profildata. Der er så meget mere data, der returneres fra JSON API. Dette er outputtet, når du udskriver det hele:

Og det er sådan, du udtrækker data og opslag fra Instagram-profiler.

Afsluttende ord

I denne artikel gik vi igennem, hvordan du downloader indlæg og medier ved hjælp af Instaloader. Vi skrev derefter et brugerdefineret script til at udtrække profil JSON-data, der omfatter så meget mere end blot medieindholdet. Hvis du kunne lide dette projekt, vil du måske tjekke vores indlæg om Python Timeit til at time din kode.

Hvis du er interesseret i at få mere ud af din Instagram-oplevelse, så tjek vores indlæg om Qoob Stories: en detaljeret anmeldelse af Instagram-downloaderen.