【问题标题】:Webscraping Instagram follower count BeautifulSoup网络抓取 Instagram 追随者数量 BeautifulSoup
【发布时间】:2023-03-06 09:13:01
【问题描述】:

我刚刚开始学习如何使用 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

标签: python web-scraping beautifulsoup instagram


【解决方案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 个人资料的关注者数量:

    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 响应做奇怪的事情。

    【讨论】:

      【解决方案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 转储到文本编辑器中,然后进行文本搜索以查找此人拥有的确切关注者数量。然后,您可以将包含该数字的元素归零。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-12
          • 1970-01-01
          • 2018-02-04
          • 2018-08-11
          • 2018-08-20
          • 1970-01-01
          • 1970-01-01
          • 2017-10-11
          相关资源
          最近更新 更多