前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用Python对Instagram进行数据分析

使用Python对Instagram进行数据分析

作者头像
AiTechYun
发布于 2018-03-02 09:45:08
发布于 2018-03-02 09:45:08
3K00
代码可运行
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号
运行总次数:0
代码可运行

Instagram是最大的照片分享社交媒体平台,每月有5亿活跃用户,每天会上传9500万张照片和视频到Instagram上。它有大量的数据和巨大的潜力。这篇文章将教会你如何使用Instagram作为数据的来源,以及如何将它作为你的项目的开发者。

关于API和工具

Instagram有一个官方的API,但它已经过时了,目前在你能用它做的事情非常有限。因此,在这篇文章中,我将使用LevPasha的非官方Instagram API,它支持所有的主要功能,如follow,上传照片和视频等。它是用Python编写的。

我推荐使用Jupyter笔记本和IPython。普通的python运行良好,但可能没有显示图像的功能。

安装

你可以使用pip来安装库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python-m pip install-e git+https://github.com/LevPasha/Instagram-API-python.git#egg=InstagramAPI

你可能需要ffmpeg。在Linux上安装它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install ffmpeg

对于Windows,在Python解释器中运行它

代码语言:js
AI代码解释
复制
import imageio
imageio.plugins.ffmpeg.download()

使用API登录到Instagram

代码语言:js
AI代码解释
复制
from InstagramAPIimport InstagramAPI
username="YOURUSERNAME"
InstagramAPI= InstagramAPI(username,"YOURPASSWORD")
InstagramAPI.login()

如果登录成功,你会收到“登录成功”的提示信息。

简单请求

有了这些,就从我们的第一个请求开始:

代码语言:js
AI代码解释
复制
InstagramAPI.getProfileData()
result= InstagramAPI.LastJson
{u'status': u'ok',
 u'user': {u'biography': u'',
  u'birthday':None,
  u'country_code':20,
  u'email': aaa@hotmail.com',
  u'external_url': u'',
  u'full_name': u'Nour Galaby',
  u'gender':1,
  u'has_anonymous_profile_picture':False,
  u'hd_profile_pic_url_info': {u'height':1080,
   u'url': u'https://instagram.fcai2-1.fna.fbcdn.net/t51.2885-1aaa7448121591_1aa.jpg',
   u'width':1080},
  u'hd_profile_pic_versions': [{u'height':320,
    u'url': u'https://instagram.fcai2-1.fna.fbcdn.net/t51.2885-19/s320x320/19aa23237_4337448121591_195310aaa32_a.jpg',
    u'width':320},
   {u'height':640,
    u'url': u'https://instagram.fcai2-1.fna.fbcdn.net/t51.2885-19/s640x640/19623237_45581744812153_44_a.jpg',
    u'width':640}],
  u'is_private':True,
  u'is_verified':False,
  u'national_number':122,
  u'phone_number': u'+201220',
  u'pk':22412229,
  u'profile_pic_id': u'1550239680720880455_22',
  u'profile_pic_url': u'https://instagram.fcai2-1.fna.fbcdn.net/t51.2885-19/s150x150/19623237_455817448121591_195310166162_a.jpg',
  u'show_conversion_edit_entry':False,
  u'username': u'nourgalaby'}}

正如你所看到的,结果是JSON 格式,包含了所有的请求数据

你可以以键/值方式访问它。例如:

你可以使用任何先进的查看工具(Notepad++)查看JSON并研究它。

获得并查看Instagram时间线

现在让我们做一些更有趣的事情。我们请求时间线上最后的帖子,并在我们的笔记本上查看。

有了这条线,你就可以得到时间线:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
InstagramAPI.timelineFeed()

并且类似于先前的请求,我们将使用LastJson()来查看结果。通过检查生成的JSON,我们可以看到它包含一个名为“items”的键。 该列表中的每个单元包含有关时间轴中特定帖子的信息,包括以下单元:

  • [text] – 标题的文本值保存在帖子下面,包括标签
  • [likes] – 点赞的数量
  • [created_at] – 创建帖子的日期
  • [comments] – 发表评论
  • [image_versions] – 包含实际JPG文件的链接,我们可以在Jupyter笔记本上显示它。

功能

Get_posts_from_list()和Get_url()将循环访问帖子列表,找到每个帖子的URL并将其添加到空列表中:

完成后,我们应该有如下的URL列表:

我们可以使用Ipython.display模块查看图片,显示如下

在笔记本中查看图像是非常有用的,我们稍后将使用这些函数来查看我们的结果,正如你将看到的那样。

获得帖子排行榜

我们需要得到我们最喜欢的帖子。为了做到这一点,首先我们需要在你的用户配置文件中获得所有的帖子,然后根据点赞的数量对它们进行排序。

获得所有用户的帖子

为了获得所有的帖子,我们将使用next_max_id和more_avialabl的值循环访问结果列表。

代码语言:js
AI代码解释
复制
import time
myposts=[]
has_more_posts= True
max_id=""

while has_more_posts:
    InstagramAPI.getSelfUserFeed(maxid=max_id)
    if InstagramAPI.LastJson['more_available']is not True:
        has_more_posts= False #stop condition
        print "stopped"

    max_id= InstagramAPI.LastJson.get('next_max_id','')
    myposts.extend(InstagramAPI.LastJson['items'])#merge lists
    time.sleep(2)# Slows the script down to avoid flooding the servers

print len(myposts)

保存/加载数据到磁盘上

请求可能会花费很长一段时间,所以不必要的时候我们不会运行它。但当我们持续工作的时候,保存结果并加载它们是一种不错的方法。为此,我们将使用Pickle。Pickle可以序列化任何变量,将其保存到文件中,然后加载它。这里有一个例子说明它是如何工作的。

保存:

代码语言:js
AI代码解释
复制
import pickle
filename=username+"_posts"
pickle.dump(myposts,open(filename,"wb"))

加载:

代码语言:js
AI代码解释
复制
import pickle
filename="nourgalaby_posts"
myposts=pickle.load(file=open(filename))

按点赞数量排序

现在我们有了一个名为“myposts”的字典的列表。由于我们要按照字典内的某个键对它进行排序,我们可以这样使用lambda表达式:

代码语言:js
AI代码解释
复制
myposts_sorted= sorted(myposts, key=lambda k:
k['like_count'],reverse=True)
top_posts=myposts_sorted[:10]
bottom_posts=myposts_sorted[-10:]

然后显示它们

代码语言:js
AI代码解释
复制
image_urls=get_images_from_list(top_posts)
display_images_from_url(image_urls)

过滤照片

我们可能想把一些过滤器应用到我们的帖子列表中。例如,我只想要图片,但在帖子中有视频,,我可以这样过滤:

代码语言:js
AI代码解释
复制
myposts_photos= filter(lambda k: k['media_type']==1, myposts)
myposts_vids= filter(lambda k: k['media_type']==2, myposts)
print len(myposts)
print len(myposts_photos)
print len(myposts_vids)

当然,你可以对结果中的任何变量应用过滤器。

通知

代码语言:js
AI代码解释
复制
InstagramAPI.getRecentActivity()
get_recent_activity_response= InstagramAPI.LastJson
for notifcationin get_recent_activity_response['old_stories']:
    print notifcation['args']['text']

你可以看见一些东西,比如

代码语言:js
AI代码解释
复制
userohamed3 liked your post.
userhacker32 liked your post.
user22 liked your post.
userz77 liked your post.
userwww77 started following you.
user2222 liked your post.
user23553 liked your post.

只有一个用户的通知

在这一点上,我们可以像我们希望的那样操作和播放通知。例如,我可以得到只有一个特定用户的通知列表:

代码语言:js
AI代码解释
复制
username="diana"
for notifcationin get_recent_activity_response['old_stories']:
    text= notifcation['args']['text']
    if username in text:
        print text

我们尝试一些更有趣的东西:让我们看看你最喜欢的时间,和一天中人们最喜欢的时间。为了完成这件事,我们需要绘图。

代码语言:js
AI代码解释
复制
import pandas as pd
df= pd.DataFrame({"date":dates})
df.groupby(df["date"].dt.hour).count().plot(kind="bar",title="Hour" )

正如你所看到的,最受欢迎的时间段是18:00-22:00,如果你使用社交媒体,你就会知道这是一个社交媒体使用的高峰时间,大多数公司选择这个时间发布消息以获得最多的参与。

获得跟踪用户和跟踪列表

我将获得跟踪用户和跟踪列表,并对其进行一些操作。为了使用getUserFollowings和getUserFollowers这两个函数,你需要先获取user_id。你可以这样获取user_id:

现在你可以简单地使用以下功能。请注意,如果跟踪用户数量很多,你需要执行多个请求(下一个更多)。在这里,我们提出了一个请求来获得跟踪用户/跟踪列表。JSON结果包含“用户”列表,其中包含每个跟踪用户/跟踪列表的所有信息。

代码语言:js
AI代码解释
复制
InstagramAPI.getUserFollowings(user_id)
print len(InstagramAPI.LastJson['users'])
following_list=InstagramAPI.LastJson['users']

InstagramAPI.getUserFollowers(user_id)
print len(InstagramAPI.LastJson['users'])
followers_list=InstagramAPI.LastJson['users']

如果数量很大,这个结果可能没有完整的集合。

获取所有的跟踪用户

获得跟踪用户的列表类似于得到所有的帖子。我们将发出一个请求,然后使用next_max_id键进行迭代:

代码语言:js
AI代码解释
复制
import time

followers  = []
next_max_id= True
while next_max_id:
    print next_max_id
    #first iteration hack
    if next_max_id== True: next_max_id=''
    _= InstagramAPI.getUserFollowers(user_id,maxid=next_max_id)
    followers.extend ( InstagramAPI.LastJson.get('users',[]))
    next_max_id= InstagramAPI.LastJson.get('next_max_id','')
    time.sleep(1)

followers_list=followers

你应该重复同样的操作以得到跟踪列表,但在这种情况下,我不会这样做,因为一个请求就已经做够得到我案例中所有的跟踪列表。

现在,我们有了一个JSON格式的跟踪用户和跟踪列表的所有数据,我将把它们转换成更友好的数据类型–set–,以便对它们执行一些设置操作。

我会使用 ‘username’并从中创建set()。

代码语言:js
AI代码解释
复制
user_list= map(lambda x: x['username'] , following_list)
following_set= set(user_list)
print len(following_set)

user_list= map(lambda x: x['username'] , followers_list)
followers_set= set(user_list)
print len(followers_set)

在这里,我为每个用户创建一组保护用户名。“full_name”也可以工作,而且更友好,但一些用户可能不具有full_name的值。

现在我们有了两个集合,进行下面的操作:

我们有一些关于跟踪用户的统计数据。你可以从这一点做很多事情,例如保存跟踪列表,然后在稍后的时间比较它以获得unfollower的列表。

这些都是你可以用Instagram数据做的事情。我希望你学会如何使用Instagram的API,并知道能用它做什么。保持独创性的眼光,因为它还在发展中,将来你还可以做更多的事情。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于API和工具
  • 安装
  • 使用API登录到Instagram
  • 简单请求
  • 获得并查看Instagram时间线
  • 功能
  • 获得帖子排行榜
  • 获得所有用户的帖子
  • 保存/加载数据到磁盘上
  • 按点赞数量排序
  • 过滤照片
  • 通知
  • 只有一个用户的通知
  • 获得跟踪用户和跟踪列表
  • 获取所有的跟踪用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档