Jak pobierać dane z Instagrama za pomocą Pythona

Instagram, według danych Statista, stanowi jedną z czołowych platform społecznościowych na świecie, skupiając wokół siebie około 1,21 miliarda użytkowników w roku 2021, co odpowiada blisko 28% globalnej populacji internetu.

Niniejszy artykuł ma na celu przedstawienie praktycznych metod programowego pozyskiwania danych z profili na Instagramie za pomocą języka Python. Omówimy dwie odmienne techniki. Pierwsza z nich wykorzystuje bibliotekę Instaloadera do pobierania treści multimedialnych, natomiast druga bazuje na stworzeniu prostego skryptu w Pythonie, który umożliwia uzyskanie danych profilowych w formacie JSON.

Ważne jest, aby pamiętać, że gromadzenie danych w ten sposób może potencjalnie naruszać regulamin Instagrama. Dlatego też, zaleca się pobieranie danych wyłącznie z kont, do których mamy prawo dostępu.

Wykorzystanie Instaloadera

Instaloader to specjalistyczny pakiet dla Pythona przeznaczony do pobierania różnorodnych multimediów z Instagrama. Jego intuicyjność i prostota obsługi czynią go doskonałym narzędziem do szybkiego i efektywnego wyodrębniania danych. Aby rozpocząć pracę z Instaloderem, należy go najpierw zainstalować za pośrednictwem menedżera pakietów pip:

pip install instaloader

Po pomyślnej instalacji, pakiet można obsługiwać zarówno z poziomu linii poleceń, jak i integrować go w skryptach Pythona.

W celu użycia Instaloadera w wierszu poleceń, wykorzystuje się komendę `instaloader`. Przykładowo, aby wyświetlić szczegółowe informacje na temat dostępnych opcji, należy wpisać następujące polecenie:

instaloader --help

Aby uzyskać zdjęcie profilowe danego użytkownika, stosuje się opcję `–profile` wraz z nazwą profilu, w następujący sposób:

instaloader --profile <NAZWA UŻYTKOWNIKA PROFILU>

Jednakże, aby polecenie zadziałało, konieczne jest uprzednie zalogowanie się. W tym celu należy dodać opcję `–login`, co przedstawia się następująco:

instaloader --login <TWÓJ UŻYTKOWNIK> --profile <NAZWA UŻYTKOWNIKA PROFILU>

Zakres pobieranych danych

Instaloader umożliwia pobieranie różnych typów multimediów. Poniższy fragment z dokumentacji biblioteki prezentuje różnorodność dostępnych opcji:

  profile               Pobieranie profilu. Jeśli profil został pobrany wcześniej i zmienił nazwę, Instaloader automatycznie go odnajdzie po unikalnym
                        ID i odpowiednio zmieni nazwę folderu.
  @profile              Pobieranie wszystkich obserwowanych profili. Wymaga opcji --login. Rozważ użycie :feed zamiast @yourself.
  "#hashtag"            Pobieranie treści z hashtagiem.
  %location_id          Pobieranie treści z lokalizacji. Wymaga opcji --login.
  :feed                 Pobieranie postów z Twojego feedu. Wymaga opcji --login.
  :stories              Pobieranie relacji obserwowanych profili. Wymaga opcji --login.
  :saved                Pobieranie zapisanych postów. Wymaga opcji --login.
  -- -shortcode         Pobieranie postu o danym shortcode
  filename.json[.xz]    Ponowne pobieranie danego obiektu.
  +args.txt             Odczyt celów (i opcji) z podanego pliku tekstowego.

Aby pobrać posty od konkretnego użytkownika, należy wprowadzić komendę:

instaloader --login <TWÓJ UŻYTKOWNIK> <DOCELOWY UŻYTKOWNIK>

Gdzie, <TWÓJ UŻYTKOWNIK> to nazwa użytkownika Twojego konta na Instagramie, za pośrednictwem którego się logujesz, natomiast <DOCELOWY UŻYTKOWNIK> to profil, którego posty zamierzasz pobrać.

W celu pobrania postów od obserwowanych użytkowników, stosujemy polecenie:

instaloader --login <TWÓJ UŻYTKOWNIK> @<DOCELOWY UŻYTKOWNIK>

Należy zwrócić uwagę, że różnica pomiędzy tym poleceniem a poprzednim polega na dodaniu znaku `@` przed nazwą docelowego użytkownika.

Alternatywnie, zamiast korzystania z interfejsu linii poleceń Instaloadera, można użyć go jako pakietu Pythona. Szczegółowa dokumentacja pakietu jest dostępna tutaj.

Chociaż Instaloder oferuje szerokie możliwości pobierania różnych plików multimedialnych, nie jest on wystarczający do wyodrębniania metadanych, takich jak biografia użytkownika. W takim przypadku należy skorzystać z kolejnej metody, która polega na napisaniu skryptu w Pythonie, dedykowanego do pozyskiwania danych profilowych użytkownika.

Tworzenie skryptu Pythona do pobierania danych z Instagrama

Omówienie metody

W tej części artykułu skupimy się na napisaniu prostego skryptu w języku Python, który umożliwi pobieranie danych z Instagrama. Metoda ta wykorzystuje mniej znane API JSON Instagrama, co pozwala na pozyskiwanie danych z publicznych profili.

Mechanizm działania tego API polega na tym, że po dodaniu zapytania `__a=1&__d=1` na końcu adresu URL profilu, Instagram zwraca dane o profilu w formacie JSON.

Przykładowo, jeśli nazwa użytkownika to `0xanesu`, to wysłanie żądania do adresu https://instagram.com/instagram/?__a=1&__d=1, spowoduje zwrócenie danych JSON dotyczących profilu użytkownika `instagram`.

Pisanie skryptu

Aby wysyłać żądania w Pythonie, skorzystamy z modułu `requests`. Alternatywnie, można zastosować `pycURL`, `urllib` lub dowolną bibliotekę klienta HTTP. Na początek zainstalujmy moduł `requests` za pomocą pip:

pip install requests

Po zainstalowaniu, otwórz plik, w którym chcesz umieścić skrypt i zaimportuj funkcję `get` z modułu `requests`, a także funkcję `loads` z modułu `json`. Ta ostatnia funkcja posłuży do parsowania odpowiedzi JSON.

from requests import get
from json import loads

Następnie, utwórz zmienną, która będzie przechowywać URL do Twojego profilu na Instagramie.

url="https://instagram.com/<TWÓJ UŻYTKOWNIK>"

Jak wspomniano wcześniej, aby pobrać dane profilu, należy dodać parametry zapytania `__a=1` i `__d=1`. Zdefiniujmy je jako obiekt słownikowy:

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

Do autoryzacji żądań, Instagram wymaga identyfikatora sesji. Sposób jego uzyskania zostanie omówiony później. Na razie wstawmy wartość zastępczą, którą później zastąpimy prawidłowym identyfikatorem.

cookies = { 'sessionid': '<TWÓJ IDENTYFIKATOR SESJI>' }

Teraz zdefiniujmy funkcję, która zostanie wykonana po pomyślnym zakończeniu żądania.

def on_success(response):
    profile_data_json = response.text
    parsed_data = loads(profile_data_json)
    
    print('Pełna nazwa użytkownika:', parsed_data['graphql']['user']['full_name'])
    print('Biografia użytkownika:', parsed_data['graphql']['user']['biography'])

Zdefiniowana funkcja przyjmuje obiekt odpowiedzi, wyodrębnia z niego dane w formacie JSON, a następnie parsowanie je do obiektu. Z uzyskanego obiektu wyodrębniamy pełną nazwę użytkownika i jego biografię.

Następnie, zdefiniujmy funkcję, która zostanie wykonana w przypadku błędu.

def on_error(response):
    # Wyświetlenie komunikatu o błędzie
    print('Wystąpił błąd')
    print('Kod błędu:', response.status_code)
    print('Powód:', response.reason)

Teraz wywołujemy funkcję `get`, aby wysłać żądanie, przekazując URL, parametry i pliki cookie jako argumenty.

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

Na koniec, sprawdzamy kod statusu. Jeśli wynosi on 200, wywołujemy funkcję `on_success`, w przeciwnym wypadku – `on_error`.

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

W tym momencie zakończyliśmy pisanie kodu. Pozostało jeszcze pozyskać identyfikator sesji. Aby to zrobić, należy otworzyć Google Chrome i zalogować się na Instagrama w przeglądarce. Następnie, otwórz Narzędzia deweloperskie za pomocą `Ctrl + Shift + I` lub `Cmd + Shift + I`.

W Narzędziach deweloperskich przejdź do zakładki „Aplikacja”.

Następnie kliknij w podmenu „Pliki cookie”, aby wyświetlić pliki cookie, z których korzysta Instagram.

Skopiuj wartość pliku cookie `sessionid` z listy, która wyświetli się w panelu.

Po skopiowaniu, wklej identyfikator sesji do skryptu i uruchom go. W przypadku użycia `instagram` jako nazwy użytkownika (https://instgram.com/instagram?__a=1&__d=1), otrzymamy następujący wynik:

W ten sposób, jesteśmy w stanie dynamicznie pobierać dane z profilu. Interfejs API JSON zwraca znacznie więcej danych niż te, które zostały przedstawione w przykładzie. Po wyświetleniu wszystkich danych otrzymamy:

I w ten sposób można pobierać dane i posty z profili na Instagramie.

Podsumowanie

W niniejszym artykule omówiliśmy dwa sposoby pozyskiwania danych z Instagrama. Pierwszy z nich, wykorzystujący Instaloader, umożliwia pobieranie postów i multimediów. Drugi, polegający na napisaniu własnego skryptu, pozwala na wyodrębnianie danych profilu w formacie JSON, które wykraczają poza samą zawartość multimedialną. Jeśli ten projekt Ci się spodobał, zachęcamy do zapoznania się z naszym artykułem na temat Python Timeit, który opisuje sposób mierzenia czasu wykonywania kodu.

Dla osób, które chcą w pełni wykorzystać potencjał Instagrama, polecamy zapoznanie się z naszym postem na temat Qoob Stories, szczegółową recenzją narzędzia do pobierania treści z Instagrama.