获取Instagram粉丝
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取Instagram粉丝相关的知识,希望对你有一定的参考价值。
我想用BeautifulSoup解析一个网站的粉丝数量。这是我到目前为止:
username_extract = 'lazada_my'
url = 'https://www.instagram.com/'+ username_extract
r = requests.get(url)
soup = BeautifulSoup(r.content,'lxml')
f = soup.find('head', attrs={'class':'count'})
这是我要解析的部分:
我的soup.find()函数中的某些内容是错误的,但我无法绕过它。返回f时,它是空的。知道我做错了什么吗?
我认为你可以使用re模块来搜索正确的计数。
import requests
import re
username_extract = 'lazada_my'
url = 'https://www.instagram.com/'+ username_extract
r = requests.get(url)
m = re.search(r'"followed_by":{"count":([0-9]+)}', str(r.content))
print(m.group(1))
soup.find('head', attrs={'class':'count'})
搜索看起来像<head class="count">
的东西,它在html中的任何地方都不存在。您所追踪的数据包含在以<script>
开头的window._sharedData
标记中:
script = soup.find('script', text=lambda t: t.startswith('window._sharedData'))
从那里,您可以删除变量赋值和分号以获得有效的JSON:
# <script>window._sharedData = ...;</script>
# ^^^
# JSON
page_json = script.text.split(' = ', 1)[1].rstrip(';')
解析它,你需要的一切都包含在对象中:
import json
data = json.loads(page_json)
follower_count = data['entry_data']['ProfilePage'][0]['user']['followed_by']['count']
大多数内容是使用JS动态生成的。这就是你得到空洞结果的原因。
但是,followers
计数存在于页面源中。唯一的问题是,它不是以你想要的形式直接提供的。你可以在这里看到它:
<meta content="407.4k Followers, 27 Following, 2,740 Posts - See Instagram photos and videos from Lazada Malaysia (@lazada_my)" name="description" />
如果你想在没有正则表达式的情况下搜索关注者数量,你可以使用:
>>> followers = soup.find('meta', {'name': 'description'})['content']
>>> followers
'407.4k Followers, 27 Following, 2,740 Posts - See Instagram photos and videos from Lazada Malaysia (@lazada_my)'
>>> followers_count = followers.split('Followers')[0]
>>> followers_count
'407.4k '
你必须寻找scripts
,然后寻找其中的'window._sharedData'
出口。如果退出则执行正则表达式操作。
import re
username_extract = 'lazada_my'
url = 'https://www.instagram.com/'+ username_extract
r = requests.get(url)
soup = BeautifulSoup(r.content,'lxml')
s = re.compile(r'"followed_by":{"count":d*}')
for i in soup.find_all('script'):
if 'window._sharedData' in str(i):
print s.search(str(i.contents)).group()
结果,
"followed_by":{"count":407426}
谢谢大家,我最终使用了William的解决方案。如果有人有未来的项目,这里是我的完整代码,用于抓取一堆URL的跟随者计数:
import requests
import csv
import pandas as pd
import re
insta = pd.read_csv('Instagram.csv')
username = []
bad_urls = []
for lines in insta['Instagram'][0:250]:
lines = lines.split("/")
username.append(lines[3])
with open('insta_output.csv', 'w') as csvfile:
t = csv.writer(csvfile, delimiter=',') # ----> COMMA Seperated
for user in username:
try:
url = 'https://www.instagram.com/'+ user
r = requests.get(url)
m = re.search(r'"followed_by":{"count":([0-9]+)}', str(r.content))
num_followers = m.group(1)
t.writerow([user,num_followers]) # ----> Adding Rows
except:
bad_urls.append(url)
以上是关于获取Instagram粉丝的主要内容,如果未能解决你的问题,请参考以下文章
Android Jetpack Navigation、BottomNavigationView 与 Youtube 或 Instagram 类似正确的后退导航(片段后退堆栈)?