Парсинг instagram
Как я могу получить все ссылки на публикации аккаунта в инстаграме? Пробовал через bs4, requests, selenium, все это с headers’ами В html одно и тоже и нет нужного, как будто js блокирует или что-то типа того. Подскажите в какую сторону думать? Такая проблема именно с сайтом инстаграмма.
Отслеживать
Clark Devlin
задан 28 янв 2020 в 1:15
Clark Devlin Clark Devlin
1,394 1 1 золотой знак 14 14 серебряных знаков 30 30 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Есть прекрасный запрос, который возвращает кучу данных о пользователе(включая информацию о последних 15 постах). А там уже можно будет покопаться с bs4 и работой со словарями.
'https://instagram.com/zuck/?__a=1'
Отслеживать
ответ дан 4 июн 2020 в 11:15
11 1 1 бронзовый знак
Попробуйте использовать instagram api. Есть несколько модулей для пайтона. Так же вот, что можно найти в документации про получение постов
Так же, возможно, стоит обратить внимание на этот репозиторий
Отслеживать
ответ дан 28 янв 2020 в 1:27
744 6 6 серебряных знаков 19 19 бронзовых знаков
На сколько я знаю, апи у инстаграма ограниченное, пока они тебе его не одобрят. А в ограниченной версии можно было только 20 последних постов получить, по крайней мере раньше. Да, и посты мне нужны не со своего аккаунта.
28 янв 2020 в 1:28
@ClarkDevlin так как в коде страницы нет всех постов, думаю, единственных выход это имитация бразуера через requests или selenuim, как удобно тебе
28 янв 2020 в 1:31
я понимаю, но когда я получаю html файл с помощью этих библиотек там совершенно не то, что в браузере. В коде посты есть, если через браузер смотреть, во вложенных дивах.
Парсинг постов и их статистики в Instagram при помощи кода на Python
Внимание! На данный момент страница проекта на GitHub удалена, а инструменты для вытаскивания ID аккаунтов, описанные в статье, не работают. Сама библиотека еще работает, но ее работу нужно изучать.
Небольшие аккаунты в районе 1000-2000 постов собираются быстро, как раньше, и без видимых усилий.
Скачать библиотеку Instagram-API-python вы можете по ссылкам ниже. Соответственно, та часть инструкции, которая касается скачивания библиотеки из GitHub более не актуальна, просто разархивируйте скачанный файл, при помощи CD войдите в получившуюся директорию, установите, и продолжайте инструкцию с этого момента.
UPDATE 06.09.2020 — Как самостоятельно получить ID аккаунта в Instagram
- Открываем страницу нужным аккаунтом в Google Chrome.
- Щелкаем правой кнопкой, просмотреть код страницы. (F12 на Windows; ⌥+⌘+i на Mac OS)
- Там переключаемся в консоль (Console) при помощи кнопки внизу, и вводим в консоли window._sharedData.config.viewerId
- Нажимаем Enter
- Если получили ошибку — перезагружаем страницу.
- На выходе получаем ID аккаунта, можно вставлять в код парсера и парсить!
Для начала — немного об использовании официального API от Instagram. С 15 октября 2019 года регистрация новых клиентов через Instagram Developer прекращена, и не предвидится. Если вы успели зарегистрироваться раньше — доступ еще есть, но вам потребуется получить расширенные права через подтверждение приложения. Без них вы сможете скачать данные только по 20 последним публикациям, не более. Если не зарегистрированы, вам доступен API Instagram Basic Display. О его возможностях можно почитать по ссылке. Факт в том, что официальный API требует подтверждения вас, как доверенного лица от Instagram.
Этих проблем позволяет избежать использование неофициальных API. И самый популярный из них — упомянутый выше Instagram-API-python от LevPasha. API написан на Python, так что для взаимодействия с ним мы так же будем использовать Python.
В разделе Examples на GitHub LevPasha можно найти примеры кода для загрузки контента в инсту, для массового удаления своего контента, и еще много полезных фич. Советую ознакомиться.
Покончили с прелюдией, начинаем.
Подготовка
Вам потребуется установленный язык Python на вашей системе. Так как в своей работе я использую язык R и Python для анализа данных, то рекомендую Anaconda — дистрибутив языков программирования Python и R, включающий набор популярных свободных библиотек, объединённых темой науки о данных и машинного обучения. Дистрибутив скачивается единожды, и вся последующая конфигурация, в том числе установка дополнительных модулей, может проводится в офлайне.
Последнюю версию дистрибутива можете найти здесь. Скачивайте версию для Python 3.7, устанавливайте и запускайте Jupyter. Процесс создания проекта на сложный, вам всего лишь нужно определиться с рабочей директорией и создать там новую записную книжку Jupyter Notebook.
Никто так же не запрещает вам использовать терминал с Python или любой другой способ взаимодействовать с кодом.
Установка Instagram-API-python
Все инструкции по установке можно найти на странице Instagram-API-python в GitHub LevPasha. Там же вы найдете условия и ограничения по использованию API.
Главное, что нужно знать. Для успешного анализа постов необходимо подтвердить свой номер телефона в учетной записи Instagram, которая будет использоваться в коде.
Новый поддельный аккаунт Instagram с неподтвержденным номером телефона через 1-24 часа будет заблокирован и не сможет выполнять никаких запросов. Все запросы будут перенаправлены на страницу https://instagram.com/challenge.
Кстати, сам проект от LevPasha, по сути, представляет собой Python-порт другого проекта кастомной API, написанного на PHP.
После установки Python (в составе Conda или отдельно), запустите консоль. Сначала копируем содержимое Instagram-API-python в GitHub LevPasha.
git clone https://github.com/LevPasha/Instagram-API-python.git
Переходим в только что скачанный каталог:
cd Instagram-API-python
Устанавливаем зависимые файлы и библиотеки: (необязательно, нужно только если соберетесь закачивать в инсту фотки или видео)
pip install -r requirements.txt
Далее устанавливаем сам InstagramApi через pip. В консоли выполняем:
pip install InstagramApi
py -m install InstagramApi
Готово. После этого вы сможете вызывать API от LevPasha в любом коде на Python через команду
from InstagramAPI import InstagramAPI
Скачиваем контент любого Instagram аккаунта
Далее я привожу различные части одного кода в Python и объясняю его значение. В конце урока я прикреплю файлы, которые можно использовать для старта операции, подавая на них логин и пароль вашего аккаунта, а так же ID любых аккаунтов, как аргументы. В коде ниже логин, пароль от аккаунта для авторизации, а так же ID аккаунтов для скачивания постов будут поданы напрямую через код при выполнении. Учитывайте эту разницу.
Для начала импортируем необходимые библиотеки. InstagramAPI уже должен быть установлен по инструкции выше.
from InstagramAPI import InstagramAPI import time import sys import traceback import pandas as pd import datetime
Если вы не устанавливали зависимые библиотеки, то после выполнения появится сообщение Fail to import moviepy. Need only for Video upload. Значит, все загрузилось нормально, кроме модуля moviepy который вам не понадобится в данной инструкции.
После этого прогоняем следующую часть кода. Это и есть та часть, которая запускает сбор данных. В ней обращаем внимание на функцию time.sleep(10). Она будет ставить на 10-секундную паузу процесс в случае ошибки.
class MyInstaCrawler(InstagramAPI): """ Want to have a direct control over the instaAPI. When the users are loaded from api, the best way is to store them in the queue, where it would have listeners - parsers that would do next job. """ def __init__(self, username, password): super().__init__(username, password) def getTotalFollowers(self, usernameId): import datetime next_max_id = '' followers = [] while 1: try: if self.getUserFollowers(usernameId, next_max_id): temp = self.LastJson for item in temp["users"]: followers.append(item) print('Followers: %s ' % len(followers)) temp['collected_date'] = datetime.datetime.now().strftime("%m/%d/%Y, %H:%M:%S") if temp.get("big_list") is None: return followers elif temp['big_list'] is False: return followers next_max_id = temp["next_max_id"] except: print(traceback.format_exc()) print("Sleeping 10 secs") time.sleep(10)
После этого ваша программа ожидает ввода инструкций. Внимательно посмотрим на следующую часть кода.
В ней нужно вставить ваши значения. В поле usr вставляем имя пользователя аккаунта Instagram, при помощи которого будет осуществляться логин в систему, а в поле pasw, соответственно, пароль от этого аккаунта.
Что это должен быть за аккаунт? Желательно, не ваш основной. Шанс на блокировку в результате действий минимален, но перестраховаться не помешает. К тому же, если вы будете параллельно использовать ваш аккаунт для парсинга в процессе самого парсинга, то код вылетит с ошибкой. Так что создаем новый, чистый аккаунт, заполняем его и подтверждаем телефонный номер. Выкладываем несколько постов, находим друзей и живем с ним несколько дней. После этого его данные можно использовать для парсинга.
Далее, в поле args вставляем ID аккаунтов, от которых мы хотим получить контент, стату и мотоцикл. Как узнать ID аккаунта? При помощи специальных сервисов. Вот несколько бесплатных:
- https://codeofaninja.com/tools/find-instagram-user-id
- http://www.otzberg.net/iguserid/index.php
Кстати, советую где нибудь сохранить ID аккаунтов. Определить потом, чей этот ID можно будет только по результату работы кода.
ВАЖНО. Аккаунт, из-под которого осуществляется вход в систему, должен быть подписан на скрытые аккаунты, с которых предполагается скачивание данных. Если вы хотите скачать данные по закрытому аккаунту, а аккаунт для авторизации на него не подписан (и, соответственно, не имеет разрешение на просмотр контента), то код вылетит с ошибкой.
Так происходит, потому что, фактически, Instagram API от LevPasha представляет из себя эмулятор приложения Instagram для Android. Он заходит на каждый аккаунт в каждый пост, читает и записывает то что видит в таблицу. Просто делает это очень быстро. Если вы не можете зайти на этот аккаунт из-за его настроек приватности, получить доступ к его контенту будет нельзя.
Внимательно перепроверяем все настройки. Стоят ли кавычки вокруг каждого ID аккаунта? Запятые? Фигурная скобка в конце?
Если все окей, то запускаем последнюю часть кода.
usr = "Instagram_Login" pasw = "Instagram_Password" ic = MyInstaCrawler(usr, pasw) ic.login() args = ["отдельные", "айдишки", "каждого", "аккаунта", "для", "парсинга", "в кавычках через запятую"] total_results = [] for arg in args: try: arg = int(arg) results = ic.getTotalUserFeed(arg) if results is None: print('Some problems with id %s. No results.' % arg) continue print('Gathered %s media, saving. ' % len(results)) if len(results) != 0: username = results[0]['user']['username'] for r in results: try: reduced_r = <> date = datetime.datetime.fromtimestamp(r['taken_at']) date = date.strftime("%Y-%m-%d"'T'"%H:%M:%S"'Z') caption = r['caption'] caption_text = '' if caption is not None: caption_text = caption['text'] view_count = 0 if r['media_type'] == 2: if r.get('view_count'): view_count = int(r['view_count']) reduced_r['created_time'] = date reduced_r['user.username'] = username reduced_r['caption.text'] = caption_text reduced_r['likes.count'] = r['like_count'] reduced_r['video_views'] = view_count reduced_r['comments.count'] = r['comment_count'] reduced_r['link'] = 'https://instagram.com/p/' + r['code'] total_results.append(reduced_r) except Exception as e: print(e) print('Finished for %s, id: %s' % (username, arg)) except ValueError: print("Pass ID as an argument. Couldn't transform to int") except: print(traceback.format_exc()) df = pd.DataFrame(total_results) df.to_csv('Database %s.csv' % datetime.datetime.now().strftime("%Y-%m-%d,%H:%M:%S"))
Процесс начнется с серии ошибок логина, после чего вы получите надпись об успешном логине. После этого начнется процесс сбора постов. Выглядеть будет как то так:
Request return 405 error! Request return 404 error! Login success! Gathered 18 media, saving. Finished for ваш аккаунт, id: айди вашего аккаунта
Если увидите ошибку Pass ID as an argument. Couldn’t transform to int, перепроверьте, точно ли каждый ID находится в кавычках, и нет ли лишних или отсутствующих запятых.
После окончания процесса, готовая таблица появится в том же каталоге, в котором запускался код, с названием «Database (текущие дата и время).csv».
Готово! По возникающим вопросам, можете писать комментарии под этим постом на Open SMM Asia, или же в мой Facebook.
Если вы хотите использовать этот код в другом приложении, подавая на него аргументы извне, можете скачать специальную версию. Она будет ждать первым аргументом логин, вторым аргументом пароль, и последующими аргументами ID всех аккаунтов через запятую.
Как парсить инстаграм на 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 — Парсинг Инстаграм
Instagram — одна из самых популярных социальных сетей с миллиардами пользователей. Парсинг Инстаграм имеет огромную ценность для компаний, маркетологов и частных лиц. Любой может использовать эти данные для анализа данных, целевого маркетинга и получения информации.
Вы можете использовать Python для создания автоматизированного инструмента, который извлекает данные из Instagram. И в этом поможет удивительная библиотека Instaloader
Установка необходимых библиотек
Instaloader — это библиотека Python, которую вы можете использовать для извлечения общедоступных данных из Instagram. Вы можете получить доступ к данным, таким как изображения, видео, имя пользователя, количество постов, количество подписчиков, биографию и т. д. Обратите внимание, что Instaloader никоим образом не связан, не авторизован и не поддерживается Instagram.
Чтобы установить instaloader через pip, выполните следующую команду:
pip install instaloader
Далее вам нужно установить библиотеку Pandas.
Pandas — это библиотека Python, которая в основном используется для обработки и анализа данных. Выполните следующую команду, чтобы установить ее:
pip install pandas
Теперь вы готовы приступить к настройке кода и извлечению данных из Instagram.
Парсинг Инстаграм — Настройка кода
Чтобы настроить инструмент получения данных из Instagram, вам необходимо импортировать библиотеку Instaloader Python и создать экземпляр класса Instaloader. После этого вам нужно предоставить дескриптор Instagram профиля, из которого вы хотите извлечь данные.
import instaloader
# Creating an instance of the Instaloader class
bot = instaloader . Instaloader ( )
# Loading the profile from an Instagram handle
profile = instaloader . Profile . from_username ( bot . context , ‘cristiano’ )
print ( profile )
Это хороший первый шаг, чтобы проверить основы работы. Вы должны увидеть некоторые значимые данные без ошибок:
Извлечение данных из профиля
Вы можете извлечь общедоступные данные, такие как имя пользователя, количество сообщений, количество подписчиков, количество подписок, биографию, идентификатор пользователя и внешний URL-адрес с помощью Instaloader. Вам нужно только предоставить дескриптор Instagram профиля.
Больше статей: 5 способов как ускорить код на Python
import instaloader
import pandas as pd
# Creating an instance of the Instaloader class
bot = instaloader . Instaloader ( )
# Loading a profile from an Instagram handle
profile = instaloader . Profile . from_username ( bot . context , ‘leomessi’ )
print ( «Username: » , profile . username )
print ( «User ID: » , profile . userid )
print ( «Number of Posts: » , profile . mediacount )
print ( «Followers Count: » , profile . followers )
print ( «Following Count: » , profile . followees )
print ( «Bio: » , profile . biography )
print ( «External URL: » , profile . external_url )
Вы должны увидеть много информации о профиле из указанного вами дескриптора:
Извлечение электронных писем из биографии
Вы можете извлечь адреса электронной почты из биографии Instagram любого профиля, используя регулярные выражения. Вам нужно импортировать библиотеку Python re и передать регулярное выражение для проверки электронной почты в качестве параметра методу re.findall():
import instaloader
# Creating an instance of Instaloader class
bot = instaloader . Instaloader ( )
profile = instaloader . Profile . from_username ( bot . context , «wealth» )
print ( «Username: » , profile . username )
print ( «Bio: » , profile . biography )
emails = re . findall ( r «\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]<2,>\b» , profile . biography )2,>
print ( «Emails extracted from the bio:» )
print ( emails )
Скрипт напечатает все, что он распознает как адрес электронной почты в биографии:
Извлечение данных о лучших результатах поиска
Когда вы ищете что-либо в Instagram, вы получаете несколько результатов, включая имена пользователей и хэштеги. Вы можете извлечь лучшие результаты поиска, используя методы get_profiles() и get_hashtags(). Вам нужно только указать поисковый запрос в методе instaloader.TopSearchResults(). Кроме того, вы можете повторять и печатать/сохранять отдельные результаты.
import instaloader
# Creating an instance of the Instaloader class
bot = instaloader . Instaloader ( )
# Provide the search query here
search_results = instaloader . TopSearchResults ( bot . context , ‘music’ )
# Iterating over the extracted usernames
for username in search_results . get_profiles ( ) :
print ( username )
# Iterating over the extracted hashtags
for hashtag in search_results . get_hashtags ( ) :
print ( hashtag )
Больше статей: Загрузка телеграм бота на сервер. Подробные шаги загрузки файла *.py на бесплатный сервер PythonAnywhere
Извлечение подписчиков и подписчиков учетной записи
Вы можете извлечь подписчиков учетной записи и тех, на кого он подписан. Для этого нужно будет залогиниться, поэтому укажитедет свои логин и пароль, чтобы получить эти данные.
Внимение:
Никогда не используйте свои личные учетные записи для извлечения данных из Instagram, так как это может привести к временной или постоянной блокировке вашей учетной записи.
После создания экземпляра класса Instaloader вам необходимо указать свое имя пользователя и пароль. Это делается для того, чтобы бот мог войти в Instagram, используя вашу учетную запись, и получить данные о подписчиках и подписках.
Затем вам нужно предоставить дескриптор Instagram целевого профиля. Методы get_followers() и get_followees() извлекают подписчиков и подписчиков. Вы можете получить имена пользователей подписчиков и подписчиков, используя свойства follower.username и Followee.username соответственно.
Если вы хотите сохранить результаты в файле CSV, вам сначала нужно преобразовать данные в объект Pandas DataFrame. Используйте метод pd.DataFrame() для преобразования объекта списка в DataFrame.
Наконец, вы можете экспортировать объект DataFrame в файл CSV, используя метод to_csv(). Вам необходимо передать имя файла.csv в качестве параметра этому методу, чтобы получить экспортированные данные в формате файла CSV.
Внимение:
Только владельцы аккаунтов могут видеть всех подписчиков и подписчиков. Вы не сможете извлечь все данные о подписчиках и подписках, используя этот или любой другой метод.