我才刚刚开始学习如何使用 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的情况下执行此操作,因为我将其与代码结合在一起以跟踪其他社交媒体平台。有提示吗?
答案 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个人资料的关注者数量:
获取个人资料页面,搜索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响应做任何奇怪的事情。
答案 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']