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

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

作者头像
小莹莹
发布于 2018-04-24 06:07:31
发布于 2018-04-24 06:07:31
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

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

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

API和工具简介

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

我推荐使用Jupyter Notebook和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解释器中运行如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import imageio 
 
imageio.plugins.ffmpeg.download()

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from InstagramAPI import InstagramAPI 
 
username="YOURUSERNAME" 
 
InstagramAPI = InstagramAPI(username, "YOURPASSWORD") 
 
InstagramAPI.login()

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

基本请求

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
InstagramAPI.getProfileData() 
 
result = InstagramAPI.LastJson
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{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中查看。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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值在结果列表上执行循环。

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

保存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pickle 
filename=username+"_posts" 
pickle.dump(myposts,open(filename,"wb"))

加载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pickle 
 
filename="nourgalaby_posts" 
 
myposts=pickle.load(file=open(filename))

按点赞数排序

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
image_urls=get_images_from_list(top_posts) 
 
display_images_from_url(image_urls)

过滤图片

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

代码语言:javascript
代码运行次数:0
运行
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)

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

通知

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
InstagramAPI.getRecentActivity() 
get_recent_activity_response= InstagramAPI.LastJson  
for notifcation in get_recent_activity_response['old_stories']: 
    print notifcation['args']['text']

结果可能是:

代码语言:javascript
代码运行次数:0
运行
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.

仅来自特定用户的通知

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
username="diana" 
for notifcation in get_recent_activity_response['old_stories']: 
    text = notifcation['args']['text'] 
    if username  in text: 
        print text

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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结果中给出了用户列表,其中包含每个粉丝和被粉者的信息。

代码语言:javascript
代码运行次数:0
运行
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键值做迭代处理。

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

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

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

代码语言:javascript
代码运行次数:0
运行
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”也可同样操作,并且结果更为用户友好。但是结果可能并非唯一,因为一些用户可能没有提供全名。

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

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

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

END.

来源:数盟

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

本文分享自 PPV课数据科学社区 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
web渗透测试—-33、HttpOnly[通俗易懂]
HttpOnly是微软公司的Internet Explorer 6 SP1引入的一项新特性。这个特性为cookie提供了一个新属性,用以阻止客户端脚本访问Cookie,至今已经称为一个标准,几乎所有的浏览器都会支持HttpOnly。 下面示例显示了HTTP响应标头中HttpOnly使用的语法:
全栈程序员站长
2022/09/07
2.7K0
tomcat源码解读六 tomcat中的session生命历程
     session的作用是在一次会话中(从打开浏览器到关闭浏览器同当前服务器的交流)当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个se
cfs
2018/03/08
1.5K0
tomcat源码解读六  tomcat中的session生命历程
JSP基础--会话跟踪技术、cookie、session
我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器了。从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束。在通话过程中,你会向10086发出多个请求,那么这多个请求都在一个会话中。
eadela
2019/09/29
9940
JSP基础--会话跟踪技术、cookie、session
浅谈Session与Cookie的区别与联系
一、Session的概念 Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session。 一般情况下,服务器会在一定时间内(默认30
mukekeheart
2018/07/04
3.1K0
Session会话与Cookie简单说明
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。经常有人会疑惑:Session会话与Cookies的区别是什么?用户登录的原理是什么?网站是如何认证的?它怎么知道是哪个用户从哪儿登录进来的?下面将对这些问题进行一一解答。
洗尽了浮华
2022/03/29
1.9K0
Session会话与Cookie简单说明
HttpSession详解「建议收藏」
  需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。
全栈程序员站长
2022/09/07
1.4K0
HttpSession详解「建议收藏」
会话跟踪技术-session
javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttSession对象中!
星哥玩云
2022/09/14
4250
会话跟踪技术-session
Session和Cookie和Filter和Listener(最全 最精美)
Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。 <session-config> <session-timeout>30</session-timeout> </session-config>
编程张无忌
2021/01/26
7720
Session和Cookie和Filter和Listener(最全 最精美)
Cookie 和 Session 的那点事!
我曾在HTTP文章中立下过这个flag,现在这篇就是来兑现的!温情提示,本文使用的测试浏览器为Firefox 83.0(64位)。
东边的大西瓜
2022/05/05
3700
Cookie 和 Session 的那点事!
开发中经常碰到的问题cookie和session问题,今天一并解决
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
好好学java
2018/09/21
3K0
开发中经常碰到的问题cookie和session问题,今天一并解决
javaWeb中cookie和session的区别和使用场景
说到cookie和session先从二者的英文单词含义说起,cookie翻译为中文是小饼干的意思,session翻译成中文是会话的意思。从翻译就能看出来,cookie是服务器返回给浏览器的一些断断续续的东西,而session是一种会话机制。那么为什么要用cookie和session呢? 因为Http协议是一种无状态协议,服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session,而session是如何实现状态保持的呢? ---- 这个时候cookie作用就体现出来了! 每次HT
神秘的寇先森
2018/05/30
6410
一文搞明白Cookie、Session与Token
HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性
中龙技术
2022/09/30
1.7K0
一文搞明白Cookie、Session与Token
Session、Cookie、Token三者关系理清了吊打面试官
HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。
淘课之家
2020/04/09
2.2K0
Session、Cookie、Token三者关系理清了吊打面试官
javaWeb核心技术第八篇之Cookie和Session
会话技术: 会话是什么? 浏览器和服务器交互,浏览器打开网页访问服务器,会话开始,正常交互. 浏览器关闭,会话结束. 会话能干什么? 会话可以共享数据. Cook
海仔
2019/08/26
8180
session和cookie的区别和联系
大家都知道,session是存储在服务器端的,cookie是存储在客户端的,session依赖于cookie。
用户2141593
2019/02/20
7720
JavaWeb(二)会话管理之细说cookie与session
前言   前面花了几篇博客介绍了Servlet,讲的非常的详细。这一篇给大家介绍一下cookie和session。 一、会话概述 1.1、什么是会话?   会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。   一次会话指的是:就好比打电话,A给B打电话,接通之后,会话开始,直到挂断电话,该次会话就结束了,而浏览器访问服务器,就跟打电话一样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,   其中不管浏览器发送多少请求(就相
用户1195962
2018/01/18
1.4K0
JavaWeb(二)会话管理之细说cookie与session
Java学习之Cookie与Session篇
Cookie 和Session 不同的地方是 cookie是存在于客户端,而session是存在于服务器上。
全栈程序员站长
2022/07/13
1460
Cookie 和 Session 机制原理分析 & 区别对比
Web application servers are generally "stateless":
一个会写诗的程序员
2018/09/12
1.2K0
26. 会话技术-Session的使用
可以通过获取的 session ID 信息,我们可以知道 session 是同一个的。
Devops海洋的渔夫
2021/11/19
1.1K0
26. 会话技术-Session的使用
Spring Mvc boot解决静态url带jsessionid问题
Jsessionid只是tomcat的对sessionid的叫法,其实就是sessionid;在其它的容器也许就不叫jsessionid了。
王念博客
2019/07/24
3.2K0
相关推荐
web渗透测试—-33、HttpOnly[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档