网络抓取 Instagram 追随者数量 BeautifulSoup

Posted

技术标签:

【中文标题】网络抓取 Instagram 追随者数量 BeautifulSoup【英文标题】:Webscraping Instagram follower count BeautifulSoup 【发布时间】:2018-09-07 15:09:04 【问题描述】:

我刚刚开始学习如何使用 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 的情况下执行此操作,因为我将其与代码结合起来以跟踪其他社交媒体平台。有什么建议吗?

【问题讨论】:

我将遍历所有包含文本"followers"a 标签。找到后,提取标题值。 @Claudio 错误 404 【参考方案1】:

使用 API 是最简单的方法,但我也找到了一种非常 hacky 的方法:

import requests

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

start = '"edge_followed_by":"count":'
end = ',"followed_by_viewer"'
followers= r[r.find(start)+len(start):r.rfind(end)]

start = '"edge_follow":"count":'
end = ',"follows_viewer"'
following= r[r.find(start)+len(start):r.rfind(end)]

print(followers, following)

如果你查看请求给出的响应,有一行 javascript 包含真正的关注者数量:

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

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

【讨论】:

【参考方案2】:

Instagram 始终使用 JSON 数据进行响应,这使其成为从 JSON 获取元数据的通常更简洁的选择,而不是使用 BeautifulSoup 解析 html 响应。鉴于使用 BeatifulSoup 不是一个限制条件,至少有两个干净的选项可以获取 Instagram 个人资料的关注者数量:

    获取个人资料页面,搜索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 变量包含个人资料的元数据,而不仅仅是关注者数量。

    使用库,将 Instagram 响应的变化留给上游的问题。有Instaloader,可以这样使用:

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

    它还支持登录,也允许访问私人配置文件。

    (免责声明:我正在创作此工具)

无论哪种方式,您都可以获得一个包含配置文件元数据的结构,而无需对 html 响应做奇怪的事情。

【讨论】:

【参考方案3】:

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

【讨论】:

第 5 行的 myurl 是什么?【参考方案4】:

虽然这不是一个关于编程的真正普遍问题,但您应该发现确切的追随者计数是包含格式化的追随者计数的span 元素的title 属性。您可以查询该属性。

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于网络抓取 Instagram 追随者数量 BeautifulSoup的主要内容,如果未能解决你的问题,请参考以下文章

在 Instagram 中抓取一定数量的帖子

Instagram 追随者

从网站(instagram)获取 JSON

如何从 Instagram 网络浏览器中抓取关注者?

python 追随者提取Instagram

如何在网络上抓取喜欢 Instagram 图片的用户?