Як завантажити дані Instagram за допомогою Python

За даними Statista, Instagram є однією з найбільших у світі соціальних медіа-мереж, у 2021 році близько 1,21 мільярда користувачів, або близько 28% Інтернету.

У цій статті описано, як програмно завантажити дані Instagram із профілю за допомогою Python двома способами. Перший спосіб – це завантаження медіа за допомогою Instaloader. Другий — написання простого сценарію Python для отримання даних JSON про профіль.

Важливо зауважити, що копіювання даних може порушувати умови обслуговування Instagram, тому ми рекомендуємо завантажувати дані лише зі свого облікового запису.

Використання програми Instaloader

Instaloader — це пакет Python для завантаження медіафайлів Instagram. Він неймовірно простий у використанні та робить видобування та завантаження даних швидким і легким. Щоб почати використовувати Instaloader, спочатку встановіть його за допомогою pip:

pip install instaloader

Після встановлення ви можете використовувати його з інтерфейсу командного рядка або як пакет у сценарії Python.

Щоб використовувати його з командного рядка, скористайтеся командою instaloader. Наприклад, щоб відобразити довідкову інформацію, ви вводите таку команду у свій термінал:

instaloader --help

Щоб завантажити зображення профілю користувача, ви вводите команду з тегом –profile, а потім іменем користувача. Ось так:

instaloader --profile <USERNAME OF THE PROFILE>

Але щоб ця команда працювала, вам потрібно спочатку ввійти. Для цього введіть параметр входу таким чином:

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

Що завантажити

За допомогою Instaloader ви можете завантажувати різні носії. У цьому фрагменті сторінки посібника показано всі різні речі, які ви можете завантажити:

  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.

Щоб завантажити дописи певного користувача, потрібно ввести команду:

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

У цьому випадку ваше ім’я користувача – це ім’я користувача вашого автентифікованого облікового запису Instagram; цільове ім’я користувача – це профіль, публікації якого ви хочете завантажити.

  Як змінити пароль в Instagram

Щоб завантажити дописи від підписників профілю, потрібно ввести команду:

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

Зверніть увагу, що різниця між цією командою та попередньою полягає в тому, що перед цільовим іменем користувача ставиться @.

Альтернативою використанню інтерфейсу командного рядка Instaloader є використання його як пакета Python. Пакет добре задокументований тут.

За допомогою Instaloader ви можете завантажувати різні мультимедійні файли. Однак, якщо ви хочете отримати такі метадані, як сторінка біографії користувача, одного тільки Instaloader буде недостатньо. За допомогою наступного методу ви напишете сценарій Python для вилучення даних профілю користувача.

Написання сценарію Python для завантаження даних Instagram

Огляд

У цьому методі ми напишемо простий сценарій для завантаження даних Instagram на Python. Цей метод ґрунтується на використанні відносно невідомого API Instagram JSON для отримання даних із загальнодоступних профілів.

Цей API працює так: якщо ви додаєте запит __a=1&__d=1 у кінець URL-адреси свого профілю, Instagram відповідає даними JSON про профіль.

  Як переглянути ненадіслані повідомлення в Instagram

Наприклад, моє ім’я користувача 0xanesu. У результаті, якщо я зроблю запит на https://instagram.com/instagram/?__a=1&__d=1, я отримаю у відповідь дані JSON про мій профіль.

Написання сценарію

Щоб зробити запит у Python, ми будемо використовувати модуль запитів Python. Однак ви також можете використовувати pycURL, urllib або будь-яку іншу клієнтську бібліотеку, яку ви віддаєте перевагу, щоб робити HTTP-запити. Для початку встановіть модуль запитів за допомогою pip.

pip install requests

Після встановлення відкрийте файл, щоб написати сценарій, і імпортуйте функцію get із модуля запитів. Крім того, також імпортуйте функцію loads з json. Це буде використано для аналізу відповіді JSON.

from requests import get
from json import loads

Після імпорту даних створіть змінну, яка зберігає URL-адресу вашого профілю Instagram.

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

Як згадувалося раніше, щоб отримати дані Instagram із профілю, потрібно додати параметри запиту __a=1 і __d=1. Щоб визначити їх, ми створюємо об’єкт словника з параметрами.

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

Для авторизації наших запитів Instagram вимагає ідентифікатор сеансу. Пізніше я покажу вам, як отримати ідентифікатор сеансу. Наразі просто вставте значення заповнювача, яке ви заміните пізніше.

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

Далі визначте функцію, яка запускатиметься після успішного виконання запиту.

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

Функція, яку я визначив, прийматиме об’єкт відповіді, витягуватиме JSON із тіла відповіді, а потім аналізуватиме JSON на об’єкт. Після цього я витягаю лише повне ім’я та біографію профілю.

Далі визначте функцію, яка запускатиметься у разі виникнення помилки.

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)

Потім ми викликаємо функцію get, щоб зробити запит, передаючи URL-адресу, параметри та файли cookie як аргументи.

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

Потім, нарешті, ми перевіряємо код статусу помилки. Якщо статус 200, ми викликаємо функцію on_success. Інакше ми просто викликаємо функцію on_error.

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

На цьому ми закінчили писати код. Залишилося отримати ідентифікатор сесії. Щоб отримати ідентифікатор сеансу, відкрийте Google Chrome і відкрийте Instagram в Інтернеті. Переконайтеся, що ви ввійшли в систему, а потім відкрийте інструменти розробника за допомогою Ctrl + Shift + I або Cmd + Shift + I.

  Як надсилати GIF-файли в Instagram

Відкривши Dev Tools, відкрийте вкладку Application.

Потім клацніть підменю Cookies, щоб переглянути файли cookie, які використовує Instagram.

Після цього скопіюйте значення файлу cookie sessionid зі списку файлів cookie, який буде вказано на панелі Dev Tools.

Скопіювавши ідентифікатор сеансу, вставте його в сценарій і виконайте сценарій. У моєму випадку, використовуючи Instagram як ім’я користувача (https://instgram.com/instagram?__a=1&__d=1), це результат.

І просто так ми можемо динамічно завантажувати дані профілю. Існує набагато більше даних, які повертаються з JSON API. Це результат, коли ви надрукуєте все це:

І саме так ви витягуєте дані та публікації з профілів Instagram.

Заключні слова

У цій статті ми розповіли, як завантажувати публікації та медіа за допомогою Instaloader. Потім ми написали спеціальний сценарій для вилучення даних профілю JSON, який містить набагато більше, ніж просто медіа-вміст. Якщо вам сподобався цей проект, можливо, ви захочете переглянути наш допис про Python Timeit to Time Your Code.

Якщо ви хочете отримати більше від свого досвіду в Instagram, перегляньте нашу публікацію на Qoob Stories: детальний огляд завантажувача Instagram.