Количество подписчиков в Instagram: BeautifulSoup - PullRequest
0 голосов
/ 07 сентября 2018

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

import requests
from bs4 import BeautifulSoup

user = "espn"
url = 'https://www.instagram.com/'+ user
r = requests.get(url)
soup = BeautifulSoup(r.content)
followers = soup.find('meta', {'name': 'description'})['content']
follower_count = followers.split('Followers')[0]
print(follower_count)

# 10.7m

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу получить более точное число, которое вы можете увидеть, наведя указатель мыши на число подписчиков на странице Instagram (например, 10 770 816).

К сожалению, я не смог понять, как это сделать с BeautifulSoup. Я хотел бы сделать это без API, так как я комбинирую это с кодом для отслеживания других социальных сетей. Любые советы?

Ответы [ 5 ]

0 голосов
/ 07 декабря 2018

Вот мой подход (исходный код HTML имеет объект json, который содержит все данные профиля)

import json
import urllib.request, urllib.parse
from bs4 import BeautifulSoup   

req      = urllib.request.Request(myurl)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36')
html     = urllib.request.urlopen(req).read()
response = BeautifulSoup(html, 'html.parser')
jsonObject = response.select("body > script:nth-of-type(1)")[0].text.replace('window._sharedData =','').replace(';','')
data      = json.loads(jsonObject)
following = data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_follow']['count']
followed  = data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_followed_by']['count']
posts     = data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media']['count']
username  = data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media']['edges'][0]['node']['owner']['username']
0 голосов
/ 25 октября 2018

Instagram всегда отвечает данными JSON, что делает его более понятным вариантом получения метаданных из JSON, а не анализирует HTML-ответ с BeautifulSoup. Учитывая, что использование BeatifulSoup не является ограничением, есть как минимум два чистых варианта, чтобы получить количество подписчиков в профиле Instagram:

  1. Получите страницу профиля, найдите JSON и проанализируйте ее:

    import json
    import re
    import requests
    
    response = requests.get('https://www.instagram.com/' + PROFILE)
    json_match = re.search(r'window\._sharedData = (.*);</script>', response.text)
    profile_json = json.loads(json_match.group(1))['entry_data']['ProfilePage'][0]['graphql']['user']
    
    print(profile_json['edge_followed_by']['count'])
    

    Затем переменная profile_json содержит метаданные профиля, а не только число подписчиков.

  2. Использовать библиотеку, оставляя изменения в ответах Instagram проблемой верхнего уровня. Есть Instaloader , который можно использовать вот так:

    from instaloader import Instaloader, Profile
    
    L = Instaloader()
    profile = Profile.from_username(L.context, PROFILE)
    
    print(profile.followers)
    

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

    (отказ от ответственности: я создаю этот инструмент)

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

0 голосов
/ 07 сентября 2018

Самый простой способ сделать это - выгрузить HTML-страницу в текстовый редактор и выполнить текстовый поиск по точному количеству подписчиков, которые есть у человека. Затем вы можете обнулить элемент, содержащий число.

0 голосов
/ 07 сентября 2018

Использовать API - это самый простой способ, но я также нашел очень хакерский способ сделать это:

import requests

user = "espn"
url = 'https://www.instagram.com/' + user
r = requests.get(url).text

start = '"edge_followed_by":{"count":'
end = '},"followed_by_viewer"'

print r[r.find(start)+len(start):r.rfind(end)]

Возвращает 10770969.

Если вы просматриваете ответы на запросы, есть строка Javascript, которая содержит реальное число подписчиков:

... edge_followed_by":{"count":10770969},"followed_by_viewer":{ ...

Так что я просто извлек число, найдя подстроку до и после.

0 голосов
/ 07 сентября 2018

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

...