Hur man laddar ner Instagram-data med Python

Instagram är ett av världens största sociala medienätverk, med cirka 1,21 miljarder användare 2021, eller cirka 28 % av internet, enligt Statista.

Den här artikeln är en guide för hur du programmatiskt laddar ner Instagram-data från en profil med Python på två metoder. Den första metoden är att ladda ner media med Instaloader. Det andra är att skriva ett enkelt Python-skript för att få JSON-data om profilen.

Det är viktigt att notera att skrapa data kan bryta mot Instagrams användarvillkor och vi rekommenderar att du endast laddar ner data från ditt konto.

Använder Instaloader

Instaloader är ett Python-paket för nedladdning av Instagram-media. Det är otroligt lätt att använda och gör att extrahera och ladda ner data snabbt och enkelt. För att börja använda Instaloader, installera den först med pip:

pip install instaloader

När det är installerat kan du använda det från dess kommandoradsgränssnitt eller som ett paket i ett Python-skript.

För att använda det från kommandoraden använder du kommandot instaloader. Till exempel, för att visa hjälpinformation anger du följande kommando i din terminal:

instaloader --help

För att ladda ner profilbilden för en användare anger du kommandot med en –profile-tagg, följt av användarnamnet. Såhär:

instaloader --profile <USERNAME OF THE PROFILE>

Men för att det här kommandot ska fungera måste du först logga in. För att göra det, skickar du in inloggningsalternativet så att:

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

Vad du ska ladda ner

Med Instaloader kan du ladda ner olika media. Detta utdrag av manualsidan visar dig alla olika saker du kan ladda ner:

  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.

För att ladda ner inlägg från en viss användare, skulle du ange kommandot:

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

I det här fallet är ditt användarnamn användarnamnet för ditt autentiserade Instagram-konto; målanvändarnamnet är profilen vars inlägg du vill ladda ner.

För att ladda ner inlägg från följare av en profil, skulle du ange kommandot:

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

Notera att skillnaden mellan det här kommandot och det föregående är @ före målanvändarnamnet.

Ett alternativ till att använda Instaloaders kommandoradsgränssnitt är att använda det som ett Python-paket. Paketet är väldokumenterat här.

Med Instaloader kan du ladda ner olika mediefiler. Men om du ville extrahera metadata som en användares biosida, skulle Instaloader ensam inte vara tillräckligt. Med nästa metod kommer du att skriva ett Python-skript för att extrahera en användarprofils data.

Att skriva ett Python-skript för att ladda ner Instagram-data

Översikt

I den här metoden kommer vi att skriva ett enkelt skript för att ladda ner Instagram-data i Python. Denna metod bygger på att använda ett relativt okänt Instagram JSON API för att extrahera data från offentliga profiler.

Hur detta API fungerar är att om du lägger till frågan __a=1&__d=1 i slutet av din profil-URL, svarar Instagram med JSON-data om profilen.

Till exempel är mitt användarnamn 0xanesu. Som ett resultat, om jag gör en begäran till https://instagram.com/instagram/?__a=1&__d=1, kommer jag att få tillbaka JSON-data om min profil som ett svar.

Att skriva manuset

För att göra begäran i Python kommer vi att använda modulen Python-förfrågningar. Men du kan också använda pycURL, urllib eller något annat klientbibliotek som du föredrar att använda för att göra HTTP-förfrågningar. För att börja, installera förfrågningsmodulen med pip.

pip install requests

När det har installerats, öppna en fil för att skriva ditt skript i och importera get-funktionen från begärandemodulen. Importera dessutom laddningsfunktionen från json. Detta kommer att användas för att analysera JSON-svaret.

from requests import get
from json import loads

När du har importerat data skapar du en variabel som lagrar webbadressen till din Instagram-profil.

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

Som nämnts tidigare, för att extrahera Instagram-data från en profil, måste du lägga till frågeparametrarna __a=1 och __d=1. För att definiera dessa skapar vi ett ordboksobjekt med parametrarna.

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

För att godkänna förfrågningar vi gör kräver Instagram ett sessions-ID. Senare kommer jag att visa dig hur du får ditt sessions-ID. För nu, lägg bara ett platshållarvärde som du kommer att ersätta senare.

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

Definiera sedan en funktion som ska köras när begäran lyckas.

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

Funktionen jag har definierat kommer att ta in responsobjektet, extrahera JSON från responskroppen och sedan analysera JSON till ett objekt. Efter detta extraherar jag bara profilens fullständiga namn och biografi.

Därefter definierar du funktionen som ska köras om det finns ett fel.

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)

Sedan anropar vi get-funktionen för att göra begäran och skickar in URL, parametrar och cookies som argument.

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

Till sist kontrollerar vi statuskoden för felet. Om statusen är 200 anropar vi on_success-funktionen. Annars kallar vi bara on_error-funktionen.

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

Vid det här laget är vi klara med att skriva koden. Det som återstår är att få sessions-ID. För att få sessions-id, öppna din Google Chrome och öppna Instagram på webben. Se till att du är inloggad och öppna sedan Dev Tools med Ctrl + Shift + I eller Cmd +Shift + I.

Med Dev Tools öppna öppnar du fliken Application.

Klicka sedan på undermenyn Cookies för att se cookies som används av Instagram.

Därefter kopierar du värdet på sessionid-cookien från listan över cookies som kommer att listas i panelen Dev Tools.

När du har kopierat sessions-id:t klistrar du in det i skriptet och kör skriptet. I mitt fall, när jag använder Instagram som användarnamn (https://instgram.com/instagram?__a=1&__d=1), är detta resultatet.

Och precis som det kan vi dynamiskt ladda ner profildata. Det finns så mycket mer data som returneras från JSON API. Detta är resultatet när du skriver ut allt:

Och det är så du extraherar data och inlägg från Instagram-profiler.

Slutord

I den här artikeln gick vi igenom hur man laddar ner inlägg och media med Instaloader. Vi skrev sedan ett anpassat skript för att extrahera JSON-profildata som innehåller så mycket mer än bara medieinnehållet. Om du gillade det här projektet, kanske du vill kolla in vårt inlägg om Python Timeit för att Time Your Code.

Om du är intresserad av att få ut mer av din Instagram-upplevelse, kolla in vårt inlägg på Qoob Stories: en detaljerad recension på Instagram-nedladdningsprogrammet.