Web Scraping Instagram with Selenium Python
Selenium is one of the many tools that can be used to scrape a website. And now I want to explain how we can scrape the Instagram account from the website.

Why using Selenium?
As we know that many tools can be used to scraping data from a website, and the three most popular from them are Scrapy, Beautifulsoup, and Selenium. However, each of them has the special ability for their action to scrape a website.
You can search about Scrapy, Beautifulsoup, and many other tools that can be used to scraping in many other places, but now I want to explain how we choose Selenium for scraping this time here.
Selenium is a powerful tool for scraping. It can handle automation in a complex way. For example, we need to log in to our Instagram account to scraping Instagram’s website. And surprisingly, selenium can handle it such as log in to our Instagram account automatically.
Secondly, selenium can scrape the website using a timer that we can set as required. It very helpful since Instagram’s team has banned automatically scraper bot for its website. Yes, we can set the timer for our automatic scraper. So, our scraper doesn’t act rapidly which is can reduce the risk from banned by Instagram’s team.
Requirements
- You must finish reading this article first, and then doing the practice technically.
- Familiar with a python programming language, especially the theory of OOP.
- We need a code editor and python that have been installed on your PC/Laptop.
- The browser, in this case, is Google Chrome, so the options that will be mentioned in this article are available on Google Chrome.
What you’ll learn
You will have knowledge about selenium python theory (auto login, auto click, auto scroll page down, auto download).
Download webdriver or geckodriver
One of the tools that we must prepare to run the selenium program is webdriver (for Chrome) or geckodriver (for Firefox). You can download it from here (for Chrome user) or here (for Firefox user).
Installing the required libraries
First, we must install a selenium library on our terminal such as the code below:
Once it has been done, then we must install some python libraries required such as time and requests like the code below:
Great! Our scraping environment has been prepared, and let’s code!
Importing the libraries
Here the code about importing the required libraries for scraping using selenium:
In this tutorial, I use Chrome for scraping. So, we must import the webdriver library from selenium as the code above.
Setting the PATH code
The PATH code is the code that aims to connect our code with the browser. Here the code logic about PATH is below:
The code above represents that the chromedriver package that has been downloaded is in the download folder. And then the PATH variable code must be the same as the chromedriver package directory in the PC.
Get the Instagram’s website
After coding the PATH variable, then we must get Instagram’s website which is our scraping target. So, the code is below:
Then you can save this code, and run it! And see…..

Well done! Our automatic bot is succeed in accessing Instagram’s website automatically.
Log in to our Instagram account
The next step is to log in to our Instagram account. In this case, I recommend you to use your second Instagram account to try this activity. I think it will reduce the risk of losing your Instagram account.
First, we must set the time to sleep from the time library, then we create the code about login to our Instagram account such as the code below:
However, 5 is the time of waiting time for the next code to run. The time is represented by seconds.
Then we must know about the element for the username box which is used to Log In to our Instagram account by inspecting the element (CTRL+SHIFT+I) like the image below:

whereas the elements column as the image below:

As we know that the first step to creating the code to log in automatically is to search the username box. It aims to fill the blank username with our Instagram username account automatically.
According to the image above that, the selector of the username box is input. Whereas the name of the username box is username. And then the code is username=driver.find_element_by_css_selector(“input[name=’username’]”).
The same thing is applied to the password variable which is as the image below:

and the elements column is in below:

So we can get the type CSS selector for password box namely input, and the name of it named password. And then we must type the code to password=driver.find_element_by_css_selector(“input[name=’password’]”).
After that, we must input our username and password for our Instagram account by the send_keys option in those lines. In this case, I use my username namely “xxxxxx” and my password is “123456”.
The next step is login clicking automatically. It can be typed as login = driver.find_element_by_css_selector(“button[type=’submit’]”).click() where the thing is similar about create the username and password variable before. But for this action, we must add the click option in the last of the line for clicking automatically named .click().
Well, let’s run the code, and see!

Great job! We have done it!
Skip the pop-up automatically
And then, the next step after login into our Instagram account is by clicking the text named Not Now or Save Info. In this case, I use the Not Now option. Actually, you can choose the Save Info option if you want.
Then, like the same things as creating the username, password, and login variable, so we must type the code to create the Not Now variable as below:
The code above explains that the first step that we must code to skip the pop-up named Saved Your Login Info is to create the Not Now variable such as notnow = driver.find_element_by_xpath(“//button[contains(text(), ‘Not Now’)]”).click().
In this case, we try to get the element of the Not Now variable by find_element_by_xpath as explained in the selenium python website here. When we use the xpath method to search the location of the element, we can use the text targetted. For example, we use the text named Not Now when we want to get the location of the element Not Now in the pop-up notification by xpath method as the image below:

whereas the elements column like as the image below:

Let’s run it! And if you have done it, then you can find the second pop-up notification such as the image below:

The image above is the pop-up notification part two. It has appeared when the first pop-up notification named Saved Your Login Info is clicked. Then we will give the name for this pop-up notification part two namely Turn on Notifications pop-up.
So, we must create the variable the Turn on Notifications pop-up named the notnow2 variable. And we must do the same things about getting the variable of notnow2 by searching the location of its element as the image in below:

and the elements column as below:

so, the code is notnow2 = driver.find_element_by_xpath(“//button[contains(text(), ‘Not Now’)]”).click().
Let’s check the code! Run it, and see! (if this step has finished, you will find the primary page of your Instagram account).
Searchbox handling
Since we’ve found the primary page of our Instagram account named home, then we must go to the Instagram account target by type the name of our Instagram account target in the search box located at the top of the display as an image in below:

Then, we must get the element of the search box to fill the blank box automatically. In this case, we use the Instagram account public named host.py. (just click it to see the account)
Thus, the code that we can create by doing the same things with handling the pop-up automatically in the previous step is as the image below:
The code above explains that creating the searchbox variable is the first step that we must be doing to handle the search box automatically. So, we just take the same things about it which is to create the variables that we finished in the previous step.
And we must create the searchbox variable with the code searchbox=driver.find_element_by_css_selector(“input[placeholder=’Search’]”) where the type of this box is input. Whereas the type of the selector is placeholder named Search, like as image in below (you can find it by inspecting the elements):

After it, we must use the send_keys option from the library to type the Instagram account target to the search box automatically such as searchbox.send_keys(“host.py”).
Then, we must create the enter button automatically by fill the code with the Keys.ENTER option. (Notes: we must create it twice, and we should check it on the Instagram account website to debug it)
Lastly, if we have finished and success to run the code, then we will find the Instagram profile target like as image below:

Well done! You got it!
Scroll down the profile
Since we have the profile page for the target user, we must think that we have already scraped this page soon. However, we must scroll down the page automatically first before. Here the code:
Then let’s check the code by running it, and see! (it must be scroll down the page automatically if you have succeeded)
Get the URL posts
Now, time to get these URL posts which are posted in https://instagram.com/host.py/!
As we know that there are 11 posts as images in there. So, we can create the code like as image below:

According to the image above, we must create the empty box which is used to accommodate all the URL posts named posts, and we can type the code like below:
Then, we create the links variable which is to get all the elements that have the tag name “a”. Thus, create the for loop function to get all the URL posts by following the code as the image above, and print!
Now, the code to get all URL posts has been created. We can check it out, and see! (just wait for a few minutes)

Exactly! The image above represents all the URL posts on the page, which shows 11 URLs in there. Good job!
Download all of the posts
Lastly, we must download all of the posts on there, and save them to our directory where the script has been saved on. So, the code is in below:

The image above explains that we must create a variable to accommodate all the names of images that we want to download named shortcode firstly. For example, when the URL’s name of the first post is https://www.instagram.com/p/CNMnQ0JAPfA/ so we can give the name CNMnQ0JAPfA.jpg to the file. Then it must be applied to the others files.
I assume that we have understood how we can get the selector for the download_url variable that has been written in the image above.
Conclusion
Finally, we have got all about the code completely in here. So what are we waiting for? Here the code:
Вытаскиваем данные из 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
Всего 119 Kb
278 Kb
Outro

С каждым часом, проведённым в социальных сетях, мы предоставляем информационным компаниям всё больше и больше информации о себе. А развитие технологий анализа этих данных позволяет уже не просто знать что-то о нас и нашем поведении, но и предсказывать наши наиболее вероятные действия, или даже ненавязчиво влиять на процесс совершения этих действий. Если честно, то меня всегда завораживала та сила, которая есть у компаний, возможно, знающих о нас больше, чем мы сами.
Надеюсь, у меня получилось вдохновить вас на какой-нибудь интересный проект, базирующийся на данных из Instagram. Лично у меня чешутся руки поискать какие-нибудь нетривиальные закономерности, например, сравнить как отличается контент и геотеги публикаций travel блоггеров за 2019 и 2020 год. Ммм, А если ещё и прикрутить куда-нибудь нейросетки и попробовать самому сделать рекомендательную систему для классных фотографий (не зря же два года CV занимался). Ненавязчиво оставлю ссылку на мой телеграм канал, где я буду писать про дальнейшие свои изыскания в этой области.
К слову, если вы вдруг будете делать что- то связанное с Instagram, то вот максимально актуальная на сегодняшний день библиотека.
l-Il/Instagram-Parser
В левое окно ник: вводить имя профиля аккаунта, который нужно «просмотреть».
После нажатия кнопки Войти придётся подождать (чем больше подписок/подписчиков у человека, тем больше время ожидания) и программа об этом сообщает.
В результате успешного выполнения в три ряда выводятся подписчики, подписки, и общие (взаимные) подписки.
После нажатия кнопки Скачать истории в папке с проектом появится папка :stories, в которой находится история и .json файл с метаданными для каждой истории.
Так же, в папке с проектом появится папка с id человека в виде комбинации цифр
Чтобы найти людей, на которых вместе подписаны двое людей, введите в поля ник: два имени профиля аккаунтов.
После нажатия кнопки Общие придётся так же подождать.
В результате в среднее окно выведутся все ники пользователей (общие), на которые подписаны оба человека.
В случае неудачи, или ошибки, сверху покажется статус ошибки (К примеру, неверный пароль, или несуществующий аккаунт).
Не стоит спамить постоянными проверками, с небольшой задержкой, Instagram ставит лимит на количество запросов в ограниченный промежуток времени.
Если аккаунт закрыт, результат будет положительным, но в три колонки ничего не выведется.

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