Как парсить инстаграм на python
Перейти к содержимому

Как парсить инстаграм на python

  • автор:

Как парсить инстаграм на python

In this article, we will learn how can we get Instagram profile details using web scraping. Python provides powerful tools for web scraping, we will be using Instagramy here. This tool is specifically made for Instagram and also analyzes the data using Pandas.

Installation

The python package Instagramy is used to scrape Instagram quick and easily. This package is installed by running the following command. Based on the network connection it scrapes the data for you.

Scraping Instagram with python (using Selenium and Beautiful Soup)

This article is about how to scrape Instagram to download images/get information on posts from a public profile page or a hashtag. The code uses both selenium and beautiful soup to scrape Instagram images without much of a hassle of providing account details or any authentication tokens.

  1. Import dependencies

Pip Install selenium and download chrome driver from the following link http://chromedriver.chromium.org/

2. Open the web browser: Selenium uses chrome driver to open the profile given a username (public user). For example —

If you want to open a hashtag page —

3. Parse HTML source page: Open the source page and use beautiful soup to parse it. Go through the body of html script and extract link for each image in that page and pass it to an empty list ‘links[]’.

Remember by default selenium opens only first page. If you want to scroll through further pages and get more images divide the scroll Height by a number and run the parse code multiple times. This adds new links from each page to the list. For example —browser.execute_script(“window.scrollTo(document.body.scrollHeight/1.5, document.body.scrollHeight/3.0);”)

Update — This method did work for me earlier but with new Instagram changes I did not find any luck in getting more than 12 posts from profile page.

The columns you get might be slightly different for user profile page and hashtag page. Checkout the columns and filter whatever you need.

5. Get details for each post

Go through every link in the list and extract detailed information to a pandas dataframe

Here’s a sample output —

6. Download images from pandas data frame: Use requests library to download images from the ‘display_url’ in pandas ‘result’ data frame and store them with respective shortcode as file name.

(Important Note: Remember to respect user’s rights when you download copyrighted content. Do not use images/videos from Instagram for commercial intent).

Thanks for reading and I hope you find this article useful. If you have any questions, I’d be more than happy to discuss.

Basic architecture for this code is based on information from these two resources —

Name already in use

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Простой парсер открытых аккаунтов на питон

В левой рамке находятся два окна для ввода, в них вводить свой логин и пароль. (Либо твинка, либо основного аккаунта для просмотра закрытых аккаунтов, на которые вы подписаны)

В аккаунт, на котором установлена двухфакторная аутентификация, войти не получится.

В левое окно ник: вводить имя профиля аккаунта, который нужно «просмотреть».

После нажатия кнопки Войти придётся подождать (чем больше подписок/подписчиков у человека, тем больше время ожидания) и программа об этом сообщает.

В результате успешного выполнения в три ряда выводятся подписчики, подписки, и общие (взаимные) подписки.

После нажатия кнопки Скачать истории в папке с проектом появится папка :stories, в которой находится история и .json файл с метаданными для каждой истории.

Так же, в папке с проектом появится папка с id человека в виде комбинации цифр

Чтобы найти людей, на которых вместе подписаны двое людей, введите в поля ник: два имени профиля аккаунтов.

После нажатия кнопки Общие придётся так же подождать.

В результате в среднее окно выведутся все ники пользователей (общие), на которые подписаны оба человека.

В случае неудачи, или ошибки, сверху покажется статус ошибки (К примеру, неверный пароль, или несуществующий аккаунт).

Не стоит спамить постоянными проверками, с небольшой задержкой, Instagram ставит лимит на количество запросов в ограниченный промежуток времени.

Если аккаунт закрыт, результат будет положительным, но в три колонки ничего не выведется.

Это бета версия программы, в которой пока что малый функционал (просмотр подписок/подписчиков, скачивание историй и просмотр общих подписчиков между двумя людьми)

About

��️ Утилита, выводящая разделы «подписчики», «подписки» и показывающая взаимные подписки, а также позволяющая анонимно скачать истории.

Вытаскиваем данные из Instagram

Давайте разберемся, как с помощью достаточно простого кода на python можно вытащить из инстаграмма разные данные, находящиеся в открытом доступе.

Intro

При фазовом переходе из состояния Employed в Self-Employed я погрузился в собственные проекты, которые давно хотел сделать. После парочки телеграм ботов с e-acquiring я решил попытать счастья с Instagram. Как человеку, прежде работавшему только с готовыми и подчищенными данными, мне было интересно познакомиться с процессом добычи данных поближе.

Если вам лень читать всё, то вот демонстрационный бот в Телеграм, который может вытаскивать некоторые данные из Instargam.

На данный момент бот может обрабатывать несколько запросов

Случайный выбор подписчика / подписчиков аккаунта

Случайный выбор пользователя / пользователей, поставивших лайк под постом

Случайный выбор комментатора / комментаторов, оставивших комментарий под постом

Общие подписчики для двух пользователей

user-info JSON (информация о пользователе Instagram в том виде в котором она хранится на серверах)

media-info JSON (информация о публицации в Instagram в том виде, в котором она хранится на серверах)

P.S. Надеюсь, он не упадет под натиском запросов

P.P.S И надеюсь, что профиль в инсте, через который проводятся запросы не заблочат

Inspiration

Во многом меня вдохновила статья, где анализируются самые популярные геотеги Москвы, и телеграм канал её автора. Мне стало интересно, а как вообще вытаскиваются данные из социальных сетей.

Какое API выбрать?

Начнем с того, какие библиотеки использовать. Так как я пишу на питоне, то библиотеки выбирал под него.

У Facebook есть официальное API для взаимодействия с Instagram. Это API Graph и API Instagram Basic Display. Процесс его настройки и использования показался мне чрезмерно сложным, поэтому я решил поискать решение попроще.

Из неофициальных API есть сравнительно популярный InstaPy (12k GitHub), работающий на базе Selenium. Мне такой фреймворк показался громоздким.

После нескольких часов поисков мой выбор пал на достаточно удобную библиотеку instabot, сама библиотека, документация.

Прежде чем мы начнем разбираться с кодом, стоит сделать пару замечаний. Сразу оговорюсь, что я достаточно скептически отношусь к использованию таких фреймворков для автоматизации активности (лайки, комментарии, подписки) с целью увеличения аудитории.

Инстраграм не особо хорошо относится к использованию такого рода библиотек в целях раскрутки, да и в целом, к «нечеловеческой» активности относится негативно. Поэтому не рекомендую использовать их на своём основном аккаунте. Не знаю, какая вероятность того, что вас могут заблокировать, но она явно отлична от нуля.

Мой основной интерес был в том, чтобы поиграться с данными.

Что можно сделать?

В рамках данной статьи я расскажу о том, как можно получать следующую информацию:

Подписки и подписчики определенного аккаунта

Пользователи поставившие лайк / оставившие комментарий

Посты определенного пользователя

Информация о пользователе

Загрузка изображений из Instagram

Гораздо интереснее рассматривать такой процесс сбора информации не как изолированную задачу, а как задачу прикладную. Поэтому для каждого пункта я нашёл некоторые реальные задачи и показал, как их можно решить.

Список подписчиков

Представим ситуацию, что вы юный блоггер, и для расширения аудитории решили провести розыгрыш. Новый год, тем более скоро, так что пример актуальный. Допустим, что основной критерий розыгрыша — быть подписанным на вас.

Таким образом мы можем сформулировать задачу — как случайным образом выбрать одного или несколько подписчиков, чтобы вручить им подарки.

Давайте посмотрим, как это можно сделать. Для начала необходимо авторизоваться. К слову, чтобы не подвергать риску свой основной аккаунт я создал новый и все запросы проводил через него.

После того, как мы авторизовались — мы можем получить список подписчиков и список подписок для любого пользователя с открытым аккаунтом. Осуществляется это следующим образом.

Стоит заметить, что в данном случае мы увидим что-то вида

Это user_id пользователей. Для того чтобы получить юзернеймы пользователей нужно сделать следующее:

Однако стоит иметь ввиду, что запрос get_username_from_user_id работает не мгновенно и внутри программы лучше работать с user_id а резолвить его в юзернейм только при необходимости.

Выбрать случайным образом несколько подписчиков username можно, например, вот так

Учитывая, что блоггеры любят проводить коллективные розыгрыши — можно получить списки подписчиков для нескольких аккаунтов и уже среди множества пользователей, подписанных на все необходимые профили, выбирать победителей.

Список людей, поставивших лайк

Продолжая эксплуатировать блогерскую тематику, представим, что вы проводите розыгрыш не только среди пользователей, подписанных на вас, но и оставивших лайк под вашим постом. Как получить список пользователей в таком случае?

Для начала нужно получить media_pk из ссылки на ваш пост:

Тогда для списка людей, поставивших лайк:

Список людей, оставивших комментарий:

Также можно получить список комментариев под постом

Дальше с этими списками можно работать точно также, как и в предыдущем пункте. Например, можно выбирать победителей среди тех пользователей, которые подписаны на вас и которые оставили лайк и комментарий под последними N публикациями.

Посты пользователя

Давайте перейдём к более интересным вещам и посмотрим, какую информацию о наших постах предоставляет Instagram. В библиотеке есть методы, позволяющие получить информацию о постах пользователя.

Например вот так можно получить идентификаторы последних 20 постов пользователя:

Параметр filtration отвечает за фильтрацию постов. Он выбрасывает посты, количество лайков которых либо меньше bot.min_likes_to_like , либо больше bot.max_likes_to_like Эти параметры можно настроить и поставить filtration = True .

В данном случае twony_last_medias будет иметь вид:

Где первая часть, до _ — это идентификатор поста, а вторая часть — user_id , то есть media_id = _

Посмотрим, какую информацию о постах нам может дать Instagram:

media_info — это JSON следующего формата:

Пример полноценного JSONa

Давайте посмотрим как выглядит JSON для поста в инстаграме. Вы можете получить такой же JSON для любой своей публикации, обратившись к боту.

В media_info содержится вся доступная о посте информация, будь это геопозиция, отмеченные пользователи, комментарии и количество лайков.

Ниже пример поста и JSON соответсвующий ему.

В постах содержащих видео или несколько изображений (карусель) содержатся ещё такие поля:

Как уже было замечено ранее, в media_info содержится вся доступная о посте информация, будь это геопозиция, отмеченные пользователи, комментарии (а если быть точным их превью, preview_comments ) и количество лайков.

Ниже расшифровка для некоторых полей:

taken_at , pk , id , device_timestamp — время создания поста и его идентификаторы.

media_type — тип контента внутри поста. Одно изображение / несколько изображений / видео / пост в IGTV.

location , lng , lat — всё что относится к геопозиции, указанной в посте. Объект location содержит информацию о геотеге (например facebook_places_id , address , city ), lng и lat — координаты геотега. Интересно кстати, что координаты дублируются, они есть как в объекте location , так и в самом media_info .

usertags — объект, содержащий информацию об отмеченных пользователях.

Давайте посмотрим на некоторые необычные поля, которые также есть в этом JSON. Больше всего меня смутили два поля — top_likers и facepile_top_likers . Как оказалось, это лайки тех пользователей, которые отображаются непосредственно до количества лайков («Нравится username и еще N пользователям», в мобильной версии есть еще три маленьких круглых картинки до этой надписи). Готов предположить, что Instagram показывает таким образом лайки тех пользователей, которых он считает наиболее интересными и важными для нас.

top_likers содержит в себе только один username и используется для текстовой аннотации. facepile_top_likers отвечает за визуальную аннотацию лайков, этот объект содержит в себе три профиля пользователей, где у каждого профиля указана ссылка на его аватарку ( profile_pic_url ).

Как это выглядит?

Интересно, кстати, что media_info содержит поле organic_tracking_token . Как утверждает Инстраграм — таким образом происходит поддержка брендов, занимающихся производством органической продукции.

А какие данные можно получить о пользователе?

Посмотрим, какую информацию Instagram предоставляет о нас — рядовых пользователях. На примере моего любимого фотографа.

Такая структура данных содержит основные данные о профиле (в том случае, если он открытый, если профиль закрытый — то данных будет гораздо меньше). Также тут есть некоторые поля для отображения общих подписчиков. Ещё в такой структуре данных Инстаграм может присылать список аккаунтов, на которые он рекомендует вам подписаться.

Как скачать изображение

Для того чтобы скачать изображение необходимо найти в этом JSON ссылку на фотографию, которая хранится либо в image_versions2 , в случае когда в посте всего одна фотография, либо в carousel_media , когда в посте фотографии несколько. carousel_media содержит в себе изображения, которые хранятся в виде объектов image_versions2

Пример объекта image_versions2 :

Можно заметить, что Инстаграм хранит у себя две версии фотографии: большего и меньшего разрешения. Судя по всему, фотография меньшего разрешения нужна для того чтобы отображать пост в ленте.

Так как в библиотеке не работала функция загрузки изображений, я написал свой вариант. Тут учтено, что в одном посте может быть как одна, так и несколько фотографий. Если же пост содержит видео, то этот код скачает фотографию, которая стоит на обложке видео.

Представим себе ситуацию, что мы хотим скачать некоторое количество изображений из профиля фотографа, который нам нравится:

Несколько загруженных таким образом фотографий невероятного shortstache. Удивительно, насколько Инстаграм сжал эти фотографии без видимой потери качества.

Всего 160 KbВсего 160 Kb Всего 119 KbВсего 119 Kb 278 Kb278 Kb

Outro

С каждым часом, проведённым в социальных сетях, мы предоставляем информационным компаниям всё больше и больше информации о себе. А развитие технологий анализа этих данных позволяет уже не просто знать что-то о нас и нашем поведении, но и предсказывать наши наиболее вероятные действия, или даже ненавязчиво влиять на процесс совершения этих действий. Если честно, то меня всегда завораживала та сила, которая есть у компаний, возможно, знающих о нас больше, чем мы сами.

Надеюсь, у меня получилось вдохновить вас на какой-нибудь интересный проект, базирующийся на данных из Instagram. Лично у меня чешутся руки поискать какие-нибудь нетривиальные закономерности, например, сравнить как отличается контент и геотеги публикаций travel блоггеров за 2019 и 2020 год. Ммм, А если ещё и прикрутить куда-нибудь нейросетки и попробовать самому сделать рекомендательную систему для классных фотографий (не зря же два года CV занимался). Ненавязчиво оставлю ссылку на мой телеграм канал, где я буду писать про дальнейшие свои изыскания в этой области.

К слову, если вы вдруг будете делать что- то связанное с Instagram, то вот максимально актуальная на сегодняшний день библиотека.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *