如何使用Python对Instagram进行数据分析?

我写此文的目的在于展示以编程的方式使用Instagram的基本方法。我的方法可用于数据分析、计算机视觉以及任何你所能想到的酷炫项目中。

Instagram是最大的图片分享社交媒体平台,每月活跃用户约五亿,每日有九千五百万的图片和视频被上传到Instagram。其数据规模巨大,具有很大的潜能。本文将给出如何将Instagram作为数据源而非一个平台,并介绍在项目中使用本文所给出的开发方法。

API和工具简介

Instagram提供了官方API,但是这些API有些过时,并且当前所提供的功能也非常有限。因此在本文中,我使用了LevPasha提供的非Instagram官方API。该API支持所有关键特性,例如点赞、加粉、上传图片和视频等。它使用Python编写,本文中我只关注数据端的操作。

我推荐使用Jupyter Notebook和IPython。使用官方Python虽然没有问题,但是它不提供图片显示等特性。

安装

你可以使用pip安装该软件库,命令如下:

python -m pip install -e git+https://github.com/LevPasha/Instagram-API-python.git#egg=InstagramAPI

如果系统中尚未安装ffmpeg,那么在Linux上,可以使用如下命令安装:

sudo apt-get install ffmpeg

对于Windows系统,需在Python解释器中运行如下命令:

import imageio 
 
imageio.plugins.ffmpeg.download()

下面使用API,实现登入Instragram:

from InstagramAPI import InstagramAPI 
 
username="YOURUSERNAME" 
 
InstagramAPI = InstagramAPI(username, "YOURPASSWORD") 
 
InstagramAPI.login()

如果登录成功,那么你会收到“登陆成功”的消息。

基本请求

做好上面的准备工作后,我们可以着手实现首次请求:

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时间线

下面让我们实现一些更有用的功能。我们将请求排在时间线最后的帖子,并在Jupyter Notebook中查看。

下面代码实现获取时间线:

1.InstagramAPI.timelineFeed()

类似于前面的请求实现,我们同样使用LastJson()查看结果。查看结果JSON数据,我们可以看到其中包括一系列称为“条目”的键值。列表中的每个元素保存了时间线上特定帖子的信息,其中包括如下元素:

[text]:保存了标题下的帖子文本内容,包括hashtag。

[likes]:帖子中的点赞数。

[created_at]:帖子创建时间。

[comments]:帖子的评论。

[image_versions]:保存有指向实际JPG文件的链接,可使用该链接在Jupyter Notebook中显示图片。

函数

函数Get_posts_from_list()和Get_url()在帖子列表上循环,查找每个帖子中的URL,并附加到我们的空列表中。

上述函数完成后,我们将得到一个URL列表,如下所示:

我们可以使用IPython.display模块查看图片,代码如下:

在IPython Notebook中查看图片是十分有用的功能,我们之后还会使用这些函数去查看结果,敬请继续。

获取最受欢迎的帖子

现在我们已经知道了如何发出基本请求,但是如何实现更复杂的请求呢?下面我们要做一些类似的事情,即如何获取我们的帖子中最受欢迎的。要实现这个目的,首先需要获取当前登录用户的所有帖子,然后将帖子按点赞数排序。

获取用户的所有帖子

要获取所有帖子,我们将使用next_max_id和more_avialable值在结果列表上执行循环。

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可以将任何变量序列化并保存到文件中,进而加载它们。下面给出一个工作例子:

保存:

import pickle 
filename=username+"_posts" 
pickle.dump(myposts,open(filename,"wb"))

加载:

import pickle 
 
filename="nourgalaby_posts" 
 
myposts=pickle.load(file=open(filename))

按点赞数排序

现在我们得到了一个名称为“myposts”的有序字典。要实现根据字典中的某个键值排序,我们可以使用Lambda表达式,代码如下:

myposts_sorted = sorted(myposts, key=lambda k: 
 
k['like_count'],reverse=True) 
 
top_posts=myposts_sorted[:10] 
 
bottom_posts=myposts_sorted[-10:]

如下代码可以实现和上面一样的显示:

image_urls=get_images_from_list(top_posts) 
 
display_images_from_url(image_urls)

过滤图片

我们可能想要对我们的帖子做一些过滤。例如,可能有的帖子中是视频,但是我们只想要图片帖子。我们可以这样做过滤:

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)

当然,你可以对结果中的任何变量做过滤,发挥你的创造力吧!

通知

InstagramAPI.getRecentActivity() 
get_recent_activity_response= InstagramAPI.LastJson  
for notifcation in get_recent_activity_response['old_stories']: 
    print notifcation['args']['text']

结果可能是:

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.

仅来自特定用户的通知

现在,我们可以按我们的要求操作并玩转通知。例如,我可以获得来自于特定用户的通知列表:

username="diana" 
for notifcation in get_recent_activity_response['old_stories']: 
    text = notifcation['args']['text'] 
    if username  in text: 
        print text

让我们尝试一些更有意思的操作,例如:得到你被点赞最多的时刻,一天中何时人们点赞最多。要实现这些操作,我们将绘制一个关系图,显示一天中的时刻和你所收到点赞数的关系。

下面的代码绘制了通知的时间日期:

import pandas as pd 
df = pd.DataFrame({"date":dates}) 
df.groupby(df["date"].dt.hour).count().plot(kind="bar",title="Hour" )

正如在此例中所看到的,我在下午六点到十点间得到的点赞最多。如果你了解社交媒体,你就会知道这是高峰使用时间,大多数企业选取此时间段发帖以获得最大的认可度。

获取粉丝和被粉列表

下面我将获取粉丝和跟帖列表,并在列表上执行一些操作。

要使用getUserFollowings和getUserFollowers这两个函数,你首先需要取得user_id。下面给出了一种获取user_id的方式:

现在你可以如下调用函数。注意,如果粉丝数量非常大,你需要做多次请求(下文将详细介绍)。现在我们做了一次请求去获取粉丝和被粉列表。JSON结果中给出了用户列表,其中包含每个粉丝和被粉者的信息。

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键值做迭代处理。

在此感谢Francesc Garcia所提供的支持。

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格式的所有粉丝和被粉者的列表数据。我将转化该列表为一种对用户更友好的数据类型,即集合,以方便在数据上做一系列的操作。

我只取其中的“username”键值,并在其上使用set()。

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”也可同样操作,并且结果更为用户友好。但是结果可能并非唯一,因为一些用户可能没有提供全名。

现在我们得到了两个集合。我们可以做如下操作:

这里我给出了粉丝的一些统计数字。你可以做很多事情,例如保存粉丝列表并稍后做对比,以了解掉粉的情况。

上面我们给出了可对Instagram数据进行的操作。我希望你已经学会了如何使用Instagram API,并具备了一些使用这些API可以做哪些事情的基本想法。敬请关注一下官方API,它们依然在开发中,未来你可以使用它们做更多的事情。如有任何疑问或建议,欢迎联系我。

END.

来源:数盟

原文发布于微信公众号 - PPV课数据科学社区(ppvke123)

原文发表时间:2017-09-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

应用容器化优化指南 - Golang篇

摘要: 前言 随着容器技术的兴起,越来越多不同类型的应用开始使用容器的方式进行交付。Golang作为服务器端非常热门的一门语言同时也是容器技术的主要编写语言备受...

1373
来自专栏Crossin的编程教室

这段代码实例,见证了数万人入门编程

我的微信 Python 教程里有两个比较重要的代码实例,一个是前期的“猜数字”,这个例子演示了基本的输入输出、运算、类型、逻辑,之后的扩展又涉及到函数、数据结构...

1273
来自专栏前端那些事

同步、异步、回调执行顺序之经典闭包setTimeout分析

聊聊同步、异步和回调 同步,异步,回调,我们傻傻分不清楚, 有一天,你找到公司刚来的程序员小T,跟他说:“我们要加个需求,你放下手里的事情优先支持,我会一直等你...

25410
来自专栏Golang语言社区

nodejs php go语言了解

1、Nodejs 1) 简单的说 Node.js 就是运行在服务端的 JavaScript。 2) Node.js 是一个基于Chrome JavaScript...

51311
来自专栏陈树义

JVM技术周报第2期

JVM技术周报分享JVM技术交流群的讨论内容,由群内成员整理归纳而成。如果你有兴趣入群讨论,请关注「Java技术精选」公众号,通过右下角菜单「入群交流」加我好友...

982
来自专栏FreeBuf

深入分析IE地址栏内容泄露漏洞

? 前言 在本文中,我们探讨的对象是IE浏览器,尽管该浏览器略显老态,但是其用户还是很多的,所以不容忽视。我最近对MSRC感到很欣喜,因为他们正在将工作重心移...

24410

使用Apache Flink进行流处理

如果在你的脑海里,“Apache Flink”和“流处理”没有很强的联系,那么你可能最近没有看新闻。Apache Flink已经席卷全球大数据领域。现在正是这样...

4292
来自专栏腾讯数据库技术

一个编译参数引发的血案

提示:公众号展示代码会自动折行,建议横屏阅读 问题描述 前几天进行测试,发现一个神奇的现象:不加任何优化的版本与加了-O2参数的版本测试结果不一致! 主要代...

1221
来自专栏Ryan Miao

如何优化coding

如何优化coding 前言 最近一直在做修改bug工作,修改bug花费时间最多的不是如何解决问题而是怎样快速读懂代码。如果代码写的好的,不用debug就可以一眼...

4097
来自专栏zingpLiu

Linux时间命令

Linux一般有系统时间和硬件时间之分,date命令是显示和操作系统时间;hwclock用来操作硬件时间(日期)。日期和时间很重要,比如错误的日期和时间会导致你...

2072

扫码关注云+社区

领取腾讯云代金券