Парсер инстаграм аккаунтов: ТОП-14 сервисов + детальный обзор

Содержание

ТОП-14 сервисов + детальный обзор

Парсер — это специальный сервис для сбора аудитории в Инстаграм по заданным параметрам.

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

Парсер для Инстаграм работает по следующей схеме:

  1. Загрузка параметров для сбора аудитории;
  2. Определение источников поиска пользователей;
  3. Формирование базы логинов по заданным критериям;
  4. Очистка базы от ботов, коммерческих и мертвых аккаунтов;
  5. Экспорт результатов.

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

Возможности парсеров

Сегодня возможности сервисов для парсинга почти безграничны.

С помощью таких чудо-сервисов Вы сможете максимально “зацепить” заинтересованную аудиторию. Ту самую, которая уже готова потратить деньги на Ваш товар. Далее расскажу, как использовать базовые функции парсеров.

Функция 1. Сбор базы

Как мы с Вами уже определились, основная функция программы парсера – это сбор базы. Так вот, сбор может осуществляться по нескольким параметрам, и о них я расскажу далее.

1.1 Конкуренты

Для того, чтобы собрать аудиторию Инстаграм аккаунта Ваших конкурентов, на вкладке “Поиск по конкуренту” перечислите популярные аккаунты по Вашей тематике. Можно добавить неограниченное количество профилей.

1.2 Хэштеги

Еще один вариант сбора аудитории – хэштеги. Определите самые популярные теги, по которым Ваш аккаунт могут найти клиенты. Перечислите на вкладке “по хэштегу” все возможные варианты или загрузите список одним файлом.

1.3 Активность

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

1.4 Подписчики

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

1.5 Локации

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

1.6 События

Некоторые парсеры обладают функцией интеграции с другими социальными сетями и умеют сопоставлять данные о пользователе из ВКонтакте с его аккаунтом в Инстаграм. Так можно легко спарсить аудиторию в ИГ, которая в ближайшее время будет праздновать день рождения, поступать в институт или играть свадьбу.

1.7 Фразы

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

Функция 2. Фильтр базы

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

  1. Боты. Удаляются неактивные и замороженные аккаунты, которые не способны совершать целевые действия;
  2. Бизнес-профили. Отсеиваются коммерческие страницы, которые созданы для ведения бизнеса и осуществления продаж;
  3. Приватность аккаунта. Парсер позволяет исключить все закрытые профили из собранной базы;
  4. Количество подписчиков/подписок. Можно исключить “молодые” аккаунты или наоборот слишком раскрученные;
  5. Пол. Также можно разделить аудиторию на мужскую и женскую. Например, для женского салона красоты будет лишним собирать логины мужчин;
  6. Количество лайков. Есть возможность отфильтровать пользователей по количеству лайков на последний пост.

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

НАС УЖЕ БОЛЕЕ 32 000 чел.
ВКЛЮЧАЙТЕСЬ

Функция 3. Выгрузка базы

После того, как парсер собрал и отфильтровал базу, ее можно с легкостью загрузить на компьютер в формате CSV. Для этого нужно нажать на соответствующую кнопку.

Далее файл с базой можно использовать, как душе угодно: настраивать таргетинг, отправлять рассылки, запускать массфоловинг. Кстати, большинство парсинг-сервисов обладают и функциями по продвижению.

Сервисы парсинга Инстаграм

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

– Только для Instagram

Эти площадки подойдут, если Инстаграм Ваша единственная рекламная площадка, и парсить для продвижения необходимо только в этой соц.сети.

СервисБесплатный периодЦена в месяц
ZengramНет, но есть пробный парсинг за 1 руб1 190 руб
TooligramНет690 руб
Instaplus5 днейОт 399 руб
SocialKitДемо-версия1 110 руб
Bridgit1 деньОт 319 руб
SMMflow3 дняОт 299 руб
InstawaysБесплатный тарифОт 399 руб

– Для разных соцсетей

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

Например, такой вариант будет оптимальным для блогера, у которого есть страница в Инстаграме, канал на YouTube и, скажем, TikTok — с разным контентом, объединённым одной тематикой.

СервисБесплатный периодЦена в месяцСоцсети
Pepper.Ninja3 дняОт 490 руб– Instagram;
– Facebook;
– Вконтакте;
– Одноклассники.
Segmento Target1 деньОт 200 руб– Instagram;
– Вконтакте;
– Одноклассники.
Chotam7 днейот 250 руб– Instagram;
– Facebook;
– Вконтакте;
– Одноклассники;
– YouTube;
– Twitter.

Как работает парсер

В целом парсеры работают примерно одинаково, поэтому мы разберем основные функции на примере топового сервиса – Zengram. Он умеет собирать аудиторию из подписчиков и подписок конкурентов, искать аккаунты по заданным хэштегам, геолокации и даже ключевым словам.

Также парсер дополнительно соберет номера телефонов в Инстаграм, email, описание профиля и активные ссылки из шапок.

Страница парсера

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

Важно. Если Вы хотите запустить пост в рекламу, то рекомендую сервис promopult.ru. Он поможет сделать правильные настройки и сэкономит бюджет. К тому же в нем есть плюшки, которые помогут увеличить конверсию и привлечь больше клиентов.

Шаг 1. Настройка сбора

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

Начало сбора

Когда всё настроено, нажмите на кнопку “Начать сбор”, чтобы запустить парсинг.

Начать сбор

Шаг 2. Сбор аккаунтов

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

Процесс сбора

Шаг 3. Фильтрация

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

Фильтры
Результаты

Шаг 4. Выгрузка базы

Теперь можно скачать отфильтрованную базу на компьютер или открыть её в таблицах Google. Я выбрала второй вариант.

Выгрузка базы

Шаг 5. Работа с базой

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

Таблица с базой

Если пользователь привязал к аккаунту e-mail или номер телефона, то эта информация тоже будет отображена в таблице.

Данные профилей

Лайфхак. Новый тренд Инстаграм- чат-бот! Он ответит клиентам за 4 секунды, напомнит о важных событиях/акциях через рассылку в директ, и в следствии увеличит продажи в 3 раза. Внедряйте, пока это не сделали конкуренты + по промокоду “INSCALE” скидка 15%. Кликайте -> Smmbot.

Коротко о главном

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

Хотелось бы отметить наш личный ТОП парсеров: Zengram, Tooligram, Pepper.Ninja, Segmento Target (бонусы и промокоды к ним ищите в описании сервисов).

Напоследок 3 важных совета по выбору парсера:

  1. Адекватно оценивайте соотношение цена = качество. Не используйте сервисы, перегруженные функциями, которыми Вы не будете пользоваться;
  2. Не делайте выбор, основываясь только на отзывах в интернете и онлайн-обзорах, так как они не всегда честные:
  3. Тестируйте сервисы, подбирайте оптимальную платформу, благо большинство разработчиков предоставляют бесплатный пробный период.

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

leoneedpro/instagram-parser: Парсер аккаунтов подписчиков и подписок в Instagram

GitHub — leoneedpro/instagram-parser: Парсер аккаунтов подписчиков и подписок в Instagram

Files

Permalink Failed to load latest commit information.

Type

Name

Latest commit message

Commit time

Парсер аккаунтов подписчиков и подписок в Instagram (followers-parser.js)
Парсер активной аудитории (лайки) Instagram (likes-parser.js)

Поддержать развитие проекта:

Как использовать парсер подписчиков и подписок:

  1. Заходим в web-браузере http://instagram.com и авторизуемся
  2. Выбираем интересующий аккаунт с подписчиками и подписками
  3. Нажимаем на просмотр подписчиков и подписок
  4. Нажимаем сочетание клавиш (CTRL-SHIFT-J , по умолчанию в браузере Google Chrome)
  5. В открывшуюся консоль браузера, копируем и вставляем код скрипта instagram-parser.js
  6. Нажимаем клавишу ENTER и процесс парсинга подписчиков запущен!
  7. После окончания работы скрипта, станет доступен список имен аккаунтов подписчиков

Изменения и новый функционал (2019):

  1. Изменил код прокрутки — теперь без остановки проходит «Рекомендуемое»
  2. Теперь можно задавать кол-во аккаунтов для сбора (строка кода 26)
  3. Добавил возможность собирать помимо логинов, ещё и имена аккаунтов (строка кода 30)
  4. Добавил возможность изменять скорость сбора (строка кода 20)

Видео пример работы:

www.leoneed.pro | www.instagram.com/leoneed.pro | www.vk.com/leovladivostok

Подписывайтесь, ставьте лайки, до новых встреч!✌️

About

Парсер аккаунтов подписчиков и подписок в Instagram

Topics

Resources

License

You can’t perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Парсер инстаграм: аудитории, аккаунтов, номеров, комментариев

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

Парсинг в инстаграме может быть нескольких видов

— Парсинг подписчиков и постов аккаунта в инстаграме

— Парсинг аккаунтов с лайков и комментариев поста

— Парсинг постов и аккаунтов по хэштегам

— Парсинг аккаунтов и постов по геолокации

Функция шпиона в инстаграм (мониторинг аккаунтов конкурентов)

— Мониторинг новых подписчиков, постов, лайков, комментариев на аккаунтах

— Мониторинг новых лайков и комментариев на постах

— Мониторинг новых постов по хэштегам и геолокациям

Полученную базу аккаунтов можно отфильтровать по следующим параметрам

— Приватности профиля: открытый, закрытый, не имеет значения

— Наличию аватарки

— Типу аккаунта: бизнес или обычный

— Наличию сторис

— Количеству подписчиков у аккаунта

— Количеству подписок у аккаунта

— Количеству постов у аккаунта

— Коэффициент вовлеченности по лайкам *

— Коэффициент вовлеченности по комментариям *

— Соотношение подписчиков и подписок

— Дате публикации последнего поста

— По наличию ключевого слова в описании аккаунта

— По наличию ключевого слова в категории аккаунта

— По наличию стоп слова в описании аккаунта

* Коэффициент вовлечённости рассчитывается по такому принципу: (количество лайков/комментариев с 9 последних постов деленное на 9 и деленное на количество подписчиков

Ознакомившись с опциями данного инстаграм парсера можно понять, что вы получите не только точную выборку аккаунтов по нужным вам критериям, но и то, что все эти аккаунты будут живыми людьми. Инстаграм парсер будет обходить стороной аккаунты с накрученными ботами, которые не принесут вам никакой пользы, а только зря потратят время. А функция шпиона будет собирать только активных подписчиков конкурентов, которых при грамотном подходе можно легко переманить к себе, например с помощью функций МФ/МЛ или рассылки в директ, а также следить за тем, какой контент наиболее заходит для вашей целевой аудитории. Работа этого инстаграм парсера не пройдет вхолостую и положительно скажется на продвижении вашего аккаунта.

Парсинг Инстаграм, точный подбор аудитории для продвижения аккаунта

Что такое парсинг аудитории в социальных сетях, и для чего он нужен, мы рассказывали в обзоре сервисов парсинга ВКонтакте. В этом материале вы познакомитесь с возможностями сервисов парсинга аудитории в Инстаграм и узнаете, как использовать результаты парсинга для «белого» продвижения вашего аккаунта. Рекомендовать вам массфолловинг, масслайкинг и масслукинг мы точно не будем. 

Как работать с парсерами?

  1. Вы определяете источники поиска — это могут быть аккаунты конкурентов, геолокации, хештеги.

  2. Выбираете параметры поиска — количество подписок, подписчиков, публикаций и пр.

  3. Сервис выполняет поиск, отбирает данные, анализирует результаты, некоторые парсеры могут самостоятельно исключать ботов и «заброшенные» аккаунты из результатов поиска.

  4. Экспортируете результаты или предварительно конвертируете их, например, из ID пользователей в ссылки на аккаунты или номера телефонов.

Сервисы для парсинга


Segmento target

Функционал

  • Поиск аккаунтов/ID Инстаграм из базы пользователей ВКонтакте и наоборот; аккаунтов Инстаграм по геоточкам, параметрам количества подписчиков, подписок, публикаций;   

  • Аналитика — информация о поле, возрасте, городе подписчиков;   

  • Сбор номеров телефонов и электронных ящиков аудитории;

  • Фильтр аудитории по количеству подписчиков, подписок, публикаций, по наличию аватарки и т.д.;

  • Конвертер ID пользователей Инстаграм в ссылки на аккаунты Инстаграм и наоборот;

  • Инструмент работы с базами — объединение, пересечение, исключение.

Плюсы

  • Парсинг аудитории в 3 социальных сетях — ВКонтакте, Инстаграм, Одноклассники;

  • Наличие тарифного плана сразу на 3 социальные сети;

  • Наличие практических кейсов из разных ниш в видеоформате;

  • Онлайн-доступ к сервису, для использования не нужно ничего скачивать.

Минусы

  • Отсутствие бесплатного тарифа;

  • Автоматическое продление подписки;

  • Сложный интерфейс сервиса.


Тарифы Segmento target

Сайт сервиса: segmento-target.ru

Pepper.ninja


Функционал

  • Сбор Инстаграм-аккаунтов из базы ВКонтакте по указанным городам;

  • Сбор Инстаграм-аккаунтов родителей и родственников пользователей ВКонтакте;

  • Сбор аудитории в Инстаграм по гео, хештегам, подписчикам и подпискам определенного аккаунта;

  • Сбор Инстаграм-аккаунтов, поставивших лайки на определенные посты;

  • Конвертация ID пользователей Инстаграм в ссылки на аккаунты Инстаграм и наоборот, ссылок на аккаунты Инстаграм — в номера телефонов и наоборот и пр.

Плюсы

  • Парсинг аудитории в 4 социальных сетях — ВКонтакте, Инстаграм, Одноклассники, Facebook;

  • Бесплатный пробный период на 3 дня, за вступление в официальную группу сервиса можно получить бесплатный доступ на месяц;

  • Наличие видеоуроков по работе с сервисом.

Минусы

  • Опции Facebook не входят ни в один тариф, а приобретаются отдельно;

  • Ограниченный функционал для парсинга в Одноклассниках.


Тарифы Pepper.ninja

Сайт сервиса: pepper.ninja

Zengram


Сервис для комплексного продвижения в Инстаграм, в функционал которого входят возможности для парсинга аудитории.

  • Сбор аккаунтов по хештегам, геолокации, по подпискам или подписчикам заданного аккаунта;

  • Сбор контактов аккаунтов — номеров телефонов, электронной почты, ссылок на сайты;

  • Выгрузка описаний собранных профилей;

  • Фильтр собранных аккаунтов по полу, по количеству подписчиков и подписок, по наличию/отсутствию приватности;

  • Исключение коммерческих аккаунтов из результатов сбора;

  • Возможность скачивания собранных списков для настройки рекламы или обзвона.

Плюсы

  • Возможность оплатить отдельно парсер, а не полный функционал сервиса;

  • Скидки при покупке подписки на длительные периоды;

  • Есть подробная инструкция по использованию.

Минусы


Тарифы Zengram

Сайт сервиса: zengram.ru

Tooligram


Сервис для продвижения и раскрутки в Инстаграм, в функционал которого входит получение подписчиков, автопостинг, отслеживание комментариев, рассылки в Direct, а также парсер.

Возможности парсера — поиск Инстаграм-аккаунтов по геоточкам конкурентов, по близлежащим геоточкам, по хештегам.

Плюсы

  • Сервис облачный, для выполнения парсинга необязательно оставлять компьютер включенным;

  • Гибкие настройки тарифов.

Минусы


Тарифы Tooligram

Сайт сервиса: https://tooligram.com/clients/

INSTAPLUS.PRO


Сервис для продвижения в Инстаграм, в функционал которого входит парсер.

Возможности парсера — поиск целевой аудитории по конкурентам, хештегам, по гео.

Плюсы

  • Бесплатный пробный период в 5 дней;

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

Минусы

Оплачивается полный функционал сервиса, нельзя купить подписку только на использование парсера.


Тарифы INSTAPLUS.PRO

Сайт сервиса: instaplus.pro

WonderLead


Функционал

Плюсы

Минусы

  • Работа с собранной аудиторией осуществляется только из личного кабинета сервиса или с помощью Telegram-бота

  • Отсутствует возможность выгрузить контакты собранной базы для настройки таргетинговой рекламы на них


Стоимость подписки на WonderLead

Сайт сервиса: wonderlead.ru

INSTAPARSER PRO


Программа для парсинга номеров WhatsApp/Viber из Инстаграм и сбора логинов по хештегам и подписчикам.

Плюсы

Минусы

  • Бесплатного тарифа и пробного доступа нет

Тарифы InstaParser PRO



Сайт: instaparserpro.com

InstaTurbo


Сервис продвижения в Инстаграм, в функционале которого есть поиск целевой аудитории по хештегам, подписчикам и подпискам.

Плюсы

Минусы


Тарифы InstaTurbo

Сайт сервиса: instaturbo.ru

SMMflow


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

Плюсы

Минусы


Стоимость подписки на SMMflow

Сайт сервиса: https://smmflow.com/

Ibot Pro


Программа для продвижения в Инстаграм, в которую встроен парсер аккаунтов. 

Функционал

  • Сбор аудитории по хештегам, подписчикам, подпискам, активным подписчикам, геолокациям

  • Сбор аудитории из групп и публичных страниц ВКонтакте

Плюсы

  • Сбор Инстаграм-аккаунтов из групп ВКонтакте позволяет собрать людей нужного пола, из определенного города, с определенной датой рождения и пр.

Минусы


Стоимость лицензии Ibot Pro

Сайт: http://www.socialnetworkingtools.com.ua/instagram-software/ibot/

Social Kit

Программа для массового продвижения в Инстаграм.

Функционал

  • Поиск по пользователям — автоматический подбор по заданным критериям поиска, выгрузка вашей базы;

  • Поиск по хештегам — автоматический подбор хештегов из Инстаграм по критериям поиска и вставка ваших хештегов, сбор пользователей по одному или нескольким хештегам;

  • Поиск по геолокации — сбор гео-меток и аккаунтов по заданным координатам, адресу;

  • Получение информации о подписчиках, подписках, публикациях по собранной базе и фильтр этой информации;

  • Сохранение списка пользователей в файл.

Плюсы

  • Есть бесплатная демо-версия;

  • В стоимость лицензии входит работа с неограниченным числом аккаунтов.

Минусы


Стоимость SocialKit за месяц и год

Сайт сервиса: http://socialkit.ru/

Как использовать собранную аудиторию для продвижения в Инстаграм?

  • Отправлять пользователям собранной базы персональные сообщения в Direct

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

  • Настраивать таргетинговую рекламу

Важно! Рекламный кабинет Facebook «понимает» только телефоны и электронные ящики аккаунтов — для настройки таргетинговой рекламы их необходимо выгрузить в сервисе парсинга (такой функционал есть, например, у Segmento target), после чего в разделе «Аудитории» загрузить списки с номерами телефонов или email-ов. Далее нужно заполнить необходимые поля на странице рекламной кампании, создать объявление и запустить рекламную кампанию.

Если у вас остались вопросы по теме парсинга аудитории в Инстаграм, задайте их в комментариях — мы обязательно ответим. А если вы хотите доверить SMM профессионалам — оставляйте заявку специалистам «Веб-Центра».

Парсинг базы аккаунтов в Instagram с помощью сервиса Zengram

Дорогие друзья!

Мы рады сообщить Вам, что создали новый сервис, который поможет Вам продвигаться еще лучше и эффективнее — Зенграм Парсер!

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

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

Что такое парсер и как его использовать? 

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

Особенности применения парсинга в Instagram.

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

Зенграм парсер собирает, сортирует и анализирует аккаунты по геолокации, хештегам, подпискам и подписчикам. Данная опция будет одинаково полезна и для тех, кто использует Инстаграм как площадку для развития собственного бизнеса, и для тех, для кого соцсеть — место активного общения, самовыражения и саморазвития. Программа отбирает аккаунты, отвечающие заданным критериям: это могут быть профили звезд-шоу-бизнеса, городские паблики, страницы возможных конкурентов и многое другое.

Парсинг для развития бизнеса в Инстаграм

Применение парсеров позволит решить начинающим и опытным предпринимателям сразу две задачи:

  1. Привлечение потенциальных клиентов. Программа помогает находить реальных подписчиков, которым будет интересна ваша продукция или услуги. Например, вы — владелец интернет-магазина детской одежды. Система подберёт для вас профили молодых родителей по соответствующим хештегам к фото, подпискам на публичные страницы для мам и пап, аналогичные интернет-магазины и т.д. Вы — владелец небольшого салона красоты или пиццерии в одном из районов города.? Парсер выберет по геометкам тех людей, которые живут или часто бывают рядом с вашим заведением.
  2. Сбор информации о конкурентах. Зенграм парсер соберёт для вас информацию с аккаунтов брендов, которые успешно работают в той же сфере, что и вы: карточки товаров, отзывы покупателей и т.д. В результате вы сможете корректировать свой ассортимент и уровень цен, составить более привлекательные описания к товарам, привлечь новых клиентов.

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

Вы проводите много времени в Инстаграм, но ваш аккаунт не так популярен, как хотелось бы? Зенграм парсер — удобный и простой способ найти единомышленников, людей, с которыми вы сможете делиться своими достижениями, творческими планами и просто встречаться в реальной жизни. Сервис подберёт для вас подписчиков по полу, возрасту, месту проживания, интересам.

Несколько простых примеров:

  • вы недавно переехали и хотите найти друзей? Парсер подберет массу пользователей, которые находятся рядом с вами при помощи хештегов с географической привязкой: названием города, улицы, района и т.д.;
  • хотите организовать фан-клуб любимого исполнителя? Программа изучит данные подписчиков его официального аккаунта и других публичных страниц сходной тематики.

Соберите базу своих будущих клиентов и отфильтруйте по нужных Вам параметрам сами! Это просто и быстро.

Возможности сервиса:

  • Сбор аккаунтов по подпискам конкурентов
  • Сбор аккаунтов по подписчикам конкурентов
  • Сбор аккаунтов по хештегам
  • Сбор аккаунтов по геолокации и ключевым словам
  • Фильтрация по полу
  • Фильтрация по количеству подписчиков и подписок аккаунтов
  • Фильтрация по коммерческим аккаунтам
  • Фильтрация по приватным аккаунтам
  • Выгрузка базы аккаунтов в формате .txt

Инструкция:

Для того, чтобы начать работу зайдите на страницу https://find.zengram.ru, система автоматически начислит вам тестовый баланс

Теперь добавьте аккаунт, с помощью которого будет идти парсинг. Внимание: это не должен быть аккаунт, который вы продвигаете

Аккаунт добавлен и можно приступать к парсингу:

Вы можете начать сбор по конкурентам, хештегам или геолокациям.

Сбор по конкурентам

Введите один или несколько интересующих вас профилей (или загрузите список), выберите, кого собирать — подписки или подписчиков указанных профилей и нажмите на кнопку “Начать сбор”

Сбор по хештегам

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

Сбор по геолокациям

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

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

Далее нажмите на кнопку “Начать сбор”

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

Вы можете в любой момент остановить работу и приступить к фильтрации или скачать базу.

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

Теперь база собрана и можно отфильтровать ее по интересующим вас параметрам, выгрузить в файл (.txt) или начать новый сбор (осторожно, при выборе нового сбора сервис сбросит результаты):

Вы можете отфильтровать аккаунты по следующим признакам:

  • Фильтрация по полу
  • Фильтрация по количеству подписчиков и подписок аккаунтов
  • Фильтрация по коммерческим аккаунтам
  • Фильтрация по приватным аккаунтам
  • Выгрузка базы аккаунтов в формате .txt

Выберите необходимые параметры и нажмите “Начать фильтрацию”

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

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

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

Рекомендуем почитать ещё

Чистые базы Instagram из Вконтакте, парсинг аудитории

Из-за обилия спамных и коммерческих аккаунтов в Инстаграме тяжело собирать чистые базы реальных пользователей.

Тут на помощь приходит возможность парсить базы для Instagram из Вконтакте. Я всегда практиковал этот метод: когда-то не было инст-парсера, потом начались проблемы с фильтрацией (слишком медленно работал), и так я всю свою жизнь, по тем или иным причинам собирал списки именно из Вконтакте, не забывая при этом иногда сравнивать с классическим прямым парсом, все таки остался на ВК базах.

Как это работает: если у пользователя в профиле ВК указан  Инстаграм — парсер его оттуда вынет.

Какие преимущества это дает?

  • Почти нет ботов.
    Вряд ли кто-то будет к фейковому личному аккаунту Вконтакте привязывать Instagram-профиль. Поэтому в собранных базах почти нету ботов, главная проблема решена.
  • Сбор по критериям.
    Возраст, активности, пересечения интересов, пол — все то, чем вы пользуетесь для парсинга целевых групп Вконтакте переносится и на Инсту, если вы собираете такие базы. Там собирать по таким четким критериям аудиторию напрямую не получится. Сначала парсим списки ВК по критериям, потом из этих списков вынимаем аккаунты Инсты.
  • Скорость.
    Парсинг из Вконтакте быстрее, чем прямой сбор из Инсты.

Есть и недостатки у данного метода.
Активность пользователя в Вконтатке не означает, что он активен в других социальных сетях. У него может быть заброшен Инстаграм, или он может заходить в него раз в неделю.

Тем не менее, для меню плюсы перевешивали. Сравнивая с прямым сбором из Инсты, результат по активности на тематических аккаунтах выходил лучше именно на базах из ВК.

Чем собирать?

Скрипт для сбора профилей Инстаграм из Вконтакте есть почти в любом сервисе (Церебро, CleverTarget, и т.д.)

Рекомендую обратить внимание на Segmento Target. Он выгодно отличается от своих собратьев умением собирать Инстаграм-акки не только из профилей, но и со стен Вконтакте, если пользователь его не привязал, а просто когда-то запостил ссылку. В этой статье есть подробное описание инструмента и приятный промо-код.

Делать инструкции по использованию смысла не вижу, так как там все предельно просто. Выбираете вкладку Instagram и работаете.

Еще пару напутствий:

  • Собирайте только целевую аудиторию, сначала отпарсив по нужным вам критериям профили Вконтакте. Ищите активности в группах схожей с вашим аккаунтам тематики, демографические показатели и так далее. Как собирать целевую аудиторию Вконтакте — тема отдельной статьи
  •  По моим наблюдением, сбор профилей Instagram со стен Вконтакте дает меньше мертвых неактивных аккаунтов, обязательно попробуйте отделить такие списки от общего сбора и со стен и с профилей.

Кстати, данный способ работает и для Twitter. Но там на выходе получается гораздо больше мертвых Твиттер-профилей.

 

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

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

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

Собрать информацию можно о 1000 людях, и может быть так, что лишь 150 человек из них станут впоследствии целевой аудиторией. Таким образом на подбор базы тратится 3-4 часа и затраченное время может не дать ощутимых результатов. Со специальным парсером значительно легче искать и отсеивать нужных людей.

Для чего используется парсинг Инстаграм

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

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

Парсинг аудитории в Инстаграм

Одна из главных функций программы парсинга — это сбор базы. Задав настройки, пользователь обеспечивает эффективную работу Инстаграма. Главные параметры сбора базы:

  • Сбор целевых подписчиков Instagram. С помощью системы происходит поиск людей, подписавшихся на конкретные страницы в Инстаграм. Так по интересам вы отследите тех, кто принесет прибыль вашему бизнесу.

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

  • Сбор целевых хэштегов для продвижения Instagram. Автоматически составляется список хештегов, по которым будет продвигаться контент аккаунта. Не забудьте после сбора вручную проверить и отсеять нерелевантные хештеги.

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

  • Тематические фразы. Чтобы найти авторов, пишущих на нужные темы, необходимо всего лишь задать ключевые слова. Также парсер Instagram отыщет новый опубликованный автором в своей ленте пост с нужными словами.

Создаваемая база постоянно фильтруется и поэтому для точной наcтройки отсеиваются бизнес-профили Instagram, ненужные боты, аккаунты без активности и новые аккаунты.

Как поможет парсинг аудитории Инстаграм

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

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

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

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

Сервисы парсинга Инстаграм

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

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

  1. Zengram;
  2. Tooligram;
  3. Pepper.Ninja;
  4. Segmento target;
  5. Instaplus.pro;
  6. Smmflow.

Как выглядит личный кабинет в сервисе Zengram

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

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

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

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

сайтов для парсинга Instagram • ApiFornia

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

  • тематическая близость базы к аккаунту;
  • его «чистота».

Поясним последнее на примере. Допустим, кто-то собрал базу (список профилей в Instagram) и выложил ее в бесплатный доступ в Интернет.Более 1000 человек начали активно голосовать за бесплатные аккаунты, предлагаемые Instagram. Те пользователи в списке, на которые ежедневно подписываются многие десятки продвигаемых профилей, начинают терять интерес к таким подписчикам.

«Чистых» счетов, на которые приходится максимум несколько подписок в день, представляют для нас гораздо большую ценность. Их интересуют страницы, которые их фолят (в отличие от заблокированных аккаунтов).

Таким образом, чем более чистую и целевую базу мы найдем, тем больше у нас будет подписчиков.Давайте рассмотрим 10 способов сделать это.

№1. Биржа Вконтакте, где покупают / продают рекламные посты или совершают обмены. Отсюда мы выбираем группы с правильными темами, глядя на активность. Если контент активно лайкают и комментируют, то в группе есть живые люди, а не боты. Вот некоторые биржи:

  • https://vk.com/instagram_exchange — основной, отсюда многие парируют, поэтому эффективность может быть ниже, чем на менее популярных биржах.
  • https: // vk.com / instagram_vsmm.
  • https://vk.com/iq_instagram.

№2. www.instaspell.ru — каталог, содержащий базы данных с тематическими аккаунтами Instagram. Это полезно, так как все группы здесь разбиты по категориям, то есть вы можете выбирать пользователей по интересам. Есть региональные аккаунты, из которых можно разобрать подписчиков по географическому признаку. При выборе сайтов обращайте внимание на показатель ER — он показывает степень активности аудитории. Кстати, instaspell — довольно популярное место для парсинга с Instagram, поэтому собранные здесь базы могут быть не очень эффективными.

№3. Plibber.ru — рекламная биржа в Instagram. Здесь вам необходимо зарегистрироваться, чтобы получить доступ к избранным сайтам. Есть фильтр по тематике и типам паблика, ER, лайков и комментариев.

insta-parcing-3

№4 dealway.ru — еще одна биржа, где вы можете зарегистрироваться в качестве рекламодателя, чтобы выбрать нужные аккаунты для сбора подписчиков. Информации о группах гораздо меньше, распределения по категориям нет, но отсюда подписка базируется реже, чем в способах №1 и №2.

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

insta-parcing-4

В целом 3 описанных выше специализированных биржи (и подобных) редко используются для сбора баз данных, поэтому вы можете получить хороший выбор относительно «чистых» аккаунтов для продвижения своей страницы в Instagram.

№6 Поиск в Instagram.Попробуйте указать во внутренней поисковой системе разные ключевые слова и фразы, которые характеризуют вашу тему или те темы, которые могут быть интересны CA. Базы данных, которые вы собираете из своих поисковых аккаунтов, очень эффективны, потому что они индивидуальны. Каждый человек ищет в публике свой уникальный список запросов.

insta-parcing-6

№7 Ищите популярные аккаунты среди друзей и знакомых. Вы можете спросить, скручиваются ли их подписчики и какими методами собирали.Если набор проходил естественно, результат от таких баз для массфолловинга может быть очень хорошим.

№8 Геолокационный сбор. Программы-парсеры собирают логины, которые хотя бы раз отметили свои фотографии в области, которую вы указали на карте (по широте и долготе).

№9. Сбор по хештегам. Вы даете парсеру список тегов, которыми люди подписывают свои фотографии, и он ищет таких пользователей по заданному критерию (подписчиков в аккаунтах должно быть от 10 000). Таким образом мы ищем популярные страницы конкурентов.Проверяем руками, есть ли комментарии на иностранных языках, сколько их, оцениваем примерный охват и решаем, стоит ли использовать тот или иной сайт для парсинга. После этого фильтруем по таким параметрам: до 500 подписчиков и до 100 подписок. Получаем качественную базу для массфолловинга.

№10. Ручной сбор. Необходимо иметь любую учетную запись без подписок. Мы ищем вручную и просматриваем популярные блоги (звезды, тематические паблики, аккаунты конкурентов), отслеживаем понравившиеся.Собрав около 100 таких сайтов, мы забиваем свой аккаунт в парсер и берем из него id тех, на кого подписались. Затем мы анализируем эти идентификаторы. Мы получаем очень чистую базу для массового продолжения.

Инструменты синтаксического анализа

Парсинг, подписка и автоматизация

Еще один не менее интересный сервис для парсинга аудитории — Zengram, который может фильтровать профили по нескольким параметрам.

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

Теперь давайте разберемся, как использовать анализатор Zengram. В этом нет ничего сложного.

Алгоритм действий:

Зайдите на официальный сайт, зарегистрируйтесь и добавьте свой профиль в Instagram, из которого вы планируете парсить. Добавлять страницу для продвижения не нужно.

Выберите слева на панели «Парсер Zengram».

Сбор осуществляется по различным параметрам. Мы разберемся с каждым из них.

Сбор данных по местоположению.

Сделайте следующее:

  • откройте левую часть страницы меню и выберите «Сбор геолокации»;
  • запишите место, где вам нужно найти определенные категории пользователей;
  • нажмите кнопку «Собрать».

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

Собрать данные по хэштегам

Это похоже на поиск информации о геолокации. Единственное отличие состоит в том, что вам нужно выбрать «Собрать по хэштегу» и указать те, которые вас интересуют.

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

Соберите данные о конкурентах.

Здесь нужно будет прописать конкретные профили и начать сбор.При необходимости вы можете искать по подпискам и подписчикам. Для этого отметьте соответствующие поля.

Сбор результатов

Когда вы завершите сбор данных и сформируете полную базу аккаунтов, пользователи будут отфильтрованы по определенным параметрам. Среди них:

  • пол;
  • количество подписок;
  • количество абонентов;
  • личных или коммерческих счетов.
  • В конце запустить фильтрацию. Новая база данных загружена в формате.txt формат.

Следует отметить, что абсолютно «чистую» базу целевых аккаунтов сразу собрать невозможно. На многих тематических публичных страницах и страницах конкурентов частично подписаны боты, просто неактивные пользователи или коммерческие организации, которые нас не интересуют.

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

Как очистить Instagram | Блог Apify

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

В этой статье вы узнаете, как мы создали новый актер Instagram Scraper (jaroslavhejlek / instagram-scraper) на Apify для очистки этих данных с общедоступного веб-сайта Instagram.Вы можете попробовать нового актера прямо сейчас, бесплатно.

Где найти данные

Самый простой способ поиска и доступа к контенту в Instagram — использовать мобильное приложение или веб-сайт:

Medium в Instagram

Некоторые из Instagram доступны даже без входа в систему, но не так много, как в прошлое. После входа в систему вы можете просматривать хэштеги, профили, места и сообщения. Это очень обнадеживает, потому что, если вы можете сделать что-то вручную в веб-браузере, вы можете автоматизировать это на Apify 😉

Данные доступны публично без входа в систему

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

1) Поиск

Вы можете искать профили, хэштеги и места, и Instagram вернет 100 самых популярных сообщений.

Функция поиска на Instagram.com

Существует даже хорошая внутренняя конечная точка API, которую можно использовать для получения результатов в формате JSON:

  https://www.instagram.com/web/search/topsearch/?context = blended & query = avengers  

Параметр запроса context служит фильтром и может содержать место, пользователя или хэштег.Единственное ограничение — конечная точка возвращает всего 100 результатов. Если вам нужно больше, вам нужно ввести более подробный фильтр.

2) Сообщения из профилей / хэштегов / мест

Когда вы открываете любую общедоступную страницу Instagram, содержащую сообщения (например, профиль, хэштег или место), Instagram вернет HTML-страницу с первыми несколькими предварительно загруженными сообщениями (возможно, с использованием сервера React- боковой рендеринг). Затем, когда вы прокрутите страницу вниз, Instagram продолжит загружать больше сообщений с помощью запроса XHR к конечной точке Instagram GraphQL.Конечная точка защищена токеном, поэтому получить к ней прямой доступ невозможно, и нам нужно бесконечно прокручивать страницу. Однако мы можем автоматизировать бесконечную прокрутку, используя безголовый Chrome с Puppeteer.

сообщений, видимых на собственной странице профиля Instagram

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

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

Комментарии к сообщению Medium.com в Instagram — «Лекарство» от @misscaseyjo

При нажатии на кнопку запускается запрос XHR к конечной точке GraphQL в Instagram. Опять же, мы можем легко автоматизировать это, используя функцию Puppeteer page.click () , а затем извлечь содержимое комментариев с веб-страницы.

Данные доступны только после входа в систему

К сожалению, к определенному контенту можно получить доступ только в том случае, если вы вошли в систему, используя свою учетную запись Instagram, например:

  • Список подписчиков
  • Список людей, на которых подписан пользователь

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

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

Создание актора Apify для очистки данных

Чтобы собрать и связать веб-парсер для Instagram, я создал нового актера на Apify. Акторы — это облачные программы, которые принимают ввод, выполняют свою работу и генерируют некоторый вывод.Их можно запускать вручную в приложении, используя API или планировщик.

Актер написан на Node.js и использует Apify SDK. При вводе он принимает запрос Instagram или список прямых URL-адресов профилей, затем выполняет поиск по запросу и извлекает детали страницы, сообщения или комментарии из результатов и прямых URL-адресов. Все полученные данные хранятся в структурированной форме в наборе данных, из которого вы можете загрузить их в таких форматах, как JSON, XML, Excel, CSV и т. Д.

Актер опубликован в Apify Store как Instagram scraper (jaroslavhejlek / instagram-scraper), и вы можете использовать его бесплатно, хотя вам нужно будет использовать резидентные прокси на Apify Proxy.Исходный код доступен на GitHub — запросы на включение и идеи по улучшению более чем приветствуются!

Обновление: в 2021 году Instagram изменил правила, и теперь вам всегда нужно использовать прокси для парсинга 😖 Бесплатной пробной версии Apify Proxy, предоставляемой каждому новому пользователю Apify, будет недостаточно, так как вам нужно будет использовать прокси-сервер для домашнего использования . Но напишите по электронной почте [email protected] и скажите им, что вам нужна бесплатная пробная версия резидентных прокси, чтобы вы могли очистить Instagram, и они разберутся с вами!

Если вы запустите парсер на Apify без резидентных прокси, есть большая вероятность, что Instagram заблокирует доступ и не вернет никаких данных, поэтому мы настоятельно рекомендуем использовать Apify Proxy.Вы также можете запустить актера на своем локальном компьютере — там все должно работать нормально.



Скребок Instagram: как очистить данные из Instagram [2021]

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

Важное примечание: обратите внимание, что автоматический доступ к Instagram противоречит их условиям обслуживания.

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

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

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

Вы можете использовать Python (GitHub) для создания собственного парсера Instagram или покупать данные пользователей Instagram в Клубе влиятельных лиц.

Чтобы очистить Instagram с помощью Python, вы можете использовать такой инструмент, как Instagramy. Этот инструмент специально создан для Instagram и может анализировать данные через Pandas.

Instagramy используется для быстрой и простой очистки Instagram. Этот пакет устанавливается с помощью следующей команды. На основе сетевого подключения он собирает данные за вас.

  из instagramy import Instagram


# Подключение профиля
user = Instagram ("geeks_for_geeks")

# печать основных деталей, например
# подписчиков, подписчиков, биография
печать (user.is_verified ())
печать (user.popularity ())
печать (user.get_biography ())

# вернуть список dicts
posts = user.get_posts_details ()

print ('\ n \ nЛайки', 'Комментарии')
для публикации в сообщениях:
нравится = сообщение ["нравится"]
комментарии = сообщение ["комментарий"]
печать (лайки, комментарии)
  
  из instagramy import Instalysis

# Instagram user_id из команд ipl
team = ["chennaiipl", "mumbaiindians",
"royalchallengersbangalore", "kkriders",
"delhicapitals", "sunrisershyd",
"kxipofficial"]

data = Instalysis (команды)

# возвращаем фрейм данных
data_frame = данные.анализ ()
data_frame
  

К сожалению, невозможно экспортировать людей, которым понравился определенный пост или несколько постов. Однако их можно сканировать и очищать с помощью этого кода:

  def get_likes_list (имя пользователя):
    api.login ()
    api.searchUsername (имя пользователя)
    результат = api.LastJson
    username_id = result ['user'] ['pk'] # Получить идентификатор пользователя
    user_posts = api.getUserFeed (username_id) # Получить фид пользователя
    результат = api.LastJson
    media_id = result ['items'] [0] ['id'] # Получить самую последнюю запись
    api.getMediaLikers (media_id) # Получить пользователей, которым понравилось
    users = api.LastJson ['пользователи']
    для пользователя в пользователях: # Поместить пользователей в список
        users_list.append ({'pk': user ['pk'], 'username': user ['username']})  

Чтобы очистить электронные письма из Instagram, вам необходимо войти в систему с учетной записью Instagram с определенного прокси-сервера. А чтобы извлечь адреса электронной почты, используйте этот код: / api / v1 / users / {{user_id}} / info /

Многие из вас хотят экспортировать свои собственные или чужие фотографии из Instagram. По моему опыту, это очень сложно реализовать, поскольку их нужно извлекать из Интернета (а не из приложения).Но это выполнимо!

 
#! / usr / bin / python
# - * - кодировка: utf-8 - * -

import argparse
импортировать кодеки
импортировать configparser
import errno
импортный глобус
от оператора import itemgetter
импортировать json
импортировать logging.config
импортировать hashlib
импорт ОС
импортный рассол
импорт ре
импортный сокет
import sys
импортировать текстовый перенос
время импорта
импортировать xml.etree.ElementTree как ET
импортировать moviepy.editor как MPE

пытаться:
    из urllib.parse импорт urlparse
кроме ImportError:
    from urlparse import urlparse

предупреждения об импорте
импорт потоковой передачи
одновременный импорт.фьючерсы
запросы на импорт
импортировать requests.packages.urllib3.util.connection как urllib3_connection
импорт tqdm

из instagram_scraper.constants import *

пытаться:
    перезагрузить (sys) # Python 2.7
    sys.setdefaultencoding ("UTF8")
кроме NameError:
    проходить

warnings.filterwarnings ('игнорировать')

input_lock = threading.RLock ()

класс LockedStream (объект):
    file = Нет
    def __init __ (сам, файл):
        self.file = файл

    def write (self, x):
        с input_lock:
            self.file.write (x)

    def flush (сам):
        вернуть getattr (self.file, 'flush', лямбда: Нет) ()

def allowed_gai_family ():
    family = socket.AF_INET # принудительно IPv4
    вернуть семью

original_stdout, original_stderr = sys.stdout, sys.stderr
sys.stdout, sys.stderr = карта (LockedStream, (sys.stdout, sys.stderr))
# Принудительно использовать соединения IPv4, когда машина, на которой выполняется этот код, использует IPv6
urllib3_connection.allowed_gai_family = allowed_gai_family

def thread_input (приглашение):
    с input_lock:
        пытаться:
            с tqdm.external_write_mode ():
                original_stdout.написать (подсказка)
                original_stdout.flush ()
                вернуть sys.stdin.readline ()
        кроме AttributeError:
            original_stdout.write ('\ п')
            original_stdout.write (подсказка)
            original_stdout.flush ()
            вернуть sys.stdin.readline ()

input = thread_input

класс PartialContentException (Исключение):
    проходить

класс InstagramScraper (объект):
    "" "InstagramScraper извлекает и загружает фото и видео пользователя Instagram" ""

    def __init __ (self, ** kwargs):
        default_attr = dict (username = '', usernames = [], filename = None,
                            login_user = Нет, login_pass = Нет,
                            followings_input = Ложь, followings_output = 'profiles.текст',
                            destination = '. /', logger = None, keep_username = False, interactive = False,
                            quiet = False, максимум = 0, media_metadata = False, profile_metadata = False, latest = False,
                            latest_stamps = False, cookiejar = None, filter_location = None, filter_locations = None,
                            media_types = ['изображение', 'видео', 'сюжет-изображение', 'сюжет-видео', 'трансляция'],
                            tag = False, location = False, search_location = False, comments = False,
                            verbose = 0, include_location = False, filter = None, proxies = {}, no_check_certificate = False,
                                                        template = '{urlname}', log_destination = '')

        allowed_attr = список (default_attr.ключи ())
        default_attr.update (kwargs)

        для ключа в default_attr:
            если ввести allowed_attr:
                self .__ dict __ [ключ] = default_attr.get (ключ)

        Медиа-тип # story означает сюжет-изображение и сюжет-видео
        если 'история' в self.media_types:
            self.media_types.remove ('история')
            если 'story-image' нет в self.media_types:
                self.media_types.append ('изображение-история')
            если 'история-видео' отсутствует в self.media_types:
                себя.media_types.append ('сюжет-видео')

        # Чтение файла latest_stamps с помощью ConfigParser
        self.latest_stamps_parser = Нет
        если self.latest_stamps:
            парсер = configparser.ConfigParser ()
            parser.read (self.latest_stamps)
            self.latest_stamps_parser = парсер
            # Если у нас есть файл latest_stamps, последнее должно быть истинным, поскольку это общий флаг
            self.latest = Истина

        # Настроить регистратор
        если self.logger - Нет:
            self.logger = InstagramScraper.get_logger (level = logging.DEBUG, dest = default_attr.get ('log_destination'), verbose = default_attr.get ('подробный'))

        self.posts = []
        self.stories = []

        self.session = requests.Session ()
        если self.no_check_certificate:
            self.session.verify = Ложь

        пытаться:
            если self.proxies и введите (self.proxies) == str:
                self.session.proxies = json.loads (self.proxies)
        кроме ValueError:
            self.logger.error ("Проверка допустимого типа json.")
            поднимать

        self.session.headers = {'пользовательский агент': CHROME_WIN_UA}
        если self.cookiejar и os.path.exists (self.cookiejar):
            с open (self.cookiejar, 'rb') как f:
                self.session.cookies.update (pickle.load (f))
        self.session.cookies.set ('ig_pr', '1')
        self.rhx_gis = ""

        self.cookies = Нет
        self.authenticated = Ложь
        self.logged_in = Ложь
        self.last_scraped_filemtime = 0
        если default_attr ['фильтр']:
            себя.фильтр = список (self.filter)
        self.quit = Ложь

    def sleep (self, secs):
        min_delay = 1
        для _ в диапазоне (секунды // минимальная задержка):
            time.sleep (min_delay)
            если self.quit:
                возвращаться
        time.sleep (секунд% min_delay)

    def _retry_prompt (self, url, exception_message):
        "" "Показать приглашение и вернуть True: повторить, False: игнорировать, None: отменить" ""
        answer = input ('Повторяющаяся ошибка {0} \ n (A) bort, (I) gnore, (R) etry or retry (F) orrever?'. format (exception_message))
        если ответ:
            answer = ответ [0].верхний ()
            если answer == 'I':
                self.logger.info ('Пользователь решил игнорировать {0}'. формат (url))
                вернуть ложь
            elif answer == 'R':
                вернуть True
            elif answer == 'F':
                self.logger.info («Пользователь решил повторить попытку навсегда»)
                глобальный MAX_RETRIES
                MAX_RETRIES = sys.maxsize
                вернуть True
            еще:
                self.logger.info ('Пользователь выбрал прерывание')
                return None

    def safe_get (self, * args, ** kwargs):
        # готовое решение
        # сеанс.mount ('https: //', HTTPAdapter (max_retries = ...))
        # охватывает только неудачные поиски DNS, соединения сокетов и таймауты соединения
        # Не работает, когда сервер разрывает соединение во время загрузки ответа
        retry = 0
        retry_delay = RETRY_DELAY
        в то время как True:
            если self.quit:
                возвращаться
            пытаться:
                response = self.session.get (тайм-аут = CONNECT_TIMEOUT, cookies = self.cookies, * args, ** kwargs)
                если response.status_code == 404:
                    возвращаться
                отклик.Raise_for_status ()
                content_length = response.headers.get ('Content-Length')
                если content_length не None и len (response.content)! = int (content_length):
                    #if content_length is None, мы все равно повторяем, чтобы получить размер и быть уверенными
                    поднять PartialContentException ('Частичный ответ')
                ответ на ответ
            кроме (KeyboardInterrupt):
                поднимать
            кроме (requests.exceptions.RequestException, PartialContentException) как e:
                если 'url' в kwargs:
                    url = kwargs ['url']
                elif len (аргументы)> 0:
                    url = args [0]
                если повторить попытку  = self.maximum:
                        перерыв

                если future_to_item:
                    на будущее в tqdm.tqdm (concurrent.futures.as_completed (future_to_item),
                                            total = len (future_to_item),
                                            desc = 'Загрузка', отключить = self.тихий):
                        item = future_to_item [будущее]

                        если future.exception () не равно None:
                            self.logger.warning (
                                'Медиа для {0} в {1} сгенерировал исключение: {2}'. Format (value, item ['urls'],
                                                                                          future.exception ()))
                        еще:
                            timestamp = self .__ get_timestamp (элемент)
                            если отметка времени> величайшая отметка времени:
                                great_timestamp = отметка времени
                # Даже не потрудились сохранить это?
                если maximum_timestamp> self.last_scraped_filemtime:
                    self.set_last_scraped_timestamp (значение, наибольшая_временная метка)

                self._persist_metadata (dst, значение)

        наконец-то:
            self.quit = Верно

    def query_hashtag_gen (сам, хэштег):
        вернуть self .__ query_gen (QUERY_HASHTAG, QUERY_HASHTAG_VARS, 'hashtag', hashtag)

    def query_location_gen (я, местоположение):
        вернуть self .__ query_gen (QUERY_LOCATION, QUERY_LOCATION_VARS, 'местоположение', местоположение)

    def __query_gen (self, url, variables, entity_name, query, end_cursor = ''):
        "" "Генератор хэштегов и местоположения."" "
        узлы, end_cursor = self .__ query (url, variables, entity_name, query, end_cursor)

        если узлы:
            пытаться:
                в то время как True:
                    для узла в узлах:
                        узел выхода

                    если end_cursor:
                        узлы, end_cursor = self .__ query (url, variables, entity_name, query, end_cursor)
                    еще:
                        возвращаться
            кроме ValueError:
                self.logger.exception ('Failed to query' + query)

    def __query (self, url, variables, entity_name, query, end_cursor):
        params = переменные.формат (запрос, end_cursor)
        self.update_ig_gis_header (параметры)

        resp = self.get_json (url.format (параметры))

        если resp не None:
            payload = json.loads (соответственно) ['data'] [entity_name]

            если полезная нагрузка:
                узлы = []

                если end_cursor == '':
                    top_posts = полезная нагрузка ['edge_' + entity_name + '_to_top_posts']
                    узлы.extend (self._get_nodes (top_posts))

                сообщения = полезная нагрузка ['edge_' + entity_name + '_to_media']

                узлы.расширить (self._get_nodes (сообщения))
                end_cursor = сообщения ['page_info'] ['end_cursor']
                возвращаемые узлы, end_cursor

        return None, None

    def _get_nodes (сам, контейнер):
        return [self.augment_node (node ​​['node']) для узла в контейнере ['edge']]

    def augment_node (сам, узел):
        self.extract_tags (узел)

        детали = Нет
        если self.include_location и 'location' не в узле:
            детали = self .__ get_media_details (узел ['шорткод'])
            узел ['местоположение'] = детали.get ('location') if подробности еще Нет

        если URL-адресов нет в узле:
            узел ['urls'] = []
        если узел ['is_video'] и 'video_url' в узле:
            узел ['urls'] = [узел ['video_url']]
        elif '__typename' в узле и узле ['__ typename'] == 'GraphImage':
            узел ['urls'] = [self.get_original_image (узел ['display_url'])]
        еще:
            если подробностей нет:
                детали = self .__ get_media_details (узел ['шорткод'])

            если подробности:
                if '__typename' в деталях и деталях ['__ typename'] == 'GraphVideo':
                    узел ['urls'] = [подробности ['video_url']]
                elif '__typename' в деталях и деталях ['__ typename'] == 'GraphSidecar':
                    urls = []
                    подробнее о carousel_item ['edge_sidecar_to_children'] ['edge']:
                        urls + = self.augment_node (carousel_item ['узел']) ['urls']
                    узел ['urls'] = URL-адреса
                еще:
                    узел ['urls'] = [self.get_original_image (подробности ['display_url'])]

        возвратный узел

    def __get_media_details (сам, шорткод):
        resp = self.get_json (VIEW_MEDIA_URL.format (шорткод))

        если resp не None:
            пытаться:
                вернуть json.loads (соответственно) ['graphql'] ['shortcode_media']
            кроме ValueError:
                self.logger.warning ('Не удалось получить сведения о мультимедиа для' + шорткод)

        еще:
            себя.logger.warning ('Не удалось получить сведения о носителе для' + шорткод)

    def __get_location (self, item):
        code = item.get ('шорткод', item.get ('код'))

        если код:
            детали = self .__ get_media_details (код)
            item ['location'] = details.get ('местоположение')

    def scrape (сам, исполнитель = concurrent.futures.ThreadPoolExecutor (max_workers = MAX_CONCURRENT_DOWNLOADS)):
        "" "Сканирует и загружает медиафайлы пользователя" ""
        self.session.headers.update ({'пользовательский агент': STORIES_UA})
        пытаться:
            для имени пользователя в себе.имена пользователей:
                self.posts = []
                self.stories = []
                self.last_scraped_filemtime = 0
                величайшая_времени = 0
                future_to_item = {}

                dst = self.get_dst_dir (имя пользователя)

                # Получить метаданные пользователя.
                shared_data = self.get_shared_data (имя пользователя)
                user = self.deep_get (общие_данные, 'entry_data.ProfilePage [0] .graphql.user')

                если не пользователь:
                    self.logger.ошибка(
                        'Ошибка при получении сведений о пользователе для {0}. Убедитесь, что пользователь существует. '. Формат (имя пользователя))
                    Продолжать
                elif пользователь и пользователь ['is_private'] и пользователь ['edge_owner_to_timeline_media'] ['count']> 0, а не \
                    пользователь ['edge_owner_to_timeline_media'] ['edge']:
                        self.logger.info ('Пользователь {0} является частным'. формат (имя пользователя))

                self.rhx_gis = ""

                self.get_profile_pic (dst, исполнитель, future_to_item, пользователь, имя пользователя)
                себя.get_profile_info (dst, имя пользователя)

                если self.logged_in:
                    self.get_stories (dst, исполнитель, future_to_item, пользователь, имя пользователя)
                    self.get_broadcasts (dst, исполнитель, future_to_item, пользователь)

                # Сканирует носитель и отправляет его исполнителю.
                пытаться:

                    self.get_media (dst, исполнитель, future_to_item, пользователь)

                    # Отображает индикатор выполнения завершенных загрузок. Может даже не появиться, если все медиафайлы загружены, пока
                    # цикл выше завершен.если future_to_item:
                        на будущее в tqdm.tqdm (concurrent.futures.as_completed (future_to_item), total = len (future_to_item),
                                                desc = 'Загрузка', отключить = self.quiet):
                            item = future_to_item [будущее]

                            если future.exception () не равно None:
                                self.logger.error (
                                    "Медиа в {0} сгенерировала исключение: {1}".формат (элемент ['urls'], future.exception ()))
                            еще:
                                timestamp = self .__ get_timestamp (элемент)
                                если отметка времени> величайшая отметка времени:
                                    great_timestamp = отметка времени
                    # Даже не потрудились сохранить это?
                    если maximum_timestamp> self.last_scraped_filemtime:
                        self.set_last_scraped_timestamp (имя пользователя, величайшая_временная метка)

                    себя._persist_metadata (dst, имя пользователя)

                кроме ValueError:
                    self.logger.error («Невозможно очистить пользователя -% s»% имя пользователя)
        наконец-то:
            self.quit = Верно
            self.logout ()

    def get_profile_pic (сам, dst, исполнитель, future_to_item, пользователь, имя пользователя):
        если 'image' нет в self.media_types:
            возвращаться

        если self.logged_in:
            # Попробуйте получить изображение профиля в высоком разрешении
            url = USER_INFO.format (пользователь ['id'])
            resp = self.get_json (URL)

            если resp равно None:
                self.logger.error ('Ошибка при получении информации о пользователе для {0}'. формат (имя пользователя))
                возвращаться

            user_info = json.loads (соответственно) ['пользователь']

            если 'has_anonymous_profile_picture' в user_info:
                возвращаться

            пытаться:
                profile_pic_urls = [
                    user_info ['hd_profile_pic_url_info'] ['url'],
                    user_info ['hd_profile_pic_versions'] [- 1] ['url'],
                ]

                profile_pic_url = next (url для url в profile_pic_urls, если url не None)
            кроме (KeyError, IndexError, StopIteration):
                себя.logger.warning ('Не удалось получить изображение профиля с высоким разрешением для {0}'. формат (имя пользователя))
                profile_pic_url = пользователь ['profile_pic_url_hd']
        еще:
                # Если не logged_in, сделайте фото профиля с низким разрешением
                profile_pic_url = пользователь ['profile_pic_url_hd']

        item = {'urls': [profile_pic_url], 'username': имя пользователя, 'shortcode': '', 'created_time': 1286323200, '__typename': 'GraphProfilePic'}

        если self.latest имеет значение False или os.path.isfile (dst + '/' + item ['urls'] [0].split ('/') [- 1]) ложно:
            для элемента в tqdm.tqdm ([item], desc = 'Поиск {0} профиля pic'.format (username), unit = "images",
                                  ncols = 0, отключить = self.quiet):
                future = executor.submit (self.worker_wrapper, self.download, item, dst)
                future_to_item [будущее] = элемент

    def get_profile_info (self, dst, имя пользователя):
        если self.profile_metadata имеет значение False:
            возвращаться
        url = USER_URL.format (имя пользователя)
        resp = self.get_json (URL)

        если resp равно None:
            self.logger.error ('Ошибка при получении информации о пользователе для {0}'. формат (имя пользователя))
            возвращаться

        self.logger.info ('Сохранение общей информации метаданных в {0} .json'.format (имя пользователя))

        user_info = json.loads (соответственно) ['graphql'] ['пользователь']

        пытаться:
            profile_info = {
                'биография': user_info ['биография'],
                'followers_count': user_info ['edge_followed_by'] ['count'],
                'following_count': user_info ['edge_follow'] ['count'],
                'полное_имя': информация_пользователя ['полное_имя'],
                'id': user_info ['id'],
                'is_business_account': user_info ['is_business_account'],
                'is_joined_recently': user_info ['is_joined_recently'],
                'is_private': user_info ['is_private'],
                'posts_count': user_info ['edge_owner_to_timeline_media'] ['count'],
                'profile_pic_url': user_info ['profile_pic_url']
            }
        кроме (KeyError, IndexError, StopIteration):
            себя.logger.warning ('Не удалось создать {0} информацию профиля'. формат (имя пользователя))
            возвращаться

        item = {
            'GraphProfileInfo': {
                'info': profile_info,
                'username': имя пользователя,
                'created_time': 1286323200
            }
        }
        self.save_json (элемент, '{0} / {1} .json'.format (dst, имя пользователя))

    def get_stories (сам, dst, исполнитель, future_to_item, пользователь, имя пользователя):
        "" "Очищает истории пользователя." ""
        если self.logged_in и \
                ('история-образ' в себе.media_types или 'story-video' в self.media_types):
            # Получите истории пользователя.
            all_stories = []
            all_stories.extend (self.fetch_main_stories (пользователь ['id']))
            all_stories.extend (self.fetch_highlight_stories (пользователь ['id']))

            # Скачивает истории пользователя и отправляет их исполнителю.
            iter = 0
            для элемента в tqdm.tqdm (all_stories, desc = 'Поиск {0} историй'.format (username), unit = "media",
                                  disable = self.тихий):
                если self.story_has_selected_media_types (элемент) и self.is_new_media (элемент):
                    item ['username'] = имя пользователя
                    элемент ['шорткод'] = ''
                    future = executor.submit (self.worker_wrapper, self.download, item, dst)
                    future_to_item [будущее] = элемент

                iter = iter + 1
                если self.maximum! = 0 и iter> = self.maximum:
                    перерыв

    def get_broadcasts (сам, dst, исполнитель, future_to_item, пользователь):
        "" "Очищает трансляции пользователя."" "
        если self.logged_in и 'broadcast' в self.media_types:
            # Получить трансляции пользователя.
            трансляции = self.fetch_broadcasts (пользователь ['id'])

            # Скачивает трансляции пользователя и отправляет их исполнителю.
            iter = 0
            для элемента в tqdm.tqdm (Broadcasts, desc = 'Поиск {0} историй'.format (user [' username ']), unit = "media",
                                  disable = self.quiet):
                item ['username'] = пользователь ['username']
                будущее = исполнитель.отправить (self.worker_wrapper, self.dowload_broadcast, item, dst)
                future_to_item [будущее] = элемент

                iter = iter + 1
                если self.maximum! = 0 и iter> = self.maximum:
                    перерыв

    def get_media (сам, dst, исполнитель, future_to_item, пользователь):
        "" "Очищает сообщения пользователя для СМИ." ""
        если 'image' нет в self.media_types и 'video' нет в self.media_types и 'none' нет в self.media_types:
            возвращаться

        имя пользователя = пользователь ['имя пользователя']

        если сам.include_location:
            media_exec = concurrent.futures.ThreadPoolExecutor (max_workers = 5)

        iter = 0
        для элемента в tqdm.tqdm (self.query_media_gen (user), desc = 'Поиск {0} сообщений'. формат (имя пользователя),
                              unit = 'media', disable = self.quiet):
            # -Фильтрация командной строки
            если self.filter:
                если в элементе есть теги:
                    filter = any (x в элементе ['теги'] вместо x в self.filter)
                    если self.has_selected_media_types (элемент) и self.is_new_media (элемент) и отфильтровано:
                        item ['username'] = имя пользователя
                        future = executor.submit (self.worker_wrapper, self.download, item, dst)
                        future_to_item [будущее] = элемент
                еще:
                    # Когда фильтр включен, но медиа не содержит тегов
                    проходить
            # -------------- #
            еще:
                если self.has_selected_media_types (элемент) и self.is_new_media (элемент):
                    item ['username'] = имя пользователя
                    будущее = исполнитель.отправить (self.worker_wrapper, self.download, item, dst)
                    future_to_item [будущее] = элемент

            если self.include_location:
                item ['username'] = имя пользователя
                media_exec.submit (self.worker_wrapper, self .__ get_location, элемент)

            если self.comments:
                item ['username'] = имя пользователя
                item ['comments'] = {'data': list (self.query_comments_gen (item ['shortcode']))}

            если self.media_metadata, self.comments или self.include_location:
                item ['username'] = имя пользователя
                себя.posts.append (элемент)

            iter = iter + 1
            если self.maximum! = 0 и iter> = self.maximum:
                перерыв

    def get_shared_data (self, username = ''):
        "" "Получает метаданные пользователя." ""
        resp = self.get_json (BASE_URL + имя пользователя)

        если resp не равен None и '_sharedData' в resp:
            пытаться:
                shared_data = resp.split ("window._sharedData =") [1] .split ("; ") [0]
                вернуть json.loads (shared_data)
            кроме (TypeError, KeyError, IndexError):
                проходить

    def __fetch_stories (self, url, fetching_highlights_metadata = False):
        resp = self.get_json (URL)

        если resp не None:
            retval = json.loads (соответственно)
            если retval ['data'] и 'reels_media' в retval ['data'] и len (retval ['data'] ['reels_media'])> 0 и len (retval ['data'] ['reels_media'] [ 0] ['items'])> 0:
                items = []

                для reel_media в retval ['data'] ['reels_media']:
                    items.extend ([self.set_story_url (item) для элемента в reel_media ['items']])
                    для элемента в reel_media ['items']:
                        элемент ['highlight'] = fetching_highlights_metadata
                        себя.stories.append (элемент)

                возврат товаров

        возвращаться []

    def fetch_main_stories (self, user_id):
        "" "Извлекает основные истории пользователя." ""
        вернуть self .__ fetch_stories (MAIN_STORIES_URL.format (user_id))

    def fetch_highlight_stories (self, user_id):
        "" "Выбирает основные истории пользователя." ""

        resp = self.get_json (HIGHLIGHT_STORIES_USER_ID_URL.format (user_id))

        если resp не None:
            retval = json.loads (соответственно)

            если retval ['data'] и 'user' в retval ['data'] и 'edge_highlight_reels' в retval ['data'] ['user'] и \
                    'edge' в retval ['data'] ['user'] ['edge_highlight_reels']:
                Highlight_stories_ids = [элемент ['узел'] ['id'] для элемента в
                                        retval ['data'] ['user'] ['edge_highlight_reels'] ['edge']]

                # Решение проблемы https: // github.com / rarcega / instagram-scraper / issues / 488
                # __fetch_stories с количеством идентификаторов более 20 несколько раз возвращает ошибку «Плохой шлюз».
                # Веб-сайт Instagram загружается до 3.
                ids_chunks = [highlight_stories_ids [i: i + 3] для i в диапазоне (0, len (highlight_stories_ids), 3)]

                истории = []

                для ids_chunk в ids_chunks:
                    stories.extend (self .__ fetch_stories (HIGHLIGHT_STORIES_REEL_ID_URL.format ('% 22% 2C% 22'.join (str (x) for x in ids_chunk)), fetching_highlights_metadata = True))

                возвращать истории
              
        возвращаться []

    def fetch_broadcasts (self, user_id):
        себя.session.headers.update ({'Хост': 'i.instagram.com'})
        resp = self.get_json (BROADCAST_URL.format (user_id))
        del self.session.headers ['Хост']


        если resp не None:
            retval = json.loads (соответственно)


            если post_live_item нет в retval:
                возвращаться []

            трансляции = []

            для трансляции в retval ['post_live_item'] ['Broadcasts']:
                dash_manifest = ET.fromstring (трансляция ['dash_manifest'])
                xmlns = '{urn: mpeg: dash: schema: mpd: 2011}'

                video_adaptation_set = dash_manifest.find ('.// ​​{0} Представление [@ mimeType = "video / mp4"] / ..'. format (xmlns))
                audio_adaptation_set = dash_manifest.find ('.// ​​{0} Представление [@ mimeType = "audio / mp4"] / ..'. format (xmlns))

                best_video_quality = (video_adaptation_set.get ('maxWidth'), video_adaptation_set.get ('maxHeight'))
                video_element = video_adaptation_set.find ('.//*[@ width = "{0}"] [@ height = "{1}"] / {2} BaseURL'.format (best_video_quality [0], best_video_quality [1], xmlns))
                video_url = video_element.текст

                audio_element = audio_adaptation_set.find ('.// ​​{0} BaseURL'.format (xmlns))
                audio_url = audio_element.text

                ret = {
                    'user_id': user_id,
                    'published_time': трансляция ['published_time'],
                    "видео": video_url,
                    'audio': audio_url
                }

                Broadcasts.append (ret)

            ответные трансляции

        return None

    def query_media_gen (self, user, end_cursor = ''):
        "" "Генератор для СМИ."" "
        media, end_cursor = self .__ query_media (пользователь ['id'], end_cursor)

        если СМИ:
            пытаться:
                в то время как True:
                    для элемента в СМИ:
                        если не self.is_new_media (item):
                            возвращаться
                        доходный пункт

                    если end_cursor:
                        media, end_cursor = self .__ query_media (пользователь ['id'], end_cursor)
                    еще:
                        возвращаться
            кроме ValueError:
                себя.logger.exception ('Не удалось запросить носитель для пользователя' + пользователь ['имя пользователя'])

    def __query_media (self, id, end_cursor = ''):
        params = QUERY_MEDIA_VARS.format (id, end_cursor)
        self.update_ig_gis_header (параметры)

        resp = self.get_json (QUERY_MEDIA.format (параметры))

        если resp не None:
            payload = json.loads (соответственно) ['данные'] ['пользователь']

            если полезная нагрузка:
                контейнер = полезная нагрузка ['edge_owner_to_timeline_media']
                узлы = self._get_nodes (контейнер)
                end_cursor = контейнер ['page_info'] ['end_cursor']
                возвращаемые узлы, end_cursor

        return None, None

    def get_ig_gis (self, rhx_gis, params):
        data = rhx_gis + ":" + params
        если sys.version_info.major> = 3:
            вернуть hashlib.md5 (data.encode ('utf-8')). hexdigest ()
        еще:
            вернуть hashlib.md5 (данные) .hexdigest ()

    def update_ig_gis_header (self, params):
        self.session.headers.update ({
            'x-instagram-gis': self.get_ig_gis (
                self.rhx_gis,
                параметры
            )
        })

    def has_selected_media_types (self, item):
        filetypes = {'jpg': 0, 'mp4': 0}

        для URL в элементе ['urls']:
            ext = self.__get_file_ext (URL)
            если ext не в типах файлов:
                типы файлов [ext] = 0
            типы файлов [ext] + = 1

        if ('изображение' в self.media_types и filetypes ['jpg']> 0) или \
                ('видео' в self.media_types и filetypes ['mp4']> 0):
            вернуть True

        вернуть ложь

    def story_has_selected_media_types (я, предмет):
        # media_type 1 - изображение, 2 - видео
        if item ['__ typename'] == 'GraphStoryImage' и 'story-image' в self.media_types:
            вернуть True
        if item ['__ typename'] == 'GraphStoryVideo' и 'story-video' в self.media_types:
            вернуть True

        вернуть ложь

    def extract_tags (self, item):
        "" "Извлекает хэштеги из текста подписи." ""
        caption_text = ''
        если 'caption' в элементе и элементе ['caption']:
            если isinstance (элемент ['подпись'], dict):
                caption_text = элемент ['подпись'] ['текст']
            еще:
                caption_text = элемент ['подпись']

        elif 'edge_media_to_caption' в элементе и элементе ['edge_media_to_caption'] и элемент ['edge_media_to_caption'] [
            'edge']:
            caption_text = item ['edge_media_to_caption'] ['edge'] [0] ['узел'] ['текст']

        если caption_text:
            # включить слова и смайлики
            item ['теги'] = re.найти все(
                r "(?  \ d +) - (? P  \ d +) / (? P  \ d +) ', response.заголовки ['Content-Range'])
                                            range_file_position = int (match.group ('первая'))
                                            если range_file_position! = загружено_до:
                                                поднять исключение ()
                                            total_length = int (match.group ('размер'))
                                            media_file.truncate (общая_длина)
                                        Кроме:
                                            поднимать запросы.exceptions.InvalidHeader ('Недействительный ответ диапазона "{0}" для запрошенного "{1}"'. format (
                                                response.headers.get ('Content-Range'), headers.get ('Range')))
                                    elif response.status_code == 200:
                                        если loaded_before! = 0:
                                            загружено_before = 0
                                            скачано = 0
                                            media_file.искать (0)
                                        content_length = response.headers.get ('Content-Length')
                                        если content_length равно None:
                                            self.logger.warning ('Нет Content-Length в ответе, файл {0} может быть загружен частично' .format (base_name))
                                        еще:
                                            total_length = int (длина_содержимого)
                                            media_file.усечь (общая_длина)
                                    еще:
                                        поднять PartialContentException ('Неверный код состояния {0}', response.status_code)

                                    для чанка в response.iter_content (chunk_size = 64 * 1024):
                                        если кусок:
                                            загружено + = len (чанк)
                                            media_file.write (кусок)
                                        если сам.покидать:
                                            возвращаться

                                если загружено! = total_length и total_length не None:
                                    поднять PartialContentException ('Получены первые {0} байтов из {1}'. формат (загружено, общая_длина))

                                перерыв

                            # В случае исключения part_file намеренно не удаляется,
                            # при анализе логов позже легче создать пример.
                            # Пожалуйста, не добавляйте os.удалить здесь.
                            кроме (KeyboardInterrupt):
                                поднимать
                            кроме (requests.exceptions.RequestException, PartialContentException) как e:
                                media = url
                                если элемент ['шорткод'] и элемент ['шорткод']! = '':
                                    media + = "from https://www.instagram.com/p/" + item ['shortcode']
                                если скачано - loaded_before> 0:
                                    # если мы получили какие-то данные на этой итерации, не засчитываем это как сбой
                                    себя.logger.warning ('Продолжить после исключения {0} в {1}'. формат (repr (e), media))
                                    retry = 0 # следующая ошибка будет первой в строке без данных
                                    Продолжать
                                если повторить попытку  100:
                    Операционные системы.переименовать (part_file, file_path)
                    timestamp = self .__ get_timestamp (элемент)
                    file_time = int (отметка времени, если отметка времени иначе time.time ())
                    os.utime (путь_файла, (время_файла, время_файла))

            files_path.append (путь_ к файлу)

        вернуть files_path

    def dowload_broadcast (self, item, save_dir = '. /'):
        tmp_item = {
            'urls': [элемент ['видео']],
            'имя пользователя': элемент ['имя пользователя'],
            'короткий номер': '',
            'Published_time': элемент ['Published_time'],
            '__typename': 'GraphVideo'
        }

        # Есть только один предмет
        video_item = self.скачать (tmp_item, save_dir) [0]

        tmp_item ['urls'] = [элемент ['audio']]
        # Есть только один предмет
        audio_item = self.download (tmp_item, save_dir) [0]

        трансляция = mpe.VideoFileClip (video_item)
        audio_background = mpe.AudioFileClip (audio_item)
        трансляция = broadcast.set_audio (audio_background)
        broadcast.write_videofile (broadcast.filename, logger = None)
        broadcast.close ()
        audio_background.close ()

        # Удалить аудио
        os.remove (audio_background.имя файла)

    def templatefilename (self, item):

        для URL в элементе ['urls']:
            имя файла, расширение = os.path.splitext (os.path.split (url.split ('?') [0]) [1])
            пытаться:
                template = self.template
                template_values ​​= {
                                    'имя пользователя': элемент ['имя пользователя'],
                                   'urlname': имя файла,
                                    'шорткод': str (элемент ['шорткод']),
                                    'mediatype': элемент ['__ typename'] [5:],
                                   'datetime': время.strftime ('% Y% m% d% Hh% Mm% Ss',
                                                             time.localtime (self .__ get_timestamp (элемент))),
                                   'date': time.strftime ('% Y% m% d', time.localtime (self .__ get_timestamp (item))),
                                   'год': time.strftime ('% Y', time.localtime (self .__ get_timestamp (item))),
                                   'месяц': time.strftime ('% m', time.localtime (self .__ get_timestamp (item))),
                                   'день': время.strftime ('% d', time.localtime (self .__ get_timestamp (элемент))),
                                   'h': time.strftime ('% Hh', time.localtime (self .__ get_timestamp (item))),
                                   'm': time.strftime ('% Mm', time.localtime (self .__ get_timestamp (item))),
                                   's': time.strftime ('% Ss', time.localtime (self .__ get_timestamp (элемент)))}

                customfilename = str (template.format (** template_values) + расширение)
                URL выхода, customfilename
            кроме KeyError:
                customfilename = str (имя файла + расширение)
                URL выхода, customfilename

    def is_new_media (self, item):
        "" "Возвращает True, если носитель новый."" "
        если self.latest имеет значение False или self.last_scraped_filemtime == 0:
            вернуть True

        current_timestamp = self .__ get_timestamp (элемент)
        вернуть current_timestamp> 0 и current_timestamp> self.last_scraped_filemtime

    @staticmethod
    def __get_timestamp (элемент):
        если элемент:
            для ключа в ['created_at_timestamp', 'created_time','pted_at ',' date ',' published_time ']:
                found = item.get (ключ, 0)
                пытаться:
                    found = int (найдено)
                    если найдено> 1: #> 1, чтобы игнорировать любые логические приведения
                        возврат найден
                кроме ValueError:
                    проходить
        возврат 0

    @staticmethod
    def __get_file_ext (url):
        вернуть os.path.splitext (urlparse (url) .path) [1] [1:]. strip (). lower ()

    @staticmethod
    def __search (запрос):
        resp = requests.get (SEARCH_URL.format (запрос))
        вернуть json.loads (соответственно текст)

    def search_locations (самостоятельно):
        query = '' .join (self.usernames)
        result = self .__ search (запрос)

        если len (результат ['места']) == 0:
            Raise ValueError ("Не найдено местоположений для запроса '{0}'". формат (запрос))

        sorted_places = sorted (результат ['места'], ключ = itemgetter ('позиция'))

        для элемента в sorted_places [0: 5]:
            место = элемент ['место']
            print ('идентификатор-местоположения: {0}, заголовок: {1}, подзаголовок: {2}, город: {3}, широта: {4}, длительность: {5}'.формат(
                место ['location'] ['pk'],
                место ['title'],
                место ['подзаголовок'],
                место ['местоположение'] ['город'],
                место ['местоположение']. получить ('широта'),
                место ['местоположение']. получить ('lng')
            ))

    def merge_json (self, data, dst = '. /'):
        если не os.path.exists (dst):
            self.save_json (данные, dst)

        если данные:
            merged = данные
            с open (dst, 'rb') как f:
                file_data = json.load (кодеки.getreader ('utf-8') (е))
                ключ = список (merged.keys ()) [0]
                если ввести file_data:
                    объединено [ключ] = данные_файла [ключ]
            self.save_json (объединено, dst)

    @staticmethod
    def save_json (данные, dst = '. /'):
        "" "Сохраняет данные в файл json." ""
        если нет os.path.exists (os.path.dirname (dst)):
            os.makedirs (os.path.dirname (dst))

        если данные:
            output_list = {}
            если os.path.exists (dst):
                с open (dst, "rb") как f:
                    output_list.обновление (json.load (codecs.getreader ('utf-8') (f)))

            с open (dst, 'wb') как f:
                output_list.update (данные)
                json.dump (output_list, codecs.getwriter ('utf-8') (f), indent = 4, sort_keys = True, sure_ascii = False)

    def _persist_metadata (я, имя каталога, имя файла):
        metadata_path = '{0} / {1} .json'.format (имя каталога, имя файла)
        если (self.media_metadata или self.comments или self.include_location):
            если self.posts:
                если self.latest:
                    себя.merge_json ({'GraphImages': self.posts}, путь к метаданным)
                еще:
                    self.save_json ({'GraphImages': self.posts}, путь к метаданным)

            если self.stories:
                если self.latest:
                    self.merge_json ({'GraphStories': self.stories}, путь к метаданным)
                еще:
                    self.save_json ({'GraphStories': self.stories}, путь к метаданным)

    @staticmethod
    def get_logger (level = logging.DEBUG, dest = '', verbose = 0):
        "" "Возвращает регистратор."" "
        logger = logging.getLogger (__ имя__)

        dest + = '/' if (dest! = '') и dest [-1]! = '/' else ''
        fh = logging.FileHandler (dest + 'instagram-scraper.log', 'w')
        fh.setFormatter (logging.Formatter ('% (asctime) s -% (name) s -% (levelname) s -% (message) s'))
        fh.setLevel (уровень)
        logger.addHandler (fh)

        sh = logging.StreamHandler (sys.stdout)
        sh.setFormatter (logging.Formatter ('% (имя уровня) s:% (сообщение) s'))
        sh_lvls = [logging.ERROR, ведение журнала.ВНИМАНИЕ, logging.INFO]
        sh.setLevel (sh_lvls [подробный])
        logger.addHandler (sh)

        logger.setLevel (уровень)

        возвратный регистратор

    @staticmethod
    def get_values_from_file (usernames_file):
        "" "Анализирует файл, содержащий список имен пользователей." ""
        users = []

        пытаться:
            с открытым (usernames_file) как user_file:
                для строки в user_file.readlines ():
                    # Найти все имена пользователей, разделенные,; или пробел
                    пользователи + = re.,; \ s] + ', line.split ("#") [0])
        кроме IOError как err:
            поднять ValueError ('Файл не найден' + ошибка)

        вернуть пользователей

    @staticmethod
    def get_locations_from_file (location_file):
        "" "
        проанализировать ini-подобный файл с разделами, состоящими из заголовков, [locaiton],
        и аргументы, которые являются идентификаторами местоположения
        "" "
        местоположения = {}
        с open (location_file, 'r') как f_in:
            lines = filter (None, (line.rstrip () для строки в f_in))
            для строки в строках:
                match = re.поиск (r "\ [(\ w +) \]", строка)
                если совпадение:
                    current_group = match.group (1)
                    location.setdefault (текущая_группа, [])
                еще:
                    если не line.strip (). начинается с ("#"):
                        пытаться:
                            местоположения [текущая_группа] .append (line.strip ())
                        кроме NameError:
                            print («Файл должен начинаться с заголовка, заключенного в []»)
                            sys.,; \ s] + ', ввод)

    def deep_get (self, dict, path):
        def _split_indexes (ключ):
            split_array_index = re.compile (r '[. \ [\]] +') # ['foo', '0']
            возвратный фильтр (Нет, split_array_index.split (ключ))

        end_with_index = re.compile (r '\ [(. *?) \] $') # foo [0]

        список ключей = путь.split ('.')

        val = dict

        для ключа в списке ключей:
            пытаться:
                если заканчивается_with_index.search (ключ):
                    для опоры в _split_indexes (ключ):
                        если проп.isdigit ():
                            val = val [int (свойство)]
                        еще:
                            val = val [свойство]
                еще:
                    val = val [ключ]
            кроме (KeyError, IndexError, TypeError):
                return None

        вернуть val

    def save_cookies (сам):
        если self.cookiejar:
            с open (self.cookiejar, 'wb') как f:
                pickle.dump (self.session.cookies, f)



def main ():
    parser = argparse.ArgumentParser (
        description = "instagram-scraper извлекает и загружает фото и видео пользователя instagram.",
        epilog = textwrap.dedent ("" "
        Вы можете скрыть свои учетные данные от истории, прочитав свой
        имя пользователя из локального файла:
        $ instagram-scraper @ insta_args.txt user_to_scrape
        с insta_args.txt, выглядящим так:
        -u = мое_имя_пользователя
        -p = мой_пароль
        Вы можете добавить все аргументы в этот файл, просто не забудьте иметь
        один аргумент в строке.
        Настроить имя файла:
        добавив опцию --template или -T
        По умолчанию: {urlname}
        И есть несколько вариантов:
        {username}: пользователи Instagram, которые нужно очистить.{shortcode}: короткий код публикации, но изображение профиля и история отсутствуют.
        {urlname}: URL-адрес формы файла.
        {mediatype}: тип носителя.
        {datetime}: дата и время публикации фото / видео,
                     формат: 20180101 01h01m01s
        {date}: дата публикации фото / видео,
                 формат: 20180101
        {year}: формат: 2018
        {месяц}: формат: 01-12
        {день}: формат: 01-31
        {h}: час, формат: 00–23 часа
        {m}: минута, формат 00-59м
        {s}: второй, формат 00–59 с
        "" "),
        formatter_class = argparse.RawDescriptionHelpFormatter,
        fromfile_prefix_chars = '@')

    parser.add_argument ('username', help = 'Пользователи Instagram для очистки', nargs = '*')
    parser.add_argument ('- destination', '-d', default = '. /', help = 'Download destination')
    parser.add_argument ('- login-user', '--login_user', '-u', default = None, help = 'Пользователь для входа в Instagram')
    parser.add_argument ('- login-pass', '--login_pass', '-p', default = None, help = 'Пароль для входа в Instagram')
    parser.add_argument ('- followings-input', '--followings_input', action = 'store_true', по умолчанию = False,
                        help = 'Составить список профилей, за которым следует логин-пользователь для использования в качестве входных данных')
    парсер.add_argument ('- followings-output', '--followings_output', help = 'Вывести следующие-входные данные в файл в месте назначения')
    parser.add_argument ('- filename', '-f', help = 'Путь к файлу, содержащему список пользователей для очистки')
    parser.add_argument ('- quiet', '-q', default = False, action = 'store_true', help = 'Тихо при очистке')
    parser.add_argument ('- maximum', '-m', type = int, default = 0, help = 'Максимальное количество элементов для очистки')
    parser.add_argument ('- keep-username', '--retain_username', '-n', action = 'store_true', по умолчанию = False,
                        help = 'Создает подкаталог имени пользователя, когда установлен флаг назначения')
    парсер.add_argument ('- media-metadata', '--media_metadata', action = 'store_true', по умолчанию = False,
                        help = 'Сохранить метаданные мультимедиа в файл json')
    parser.add_argument ('- profile-metadata', '--profile_metadata', action = 'store_true', по умолчанию = False,
                        help = 'Сохранить метаданные профиля в файл json')
    parser.add_argument ('- proxies', default = {}, help = 'Включить использование прокси, добавить действительный JSON с URL-адресами http или / и https.')
    parser.add_argument ('- include-location', '--include_location', action = 'store_true', по умолчанию = False,
                        help = 'Включить данные о местоположении при сохранении метаданных мультимедиа')
    парсер.add_argument ('- media-types', '--media_types', '-t', nargs = '+', default = ['изображение', 'видео', 'история', 'трансляция'],
                        help = 'Укажите типы носителей для очистки')
    parser.add_argument ('- latest', action = 'store_true', default = False, help = 'Очистить новый носитель с момента последнего очистки')
    parser.add_argument ('- latest-stamps', '--latest_stamps', по умолчанию = None,
                        help = 'Очистить новый носитель с момента создания пользователем отметок времени в указанном файле')
    parser.add_argument ('- cookiejar', '--cookierjar', по умолчанию = Нет,
                        help = 'Файл, в котором хранятся файлы cookie, чтобы их можно было повторно использовать между запусками.')
    parser.add_argument ('- tag', action = 'store_true', default = False, help = 'Очистить медиа с помощью хэштега')
    parser.add_argument ('- filter', default = None, help = 'Фильтровать по тегам в сообщениях пользователей', nargs = '*')
    parser.add_argument ('- filter-location', default = None, nargs = "*", help = "фильтровать запрос, принимая только медиа с фильтром местоположения в качестве идентификатора местоположения")
    parser.add_argument ('- filter-location-file', default = None, type = str, help = "файл, содержащий список местоположений для фильтрации запроса")
    парсер.add_argument ('- location', action = 'store_true', default = False, help = 'Очистить медиа с помощью идентификатора местоположения')
    parser.add_argument ('- search-location', action = 'store_true', default = False, help = 'Искать места по имени')
    parser.add_argument ('- comments', action = 'store_true', default = False, help = 'Сохранить комментарии к сообщениям в файл json')
    parser.add_argument ('- no-check-certificate', action = 'store_true', default = False, help = 'Не использовать ssl для транзакции')
    parser.add_argument ('- interactive', '-i', action = 'store_true', по умолчанию = False,
                        help = 'Включить интерактивное решение проблемы входа в систему')
    парсер.add_argument ('- retry-forever', action = 'store_true', по умолчанию = False,
                        help = 'Бесконечно повторять попытки загрузки при получении ошибок')
    parser.add_argument ('- verbose', '-v', type = int, default = 0, help = 'Уровень детализации журнала')
    parser.add_argument ('- template', '-T', type = str, default = '{urlname}', help = 'Настроить шаблон имени файла')
    parser.add_argument ('- log_destination', '-l', type = str, default = '', help = 'папка назначения для файла instagram-scraper.log')

    args = парсер.parse_args ()

    если (args.login_user и args.login_pass - None) или (args.login_user - None и args.login_pass):
        parser.print_help ()
        Raise ValueError ('Необходимо указать пользователя и пароль для входа')

    если не args.username и args.filename равно None, а не args.followings_input:
        parser.print_help ()
        Raise ValueError ('Необходимо указать имена пользователей ИЛИ файл, содержащий список имен пользователей ИЛИ передать --followings-input')
    elif (args.username и args.filename) или (args.username и args.followings_input) или (args.filename и args.followings_input):
        parser.print_help ()
        Raise ValueError ('Необходимо указать только одно из следующего: имя (а) пользователя ИЛИ имя файла, содержащее имя (а) пользователя ИЛИ --followings-input')

    если args.tag и args.location:
        parser.print_help ()
        Raise ValueError ('Необходимо указать только одно из следующего: хэштег ИЛИ местоположение')

    если args.tag и args.filter:
        parser.print_help ()
        Raise ValueError ('Фильтры применяются к сообщениям пользователей')

    если (аргументы.filter_location или args.filter_location_file), а не args.include_location:
        parser.print_help ()
        поднять ValueError ('Фильтру местоположения требуются местоположения в метаданных для правильной фильтрации')

    если args.filename:
        args.usernames = InstagramScraper.get_values_from_file (args.filename)
    еще:
        args.usernames = InstagramScraper.parse_delimited_str (','. join (args.username))

    если args.filter_location_file:
        args.filter_locations = InstagramScraper.get_locations_from_file (args.filter_location_file)
    elif args.filter_location:
        местоположения = {}
        местоположения.setdefault ('', [])
        местоположения [''] = InstagramScraper.parse_delimited_str (','. join (args.filter_location))
        args.filter_locations = местоположения
        
    если args.media_types и len (args.media_types) == 1 и re.compile (r '[,; \ s] +'). findall (args.media_types [0]):
        args.media_types = InstagramScraper.parse_delimited_str (args.media_types [0])

    если args.retry_forever:
        глобальный MAX_RETRIES
        MAX_RETRIES = sys.максимальный размер

    scraper = InstagramScraper (** vars (args))

    если args.login_user и args.login_pass:
        scraper.authenticate_with_login ()
    еще:
        scraper.authenticate_as_guest ()

    если args.followings_input:
        scraper.usernames = список (scraper.query_followings_gen (scraper.login_user))
        если args.followings_output:
            с open (scraper.destination + scraper.followings_output, 'w') как файл:
                для имени пользователя в scraper.usernames:
                    file.write (имя пользователя + "\ n")
            # Если больше ничего не запрашивается, выходим
            если аргументы.media_types == ['none'] и args.media_metadata имеет значение False:
                scraper.logout ()
                возвращаться

    если args.tag:
        scraper.scrape_hashtag ()
    elif args.location:
        scraper.scrape_location ()
    elif args.search_location:
        scraper.search_locations ()
    еще:
        scraper.scrape ()

    scraper.save_cookies ()


если __name__ == '__main__':
    основной()



  

Если вы хотите пропустить весь этот процесс и получить необходимые данные Instagram менее чем за 24 часа, перейдите на мой сайт Influencers.club и закажите бесплатный звонок по стратегии.

Простой способ очистки Instagram с помощью Python Scrapy и GraphQL

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

Однако любой, кто пытался создать паука-парсера для сканирования Instagram, Facebook, Twitter или TikTok, знает, что это может быть немного сложно.

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

Итак, в этой статье я покажу вам самый простой способ создать паука Python Scrapy, который очищает все сообщения Instagram для каждой учетной записи пользователя, которую вы ему отправляете. При этом не нужно беспокоиться о блокировке или необходимости разрабатывать селекторы XPath для очистки данных из необработанного HTML.

Код проекта доступен на GitHub здесь и настроен для очистки:

  • URL сообщения
  • URL изображения или видео
  • Подписи к сообщениям
  • Дата публикации
  • Количество лайков
  • Количество комментариев

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

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

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

Настройка нашего Scrapy Spider

Начать работу с Scrapy очень просто. Чтобы установить Scrapy, просто введите эту команду в командной строке:

  pip install scrapy
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Затем перейдите в папку вашего проекта. Scrapy автоматически создает и запускает команду «startproject» вместе с именем проекта (в данном случае «instascraper»), и Scrapy создаст для вас папку проекта парсинга веб-страниц, в которой все уже настроено:

  scrapy startproject instascraper

cd instascraper

scrapy genspider instagram instagram.ком
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Вот что вы должны увидеть:

  ├── scrapy.cfg # файл конфигурации развертывания
└── Модуль Python учебного # проекта, вы импортируете свой код отсюда
    ├── __init__.py
    ├── items.py # файл определения элементов проекта
    ├── middlewares.py # файл промежуточного программного обеспечения проекта
    ├── pipelines.py # файл конвейера проекта
    ├── settings.py # файл настроек проекта
    └── spiders # каталог, в котором находятся пауки
        ├── __init__.ру
        └── amazon.py # только что созданный нами паук
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Итак, настроены шаблоны Scrapy Spider. А теперь давайте приступим к созданию наших пауков для Instagram.

Отсюда мы собираемся создать пять функций:

  1. start_requests — создаст URL-адрес Instagram для учетной записи пользователя и отправит запрос в Instagram.
  2. parse — будет извлекать все данные о сообщениях из ленты новостей пользователей.
  3. parse_page — , если есть более одной страницы, эта функция проанализирует все данные сообщений с этих страниц.
  4. get_video — , если сообщение включает видео, эта функция будет вызываться и извлекать URL-адрес видео.
  5. get_url — отправит запрос в Scraper API, чтобы он мог получить ответ HTML.

Приступим к работе…

Запрос учетных записей Instagram

Чтобы получить данные пользователя из Instagram, нам нужно сначала создать список пользователей, которых мы хотим отслеживать, а затем включить их идентификаторы пользователей в URL-адрес.К счастью для нас, Instagram использует довольно простую структуру URL-адресов.

У каждого пользователя есть уникальное имя и / или идентификатор пользователя, которые мы можем использовать для создания URL-адреса пользователя:

  https://www.instagram.com//
  
Войти в полноэкранный режимВыйти из полноэкранного режима

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

  ## Теги URL
https: // www.instagram.com/explore/tags//

## URL-адрес местоположения
https://www.instagram.com/explore/locations//

# Примечание: URL-адрес местоположения представляет собой числовое значение, поэтому вам необходимо определить номер идентификатора местоположения для
# места, которые вы хотите очистить.
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Итак, для этого примера паука я собираюсь использовать Nike и Adidas в качестве двух учетных записей Instagram, которые я хочу очистить.

Используя вышеуказанную структуру, URL-адрес Nike: https: // www.instagram.com/nike/ , и мы также хотим иметь возможность указывать язык страницы с помощью параметра «hl». Например:

  https://www.instagram.com/nike/?hl=en #English
https://www.instagram.com/nike/?hl=de # немецкий
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Паук №1: получение учетных записей Instagram

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

Наш паук стартовых запросов будет довольно простым, нам просто нужно отправить запросы в Instagram с URL-адресом имени пользователя, чтобы получить учетную запись пользователя:

  def start_requests (самостоятельно):
        для имени пользователя в user_accounts:
            url = f'https: //www.instagram.com/ {username} /? hl = en '
            yield scrapy.Request (get_url (url), callback = self.parse)
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Функция start_requests выполнит итерацию по списку user_accounts, а затем отправит запрос в Instagram с помощью команды yield scrapy .Request (get_url (url), callback = self.parse) , где ответ отправляется функции parse в обратном вызове.

Паук №2: парсинг почтовых данных

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

На первый взгляд, данные, которые нам нужны, такие как URL изображений, лайки, комментарии и т. Д., Похоже, не содержатся в данных HTML. Однако при более внимательном рассмотрении мы увидим, что данные представлены в форме словаря JSON в теге сценариев, который начинается с «window._sharedData ».

Это связано с тем, что Instagram сначала загружает макет и все необходимые данные из своего внутреннего GraphQL API, а затем помещает данные в правильный макет.

Мы могли бы очистить эти данные напрямую, если бы напрямую запросили конечную точку Instagrams GraphQL, добавив «/? __ a = 1» в конец URL-адреса. Например:

  https://www.instagram.com/nike/?__a=1/
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Но мы не сможем перебирать все страницы, поэтому вместо этого мы получим ответ HTML, а затем извлечем данные из окна._sharedData JSON словарь.

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

  def parse (self, response):
        x = response.xpath ("// сценарий [начинается с (., 'window._sharedData')] / text ()"). extract_first ()
        json_string = x.strip (). split ('=') [1] [: - 1]
        данные = json.loads (json_string)
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Отсюда нам просто нужно извлечь нужные данные из словаря JSON.

  def parse (self, response):
        x = response.xpath ("// сценарий [начинается с (., 'window._sharedData')] / text ()"). extract_first ()
        json_string = x.strip (). split ('=') [1] [: - 1]
        данные = json.loads (json_string)
        # все, что нам нужно сделать, это проанализировать имеющийся у нас JSON
        user_id = data ['entry_data'] ['ProfilePage'] [0] ['graphql'] ['user'] ['id']
        next_page_bool = \
            data ['entry_data'] ['ProfilePage'] [0] ['graphql'] ['user'] ['edge_owner_to_timeline_media'] ['page_info'] [
                'has_next_page']
        Edge = data ['entry_data'] ['ProfilePage'] [0] ['graphql'] ['user'] ['edge_felix_video_timeline'] ['edge']
        для i в краях:
            url = 'https: // www.instagram.com/p/ '+ i [' узел '] [' короткий код ']
            видео = я ['узел'] ['is_video']
            date_posted_timestamp = i ['узел'] ['t_at_timestamp']
            date_posted_human = datetime.fromtimestamp (date_posted_timestamp) .strftime ("% d /% m /% Y% H:% M:% S")
            like_count = i ['node'] ['edge_liked_by'] ['count'] if «edge_liked_by» в i ['node']. keys () else ''
            comment_count = i ['node'] ['edge_media_to_comment'] ['count'], если 'edge_media_to_comment' в i [
                'узел']. ключи () еще ''
            captions = ""
            если я ['узел'] ['edge_media_to_caption']:
                для i2 в i ['node'] ['edge_media_to_caption'] ['edge']:
                    captions + = i2 ['узел'] ['текст'] + "\ n"

            если видео:
                image_url = i ['узел'] ['display_url']
            еще:
                image_url = i ['узел'] ['thumbnail_resources'] [- 1] ['src']
            item = {'postURL': url, 'isVideo': видео, 'date_posted': date_posted_human,
                    'timestamp': date_posted_timestamp, 'likeCount': like_count, 'commentCount': comment_count, 'image_url': image_url,
                    'captions': captions [: - 1]}

  
Войти в полноэкранный режимВыйти из полноэкранного режима

Паук №3: Извлечение URL-адресов видео

Чтобы извлечь URL-адрес видео, нам нужно сделать еще один запрос к этому конкретному сообщению, поскольку эти данные не включены в ответ JSON, ранее возвращенный Instagram.

Если сообщение включает видео, тогда для флага is_video будет установлено значение true, что заставит наш парсер запросить страницу публикации и отправить ответ функции get_video .

  если видео:
     yield scrapy.Request (get_url (url), callback = self.get_video, meta = {'item': item}))
еще:
     элемент ['videoURL'] = ''
     доходный пункт
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Затем функция get_video извлечет videoURL из ответа.

  def get_video (self, response):
        # только с первой страницы
        item = response.meta ['элемент']
        video_url = response.xpath ('// meta [@ property = "og: video"] / @ content'). extract_first ()
        элемент ['videoURL'] = video_url
        доходный пункт
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Паук №4: Перебор доступных страниц

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

Как и функция get_video , нам нужно проверить, есть ли еще доступные страницы, прежде чем вызывать функцию parse_pages . Мы делаем это, проверяя, является ли поле has_next_page в словаре JSON истинным или ложным.

  next_page_bool = \
            data ['entry_data'] ['ProfilePage'] [0] ['graphql'] ['user'] ['edge_owner_to_timeline_media'] ['page_info'] [
                'has_next_page']

  
Войти в полноэкранный режимВыйти из полноэкранного режима

Если это правда, то мы извлечем значение end_cursor из словаря JSON и создадим новый запрос для конечной точки Instagrams GraphQL api вместе с user_id , query_hash и т. Д.

 , если next_page_bool:
            курсор = \
                data ['entry_data'] ['ProfilePage'] [0] ['graphql'] ['user'] ['edge_owner_to_timeline_media'] ['page_info'] [
                    'end_cursor']
            di = {'id': user_id, 'first': 12, 'after': cursor}
            печать (ди)
            params = {'query_hash': 'e769aa130647d2354c40ea6a439bfc08', 'variables': json.dumps (di)}
            url = 'https://www.instagram.com/graphql/query/?' + urlencode (параметры)
            урожай scrapy.Запрос (get_url (url), callback = self.parse_pages, meta = {'pages_di': di})

  
Войти в полноэкранный режимВыйти из полноэкранного режима

Затем будет вызвана функция parse_pages , которая повторит процесс извлечения всех данных публикации и проверки, есть ли еще страницы.

Разница между этой функцией и исходной функцией синтаксического анализа заключается в том, что она не очищает URL видео каждого сообщения. Однако вы можете легко добавить это, если хотите.

  def parse_pages (self, response):
   di = response.meta ['pages_di']
   данные = json.loads (response.text)
   для i в data ['data'] ['user'] ['edge_owner_to_timeline_media'] ['edge']:
       видео = я ['узел'] ['is_video']
       url = 'https://www.instagram.com/p/' + i ['узел'] ['короткий код']
       если видео:
           image_url = i ['узел'] ['display_url']
           video_url = i ['узел'] ['video_url']
       еще:
           video_url = ''
           image_url = i ['узел'] ['thumbnail_resources'] [- 1] ['src']
       date_posted_timestamp = i ['узел'] ['t_at_timestamp']
       captions = ""
       если я ['узел'] ['edge_media_to_caption']:
           для i2 в i ['node'] ['edge_media_to_caption'] ['edge']:
               captions + = i2 ['узел'] ['текст'] + "\ n"
       comment_count = i ['узел'] ['edge_media_to_comment'] ['count'], если 'edge_media_to_comment' в i ['node'].ключи () еще ''
       date_posted_human = datetime.fromtimestamp (date_posted_timestamp) .strftime ("% d /% m /% Y% H:% M:% S")
       like_count = i ['node'] ['edge_liked_by'] ['count'] if «edge_liked_by» в i ['node']. keys () else ''
       item = {'postURL': url, 'isVideo': видео, 'date_posted': date_posted_human,
               'timestamp': date_posted_timestamp, 'likeCount': like_count, 'commentCount': comment_count, 'image_url': image_url,
               'videoURL': video_url, 'captions': captions [: - 1]
               }
       доходный пункт
   next_page_bool = данные ['данные'] ['пользователь'] ['edge_owner_to_timeline_media'] ['page_info'] ['has_next_page']
   если next_page_bool:
       курсор = данные ['данные'] ['пользователь'] ['edge_owner_to_timeline_media'] ['page_info'] ['end_cursor']
       di ['после'] = курсор
       params = {'query_hash': 'e769aa130647d2354c40ea6a439bfc08', 'переменные': json.свалки (ди)}
       url = 'https://www.instagram.com/graphql/query/?' + urlencode (параметры)
       yield scrapy.Request (get_url (url), callback = self.parse_pages, meta = {'pages_di': di})
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Going Live!

Наконец, мы почти готовы к запуску. Последнее, что нам нужно сделать, — это настроить наших пауков на использование прокси-сервера, чтобы мы могли масштабировать очистку без блокировки.

Для этого проекта я выбрал Scraper API, так как он очень прост в использовании и потому, что они имеют большой успех при парсинге Instagram.

Scraper API — это API прокси, который управляет всем, что связано с прокси за вас. Вам просто нужно отправить им URL-адрес, который вы хотите очистить, и их API направит ваш запрос через один из их пулов прокси и вернет вам ответ HTML.

Чтобы использовать Scraper API, вам необходимо зарегистрировать бесплатную учетную запись здесь и получить ключ API, который позволит вам делать 1000 бесплатных запросов в месяц и использовать все дополнительные функции, такие как рендеринг Javascript, геотаргетинг, резидентные прокси и т. Д.

Далее нам нужно интегрировать его с нашим пауком. Читая их документацию, мы видим, что есть три способа взаимодействия с API: через одну конечную точку API, через их Python SDK или через их порт прокси.

Для этого проекта я интегрировал API, настроив своих пауков для отправки всех наших запросов в их конечную точку API.

  API = ‘’

def get_url (url):
    payload = {'api_key': API, 'url': url}
    proxy_url = 'http: // api.scraperapi.com/? ' + urlencode (полезная нагрузка)
    вернуть proxy_url

  
Войти в полноэкранный режимВыйти из полноэкранного режима

А затем измените наши функции-пауки, чтобы использовать прокси Scraper API, установив для параметра url в scrapy.Request значение get_url (url) . Например:

  def start_requests (самостоятельно):
        для имени пользователя в user_accounts:
            url = f'https: //www.instagram.com/ {username} /? hl = en '
            yield scrapy.Request (get_url (url), callback = self.разобрать)
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Мы также должны изменить настройки пауков, чтобы установить для allowed_domains значение api.scraperapi.com, а максимальное количество одновременных запросов на домен — равным пределу параллелизма нашего плана Scraper API. Что в случае бесплатного плана Scraper API — это 5 параллельных потоков:

  класс InstagramSpider (scrapy.Spider):
    name = 'instagram'
    allowed_domains = ['api.scraperapi.com']
    custom_settings = {'CONCURRENT_REQUESTS_PER_DOMAIN': 5}
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Кроме того, мы должны установить RETRY_TIMES , чтобы сообщить Scrapy о повторении любых неудачных запросов (например, до 5) и убедиться, что DOWNLOAD_DELAY и RANDOMIZE_DOWNLOAD_DELAY не включены, поскольку они уменьшают ваш параллелизм и не требуются с помощью Scraper API.

Одним из преимуществ извлечения данных непосредственно из ответа JSON от GraphQL API является то, что нам не нужно писать какие-либо конвейеры для очистки данных, поскольку их уже можно использовать.

Теперь все готово. Вы можете протестировать паука еще раз, запустив его с помощью команды crawl.

  сканирование scrapy instagram -o test.csv
  
Войти в полноэкранный режимВыйти из полноэкранного режима

После завершения паук сохранит данные учетных записей в файле csv.

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

парсинг веб-страниц — Как извлечь данные из Instagram

Вам обязательно стоит проверить API Instagram, который может предоставить вам всю общедоступную информацию, которую вы хотите очистить. Вам просто нужно написать сценарий для правильных вызовов API (см. Ниже).

С сайта Instagram:

Мы делаем все возможное, чтобы все наши URL-адреса были RESTful. Каждая конечная точка (URL) может поддерживать один из четырех разных HTTP-глаголов. Запросы GET получают информацию об объекте, запросы POST создают объекты, запросы PUT обновляют объекты и, наконец, запросы DELETE удаляют объекты.

Вам просто нужно иметь готовое значение ACCESS-TOKEN для соответствующей учетной записи, когда вы используете URL-адрес в своем коде, и иметь возможность распаковывать json, который Instagram возвращает вам с каждым запросом GET.Если данные не напрямую доступны, вы всегда можете опровергнуть их косвенно. — Имя учетной записи — Количество подписчиков — Количество подписанных людей

Вот отличная отправная точка: https://www.instagram.com/developer/endpoints/users/#get_users

А вот как вы могли бы вызвать API в python:

  #Python 2.7.6
# RestfulClient.py

запросы на импорт
из request.auth импорт HTTPDigestAuth
импортировать json

# Замените правильным URL
url = "http: // api_url"

# Рекомендуется не кодировать учетные данные жестко.Поэтому попросите пользователя ввести учетные данные во время выполнения
myResponse = requests.get (url, auth = HTTPDigestAuth (raw_input ("имя пользователя:"), raw_input ("Пароль:")), verify = True)
#print (myResponse.status_code)

# Для успешного вызова API код ответа будет 200 (ОК)
если (myResponse.ok):

    # Загрузка данных ответа в переменную dict
    # json.loads принимает только двоичные или строковые переменные, поэтому использование содержимого для получения двоичного содержимого
    # Loads (Load String) принимает файл Json и преобразует его в структуру данных python (dict или list, в зависимости от JSON)
    jData = json.загружает (myResponse.content)

    print ("Ответ содержит {0} свойства" .format (len (jData)))
    печать ("\ п")
    для ключа в jData:
        ключ печати + ":" + jData [ключ]
еще:
  # Если код ответа неправильный (200), вывести полученный код ошибки http с описанием
    myResponse.raise_for_status ()
  
Сервис парсинга инстаграм

: как разобрать целевую аудиторию в инстаграм

Парсер

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

Насколько полезна готовая аудитория? Все выполняемые действия по продвижению вашего аккаунта становятся более эффективными. При этом шансы получить бан администрацией Instagram снижаются.

Что это за метод и как он работает?

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

Изначальная цель парсинга в Instagram — продвижение специализированных сайтов. Для выполнения задачи были привлечены люди с необходимыми навыками и опытом. Сегодня некоторые платформы, такие как Zen-Promo Parser, позволяют пользователям использовать этот метод самостоятельно, клиенту нужно только выбрать подходящие фильтры.

Parser собирает и анализирует информацию по заданным параметрам:

  • геолокация;
  • хэштегов;
  • подписок и подписчиков.

Кому нужен парсинг, какие проблемы решает?

Instagram Parser будет полезен как для развития аккаунтов с крупным бизнесом, так и для продвижения профилей, созданных для самовыражения автора.

Этот метод позволяет решить две серьезные проблемы.Во-первых, парсеры помогают найти реальных подписчиков, заинтересованных в ваших услугах, и собрать аудиторию в Instagram. Например, профиль в Instagram продает косметику и средства по уходу за кожей для девочек. В этом случае механизм выберет женщин, которые подписались на публичные страницы о красоте и уходе за собой, которые живут рядом с вашим офисом или часто посещают места поблизости. Хештеги также будут использоваться для анализа данных.

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

Parsing может использоваться для различных целей. Этот метод также полезен для владельцев личных страниц, которые хотят найти заинтересованных подписчиков и увеличить количество подписчиков.Механизм найдет подходящих людей по подписке, интересам, местонахождению. Например, если вы хотите создать учетную запись для сериала, вы можете использовать парсеры для получения необходимой информации из профилей актеров и других публичных страниц схожей тематики.

Как удалить иностранных подписчиков из аккаунта Instagram

Zen-promo Инструкция парсера

Zen-Promo Parser — это эффективный и простой способ автоматического создания пользовательских баз. Эта информация может быть использована для дальнейших рекламных акций, в которых также может помочь Zen-Promo.Интерфейс парсера Zen-Promo достаточно прост и интуитивно понятен. Сервис быстро и качественно анализирует всю информацию, и пользователю достаточно ввести необходимые фильтры для более успешной работы программы.

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

Первое, что вам нужно сделать, это зарегистрироваться на сайте Zen-Promo (если вы еще этого не сделали).Для этого вам необходимо написать действующий адрес электронной почты и придумать пароль. После этого попробуйте поискать Парсер Дзен-промо среди услуг, предлагаемых сервисом на главной странице. Окно выбора программы расположено в верхнем левом углу экрана.

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

Zen-Promo Parser позволяет собирать данные по трем направлениям:

  • конкурентов;
  • хэштегов;
  • геолокация.

Во время сбора данных о конкурентах вы можете группировать их подписки и / или подписчиков.

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

Доступен поиск по ключевому слову при парсинге по геолокации.

Это позволяет собрать более полезные и узконаправленные базы счетов для повышения эффективности работы с ними в будущем.

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

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

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

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

  • пол;
  • количество подписок и аккаунтов подписчиков;
  • коммерческих счетов;
  • частных счетов.

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

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

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

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

Zen-Promo Parser — это эффективный и простой в использовании инструмент для сбора и обработки информации о целевой аудитории. Сервис позволяет продвигать свой профиль быстрее, приятнее, безопаснее и эффективнее. Парсинг абсолютно безопасен для аккаунтов и направлен на максимально точный подбор данных по необходимым критериям.

Вам также может понравиться: Как управлять Директом в Instagram

Рекомендуем прочитать статьи

парсить данные из Instagram | Octoparse

Последняя версия этого руководства доступна здесь. Пойдите, чтобы проверить сейчас!

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

Чтобы продолжить, вы можете использовать этот URL-адрес в учебнике:

https: // www.instagram.com/izkiz/

Вот основные шаги в этом руководстве: [Загрузите демонстрационный файл задачи здесь]

1) «Перейти на веб-страницу» — для открытия целевой веб-страницы

2) Создайте цикл нумерации страниц — для очистки данных из нескольких сообщений

3) Извлечь данные — выбор данных для извлечения

4) Настройте поле данных с помощью инструмента RegEx — чтобы изменить имя поля (необязательно)

5) Сохранить и запустить извлечение — запустить задачу и получить данные

1) «Перейти на веб-страницу» — для открытия целевой веб-страницы

· Создайте задачу в «Расширенном режиме».

· Вставьте URL-адрес в поле «URL-адрес для извлечения» и нажмите «Сохранить URL-адрес», чтобы перейти к

· Изменить встроенный браузер по умолчанию

Встроенный браузер Octoparse 7 по умолчанию несовместим с Instagram. Чтобы наша целевая страница загружалась нормально, нам нужно изменить настройки браузера.

· Нажмите «Настройка»

Если вы используете Octoparse 7.0.2, сохраните задачу перед изменением настроек

· Переключите встроенный браузер по умолчанию на Firefox 45.0.

· Нажмите «Сохранить», чтобы применить измененную настройку.

2) Создайте цикл нумерации страниц — для очистки данных из нескольких сообщений

Мы можем использовать кнопку «>» как кнопку «Следующая страница», чтобы перейти к следующему посту. Перед созданием цикла пагинации нам нужно вернуться к первому посту.

· Щелкните первое сообщение и щелкните тег «A» в нижней части «Советы по действию».

Когда вы выбираете элемент с URL-адресом, выбранный тег будет «A».Обычно изменять не нужно, поскольку Octoparse автоматически определяет теги выбранных элементов. Но в этом случае нам нужно изменить тег в нижней части «Подсказки к действию».

· Выберите «Щелкните ссылку»

У нас открылся первый пост. Однако, поскольку Instagram загружает контент с помощью AJAX, мы должны настроить загрузку AJAX для действия «Щелкните элемент».

· Снимите флажок «Автоповтор при отсутствии ответа»

· Установите флажок «Загрузить страницу с помощью AJAX»

· Установить «Тайм-аут AJAX»

Теперь мы можем создать «Пагинацию»

· Нажмите кнопку «>»

· Щелкните «Цикл, щелкните следующую страницу» в «Подсказках».

Instagram использует AJAX для кнопки «>», поэтому нам также необходимо настроить загрузку AJAX для действия «Щелкните для разбивки на страницы».

· Нажмите «Загрузить страницу с помощью AJAX» в «Настроить действие»

· Установить «Тайм-аут AJAX»

Советы!

Чтобы узнать больше о работе с AJAX в Octoparse, обратитесь к разделу Работа с AJAX.

3) Извлечь данные — выбор данных для извлечения

Мы сейчас на втором посте.При создании «элемента цикла» мы всегда должны начинать с первого элемента на первой странице. В этом случае мы должны вернуться к первому посту.

· Щелкните «Перейти на веб-страницу» в рабочем процессе

· Нажмите «Щелкните элемент»

Octoparse откроет первый пост.

· Щелкните цикл нумерации страниц в рабочем процессе

Таким образом мы можем помочь Octoparse определить порядок выполнения и сгенерировать шаг «Извлечь данные» в соответствующей позиции в рабочем процессе.

А теперь приступим к извлечению данных.

· Выберите нужные данные

· Нажмите «извлечь данные» в «Подсказках»


4) Настройте поле данных — чтобы изменить имя поля (необязательно)

· Измените название поля

Ввод или выбор из предопределенных опций.

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

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