【问题标题】:Get instagram followers获取 Instagram 关注者
【发布时间】:2018-08-09 04:14:39
【问题描述】:

我想用 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 时为空。知道我做错了什么吗?

【问题讨论】:

标签: python beautifulsoup instagram screen-scraping


【解决方案1】:

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

【讨论】:

  • 非常感谢,就像一个魅力。介意解释使用 re 而不是 beautifulsoup 背后的逻辑吗?网络抓取还是新手,我认为 beautifulsoup 是最佳实践。
  • @calicationoflife 不知道你没有使用搅拌机的解决方案,他清楚地解释道。
  • @calicationoflife,beautifulsoup 无法抓取位于<script> 标签内的数据,因为它是.text 的形式。所以,bs4只能获取脚本文本,不能自行解析。
  • 在整个页面上执行正则表达式不是一个好主意。
  • @Keyur:我使用了 William 的解决方案,因为它更容易插入我已经拥有的剩余代码。但是非常感谢您的所有帮助!
【解决方案2】:

soup.find('head', attrs={'class':'count'}) 搜索看起来像 <head class="count"> 的东西,它在 HTML 的任何地方都不存在。您要查找的数据包含在以window._sharedData 开头的<script> 标记中:

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

【讨论】:

    【解决方案3】:

    大部分内容都是用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 '
    

    【讨论】:

      【解决方案4】:

      你必须寻找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}
      

      【讨论】:

        【解决方案5】:

        谢谢大家,我最终使用了威廉的解决方案。万一有人有未来的项目,这里是我为他们的追随者数量抓取一堆 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)
        

        【讨论】:

          猜你喜欢
          • 2019-03-07
          • 2019-07-11
          • 1970-01-01
          • 2014-08-13
          • 2017-09-23
          • 2022-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多