Раньше я смотрел The Bachelor еженедельно и после этого быстро открыл для себя r / TheBachelor. Однажды, наблюдая за сезоном Ханны Би, я наткнулся на сообщение в сабреддите, в котором указывалось на интересный феномен - в частности, один участник, Тайлер С., набирал популярность в социальных сетях. По сравнению с другими участницами и даже с самой ведущей шоу, его подписчики стремительно росли.

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

Ответ на этот вопрос оказался гораздо интереснее, чем я мог предположить, поэтому сегодня я расскажу следующее: как я могу программно вывести количество подписчиков из Instagram? Я напишу в Python, но решение не зависит от языка.

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

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

Следующей моей мыслью было посмотреть, смогу ли я сделать запрос к instagram.com/tylerjcameron3 и очистить получившуюся страницу для определения количества его подписчиков. Поскольку на странице Instagram указано количество его подписчиков (2,3 млн), информация должна присутствовать на странице. Однако на этом все и стало интересно.

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

Но давайте перейдем к более интересным вещам. Если вы собираетесь попробовать соскабливание, как бы вы это сделали? Обычно я начинаю с загрузки интересующей меня страницы и просмотра ее первоначальных сетевых вызовов в инструментах разработчика. В Chrome щелкните правой кнопкой мыши ›Проверить› Вкладка «Сеть». Поскольку его количество подписчиков напечатано на его странице, это означает, что этот номер должен присутствовать в сетевом вызове где-нибудь. В зависимости от его местоположения это дает мне возможность получить к нему доступ.

Начиная со страницы Тайлера Си, вы можете увидеть внизу журнала, что запущено довольно много запросов. В частности, семьдесят девять.

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

В идеальном мире (для нас) cURL запрос к https://instagram.com/tylerjcameron3 даст легко анализируемый ответ, такой как JSON, показанный слева.

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

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

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

Но количество его последователей не сразу видно. Итак, я попробовал еще один трюк - мы видим, что его биография содержит предложение: «Через любовь служите друг другу». Если в этом HTML-коде есть его основная информация о профиле, наверняка там будет и его биография. Итак, выполнив поиск в HTML, вуаля! Его биография находится в блоке JSON вместе с множеством другой информации профиля.

Итак, теперь мы знаем, что для получения количества подписчиков профиля нам нужно проанализировать HTML, возвращенный из Instagram, и найти атрибут edge_followed_by.

А затем в Python мы можем использовать библиотеку requests, чтобы сделать запрос в Instagram и проанализировать ответ, чтобы получить количество подписчиков.

И вот оно! Мы можем получить количество подписчиков для любого профиля в Instagram.

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

Но вы можете выбрать любое количество направлений в зависимости от вашего сценария использования. Удачного кодирования!