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

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

  • автор:

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

Необходимо реализовать скрипт для парсинга подписчиков в инстаграме.
На вход дается MySQL таблица с блоггерами (предоставлю).
Скрипт должен асинхронно парсить подписчиков этих блоггеров и складывать данные в БД.

Endpoint:
www.instagram.com/graphql.
где
id id блоггера
first, limit одинаковое значение, сколько подписчиков получить за раз (надо поиграться, по 3000 за раз вроде бы нормально вытгивает
after токен для доступа к следующей «странице»

Т.е. асинхронно парсить один аккаунт (одного блоггера) невозможно (из-за токена).

Необходимо подставлять headers (логинимся в бразуере и из network таба копируем хедеры), нормального АПИ, к сожалению, уже нет.

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

Условия:
1) Только python 3
2) Обязательное логгирование (ход парсинга, ошибки)
3) Профессиональный код (простой и сам могу написать, смысл в том, чтобы получить «настощий» код, как это должно быть у профессионалов, чтобы в том числе и поучиться).
3) Желательно через asyncio (либо другой, современный вариант). Понятное дело, что можно и grequests / mulprocessing / threading, но, опть же, смысл в том, чтобы получить современное решение production-уровня
4) Комментарии
5) Простые for не предлагать, такое и сам могу сделать
6) Код обязательно буду смотреть, т.е. тяп-ляп не пройдет, своих знаний для оценки качества хватит

Оплата:
БД или по факту (каким-то безопасным для себя образом показываете работу и я оплачиваю), без вариантов (развелось тут разводчиков, к сожалению, в последнее время.
Бюджет, думается, вполне оправдает день работы, однако всегда можно подвинуться, главное чтобы качество было высоким.

Таблицу со списком блоггеров для парсинга предоставлю (39).

Повторюсь:
Смысл в том, чтобы получить профессиональное решение, так как если бы скрипт делали для себя, работающее максимально быстро, логгирующее и обрабатывающее ошибки.

Если нужно купить аккаунты или прокси все сделаю и скину )

Если что-то смущает с радостью пообщаюсь в скайпе и все поясню.

Робот для автоматизированного просмотра Instagram на Python и Selenium

Недавно мы начали вести Instagram — подписывайтесь, чтобы не пропустить контент, которого нет в блоге и Telegram!

Многие из нас ежедневно заходят в Instagram, чтобы посмотреть истории друзей и полистать ленту постов и рекомендаций. Предлагаем действенный способ сохранить своё время — напишем на Python и Selenium робота, который возьмёт на себя рутинную задачу проверки свежих новостей друзей и подсчитает число новых историй и входящих сообщений.

Авторизация в аккаунт

При переходе в браузерную версию сайта, нас встречает такое окно:

Но просто вставить логин, пароль и нажать на кнопку «Войти» недостаточно: впереди будет ещё два окна. Во-первых, предложение сохранить данные — здесь мы тактично жмём «Не сейчас». Instagram тщательно следит за каждым нашим действием и малейшие аномалии в поведении приводят к блокировке, поэтому любые предложения по сохранению данных будем на всякий случай пропускать.

Следующим препятствием будет предложение включить уведомление, которое мы тоже пропустим:

Первым делом импортируем библиотеки:

from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup as bs import time import random

И описываем функцию authorize — она будет принимать driver в качестве аргумента, отправлять в нужные поля логин и пароль, нажимать на кнопку «Войти», затем ждать десять секунд на загрузку страницы, нажимать на кнопку «Не сейчас», снова ждать загрузки страницы и пропускать уведомления:

def authorize(driver): username = 'login' password = 'password' driver.get('https://www.instagram.com') time.sleep(5) driver.find_element_by_name("username").send_keys(username) driver.find_element_by_name("password").send_keys(password) driver.execute_script("document.getElementsByClassName('sqdOP L3NKy y3zKF ')[0].click()") time.sleep(10) driver.execute_script("document.getElementsByClassName('sqdOP L3NKy y3zKF ')[0].click()") time.sleep(10) driver.execute_script("document.getElementsByClassName('aOOlW HoLwm ')[0].click()")

Новые сообщения

В Instagram могут прийти сообщения двух видов. В случае, если вы не подписаны на отправителя — придёт запрос на диалог. Если подписаны — придёт входящее сообщения. Оба случая обрабатываются по-разному. Число входящих сообщений можно получить с главной страницы — это число над иконкой бумажного самолётика:

А число запросов можно забрать текстом заголовка h5 из раздела «Сообщения». Сперва перейдём в этот раздел и попробуем найти строку с запросами на сообщение. Затем вернёмся на главную страницу и возьмём то самое число новых сообщений.

def messages_count(driver): driver.get('https://www.instagram.com/direct/inbox/') time.sleep(2) inbox = bs(driver.page_source) try: queries_text = inbox.find_all('h5')[0].text except Exception: queries_text = None driver.get('https://www.instagram.com') time.sleep(2) content = bs(driver.page_source) try: messages_count = int(content.find_all('div', attrs=)[0].text) except Exception: messages_count = 0 return queries_text, messages_count

Подсчёт числа новых сторис

Все истории хранятся в одном блоке:

Это список с одинаковым классом, но в каждом элементе списка лежит ещё один div-блок. У новых историй это класс eebAO h_uhZ, у просмотренных — eebAO.

Ещё есть такая кнопка, которая показывает следующую пачку историй:

При этом Instagram динамически прогружает код страницы, и в нём не найти те элементы, которые вы не видите своими глазами. Поэтому мы возьмём первые 8 видимых новых историй, добавим в список, нажмём на кнопку «Показать следующие истории» и будем продолжать так, пока кнопка ещё отображается. А затем подсчитаем число уникальных элементов, чтобы избежать возможных дубликатов.

def get_stories_count(driver): stories_divs = [] scroll = True while scroll: try: content = bs(driver.page_source) stories_divs.extend(content.find_all('div', attrs=)) driver.execute_script("document.getElementsByClassName(' _6CZji oevZr ')[0].click()") time.sleep(1) except Exception as E: scroll = False return len(set(stories_divs))

Просмотр сторис

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

Есть еще две кнопки, о которых мы должны знать. Это кнопка для переключения на следующую историю — она в классе FhutL и кнопка закрытия блока историй — класс wpO6b. Пускай одна история будет отнимать у нас от 10 до 15 секунд, и с вероятностью 1/5 мы переключим на следующую. При этом зададим переменные counter и limit — пусть сейчас мы хотим посмотреть случайное число историй от 5 до 45, и если мы уже посмотрели столько, то выходим из функции и историй.

def watch_stories(driver): watching = True counter = 0 limit = random.randint(5, 45) driver.execute_script("document.getElementsByClassName('OE3OK ')[0].click()") try: while watching: time.sleep(random.randint(10, 15)) if random.randint(1, 5) == 5: driver.execute_script("document.getElementsByClassName('FhutL')[0].click()") counter += 1 if counter > limit: driver.execute_script("document.getElementsByClassName('wpO6b ')[1].click()") watching = False except Exception as E: print(E) watching = False

Скроллинг ленты

После просмотра актуальных историй можно поскроллить ленту — это действие ничем не отличается от классического скроллинга страниц в Selenium. Запоминаем последнюю доступную длину страницы, скроллим до неё, ожидаем прогрузки, получаем новую. Прекратим просматривать ленту в двух случаях — если в random.randint() сгенерировалась единица или если лента кончилась.

def scroll_feed(driver): scrolling = True last_height = driver.execute_script("return document.body.scrollHeight") while scrolling: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(random.randint(4,10)) new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height or random.randint(1, 10) == 1: scrolling = False last_height = new_height

Просмотр рекомендуемых аккаунтов

Instagram в заглавной странице сам рекомендует нам для подписки некоторые аккаунты. Выглядит она так:

И на ней тоже придётся скроллить, чтобы дойти до конца. Заходим на страницу и ожидаем 5 секунд прогрузки, затем снова получаем длину страницы и скроллим вниз. Выходим тоже с вероятностью 1/10 или если страница кончилась, но ещё с вероятностью 1/2 подписываемся на некоторые из первых 100 аккаунтов рекомендаций:

def scroll_recomendations(driver): driver.get('https://www.instagram.com/explore/people/suggested/') time.sleep(5) scrolling = True last_height = driver.execute_script("return document.body.scrollHeight") while scrolling: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(random.randint(4,10)) new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height or random.randint(1, 10) == 1: scrolling = False last_height = new_height if random.randint(0, 1): try: driver.execute_script(f"document.getElementsByClassName('sqdOP L3NKy y3zKF ')[].click()") except Exception as E: print(E)

Просмотр рекомендуемых постов

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

def scroll_explore(driver): driver.get('https://www.instagram.com/explore') time.sleep(3) scrolling = True last_height = driver.execute_script("return document.body.scrollHeight") while scrolling: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(random.randint(4,10)) new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height or random.randint(1, 5) == 1: scrolling = False last_height = new_height

Итог

Теперь можно собрать все функции вместе — создаём новый driver, проводим авторизацию, считаем число новых сторис и сообщений, просматриваем сторис, переходим в рекомендуемые подписки и листаем ленту. В конце печатаем полученные данные — число новых сообщений, запросов и историй друзей.

driver = webdriver.Chrome(ChromeDriverManager().install()) authorize(driver) queries_text, messages_count = messages_count(driver) stories_count = get_stories_count(driver) watch_stories(driver) scroll_recomendations(driver) scroll_feed(driver) scroll_explore(driver) if queries_text is not None: print(queries_text) else: print('Нет новых запросов на диалог') print('Новых сообщений:', messages_count) print('Новых историй:', stories_count)

Парсинг Instagram

Нужно написать скрипт на python, при помощи библиотеки Selenium.
Задачи:
-Парсинг подписчиков инстаграм по заданному User_name пользователя
-Выдача GET запросов(те, что в вкладке network) в виде списка на главной странице.

1 день 700 UAH

1 день 700 UAH
Здравствуйте, есть наработки на данную тему. Готов сразу взяться за выполнение
1 день 1000 UAH

1 день 1000 UAH

Здравствуйте, у меня есть опыт в подобных задачах, предлагаю обсудить более подробные задачи
Привіт, маю досвід у подібних задачах, пропоную обговорити детальніше завдання

1 день 500 UAH

1 день 500 UAH
Добрый день! Могу написать для Вас скрипт для описанных задач быстро, если это весь тз.
1 день 500 UAH

1 день 500 UAH

Добрый вечер , Святослав
Имею огромный опыт в написании проектов на Selenium
Готов написать Ваш проект буквально за один час в идеальном виде

P.S Проект готов со всеми комментариями и пояснениями!

1 день 500 UAH

1 день 500 UAH

Я уже написал, могу скачать для проверки готовый код, жду ответа)
вже написав, можу скинуть для перевірки готовий код, чекаю відповіді)

2 дня 500 UAH

2 дня 500 UAH

Здравствуйте, Святослав. Готов помочь Вам с решением задачи. Пишу в основном на Python. Все предыдущие проекты были автоматизацей на Selenium. Нуждаюсь в более подробном тз.

5 дней 500 UAH

5 дней 500 UAH

Есть скрипт написанный на 80%, который работает через реквесты, обязательно нужно селением использовать?

1 день 500 UAH

1 день 500 UAH
Здравствуйте,есть опыт парсинга с инстаграм,отпишите пожалуйста в лс для обсуждения деталей
1 день 500 UAH

1 день 500 UAH

Доброго дня!
У меня есть опыт в парсинга сайтов и готов выполнить ваши задачи в кратчайшие сроки. Если заинтересован в сотрудничестве со мной пишите в личное сообщение, для обсуждения деталей.
Доброго дня!
Маю досвід в парсингу сайтів і готовий виконати ваше завдання в максимально короткі терміни. Якщо цікавить співпраця зі мною пишіть в особисті повідомлення, для обговорення деталей.

Еще 3 ставки скрыты

28 марта 2023, 8:32 |

Код виконується і показує шкалу виконання процессу
imageОсь такий вивід в txt всіх друзів imageМожна парсить відразу цілий список який буде окремо зберігати файли друзів кожного юзера
Список звідки брать user
imageЗберігання в корні зі скриптом
image

Актуальные фриланс-проекты в категории Python

Это вебкам сайт, на нем ведут стримы тысячи моделей, у каждой модели есть чат где общаются люди которые ее смотрят, нужно сделать скрипт чтобы он спамил определенно сообщение у каждой модели в чате, чтобы я мог написать логин пасворд в строку оно зашло на акк и начинало спамить…

Привет! Требуется «скормить» ИИ техническое задание на написание кода графического интерфейса (python 3, PyQt6) ТЗ прилагаю. ТЗ написано понятно для ИИ. ChatGPT 3,5 выдает релевантные ответы как на ТЗ в целом, так и на все его части по отдельности, но ТЗ приходится загружать…

Видео, которое нужно автоматизировать: https://youtu.be/_RxvhtnShIM Технические задачи для реализации указанных функциональностей: 1 .Подключение к фантом сумки без загрузки: — Разработать механизм для установки соединения с фантом сумкой без необходимости загрузки сумки.-…

Вот приблизительное описание этого бота: 1 .Гаманец в приложении: — Разработать функцию, которая позволит пользователям создать кошелек в Telegram-боте.- дать пользователям возможность удобно отправлять и выводить средства непосредственно из этого кошелька для игрных…

Требуется разработать веб-бота для платформы Telegram, схожего с определенным образцом, который представляет из себя поддержку и облегчение работы для работников . Ожидается, что бот будет обладать определенными функциями и возможностями, похожими на указанный образец.…

Парсинг Instagram на Python. Какие нужны либы?

Решил написать эдакий парсер для Instagram. И тут же столкнулся с проблемой.
Использование Requests в связке с bs4 не дают нужного результата, ибо инстаграм выдает список постов по мере скроллинга вниз.
Условно говоря, я могу получить только 3-6 первых постов.

Что посоветуете использовать, дабы вытянуть все имеющиеся посты профиля?
То есть, нужно что-то, что позволит прогрузить все посты.

  • Вопрос задан более трёх лет назад
  • 2751 просмотр

1 комментарий

Простой 1 комментарий

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

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