获取Instagram粉丝

时间:2018-03-01 06:31:31

标签: python beautifulsoup instagram screen-scraping

我想用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'})

这是我要解析的部分:

enter image description here

我的soup.find()函数中的某些内容是错误的,但我无法绕过它。返回f时,它是空的。知道我做错了吗?

5 个答案:

答案 0 :(得分:3)

我认为您可以使用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))

答案 1 :(得分:2)

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']

答案 2 :(得分:1)

大多数内容是使用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 '

答案 3 :(得分:0)

您必须查找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}

答案 4 :(得分:0)

谢谢大家,我最终使用了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)