网络抓取Instagram粉丝数BeautifulSoup

时间:2018-09-07 15:09:04

标签: python web-scraping beautifulsoup instagram

我才刚刚开始学习如何使用 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 :(得分:3)

使用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":{ ...

所以我只是通过查找前后的子字符串来提取数字。

答案 1 :(得分:0)

尽管这并不是编程上的普遍问题,但您应该发现确切的关注者计数是包含格式化的关注者计数的title元素的span属性。您可以查询此属性。

答案 2 :(得分:0)

执行此操作的简便方法是将html页面转储到文本编辑器中,并进行文本搜索以查找此人拥有的确切追随者数量。然后,您可以将零归零到包含数字的元素中。

答案 3 :(得分:0)

Instagram始终使用JSON数据进行响应,这使其通常是从JSON获取元数据的更干净的选择,而不是使用BeautifulSoup解析HTML响应。鉴于使用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响应做任何奇怪的事情。

答案 4 :(得分:0)

这是我的方法(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']