我写此文的目的在于展示以编程的方式使用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 imageioimageio.plugins.ffmpeg.download()下面使用API,实现登入Instragram:from InstagramAPI import InstagramAPIusername="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中查看。下面代码实现获取时间线: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 timemyposts=[]has_more_posts = Truemax_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 picklefilename=username+"_posts"pickle.dump(myposts,open(filename,"wb"))加载:import picklefilename="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 pddf = pd.DataFrame({"date":dates})df.groupby(df["date"].dt.hour).count().plot(kind="bar",title="Hour" )(点击放大图像)正如在此例中所看到的,我在下午六点到十点间得到的点赞最多。如果你了解社交媒体,你就会知道这是高峰使用时间,大多数企业选取此时间段发帖以获得最大的认可度。获取粉丝和被粉列表下面我将获取粉丝和跟帖列表,并在列表上执行一些操作。要使用getUserFollowings和getUserFollowers这两个函数,你首先需要取得user_id。下面给出了一种获取user_id的方式:(点击放大图像)现在你可以如下调用函数。注意,如果粉丝数量非常大,你需要做多次请求(下文将详细介绍)。现在我们做了一次请求去获取粉丝和被粉列表。JSON结果中给出了用户列表,其中包含每个粉丝和被粉者的信息。hjd1956.com 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 timefollowers   = []next_max_id = Truewhile 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()。 hjdseo.cn 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,它们依然在开发中,未来你可以使用它们做更多的事情。如有任何疑问或建议,欢迎联系我。 

如何使用Python对Instagram进行数据分析?的更多相关文章

  1. Python在金融,数据分析,和人工智能中的应用

    Python在金融,数据分析,和人工智能中的应用   Python最近取得这样的成功,而且未来似乎还会继续下去,这有许多原因.其中包括它的语法.Python开发人员可用的科学生态系统和数据分析库.易于 ...

  2. 基于 Python 和 Pandas 的数据分析(4) --- 建立数据集

    这一节我想对使用 Python 和 Pandas 的数据分析做一些扩展. 假设我们是亿万富翁, 我们会想要多元化地进行投资, 比如股票, 分红, 金融市场等, 那么现在我们要聚焦房地产市场, 做一些这 ...

  3. 基于 Python 和 Pandas 的数据分析(2) --- Pandas 基础

    在这个用 Python 和 Pandas 实现数据分析的教程中, 我们将明确一些 Pandas 基础知识. 加载到 Pandas Dataframe 的数据形式可以很多, 但是通常需要能形成行和列的数 ...

  4. 基于 Python 和 Pandas 的数据分析(1)

    基于 Python 和 Pandas 的数据分析(1) Pandas 是 Python 的一个模块(module), 我们将用 Python 完成接下来的数据分析的学习. Pandas 模块是一个高性 ...

  5. 预备知识-python核心用法常用数据分析库(上)

    1.预备知识-python核心用法常用数据分析库(上) 目录 1.预备知识-python核心用法常用数据分析库(上) 概述 实验环境 任务一:环境安装与配置 [实验目标] [实验步骤] 任务二:Pan ...

  6. Python金融应用编程(数据分析、定价与量化投资)

    近年来,金融领域的量化分析越来越受到理论界与实务界的重视,量化分析的技术也取得了较大的进展,成为备受关注的一个热点领域.所谓金融量化,就是将金融分析理论与计算机编程技术相结合,更为有效的利用现代计算技 ...

  7. 功能式Python中的探索性数据分析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 这里有一些技巧来处理日志文件提取.假设我们正在查看一些Enterprise Splunk提取.我们可以用Splunk来探索数据.或者我们可以 ...

  8. 基于 Python 和 Pandas 的数据分析(3) --- 输入/输出 基础

    这一节, 我们要讨论 Pandas 的输入与输出, 并且应用在现实的实际例子中. 为了得到大量的数据, 向大家推荐一个网站 Quandl. Quandl 有很多免费和付费的资源. 这个网站最大的优势在 ...

  9. Python + Apache Kylin 让数据分析更加简单!

    现如今,大数据.数据科学和机器学习不仅是技术圈的热门话题,也是当今社会的重要组成.数据就在每个人身边,同时每天正以惊人的速度快速增长,据福布斯报道:到 2025 年,每年将产生大约 175 个 Zet ...

随机推荐

  1. 保存网格(mesh)到磁盘上

    Unity提供了很方便的工具来保存mesh之类的,下面的代码挂在GameObject上后,按下F键能把mesh(该GameObject必须有mesh组件)保存到磁盘的Assets目录下.在磁盘上是.a ...

  2. 【css】gradient匹配ps渐变叠加效果

    CSS3 Gradient分为linear-gradient(线性渐变)和radial-gradient(径向渐变). 一.linear-gradient(线性渐变) eg:background: l ...

  3. Codeforces round 1103

    Div1 534 我可能还太菜了.jpg 果然我只是Div 2 选手 A (这题是Div1吗... 直接构造:竖着放的在第一行和第二行,然后横着放的时候直接放在第三行就行. #include < ...

  4. Dsu on Tree

    这个属于一种技巧,可以解决类似于子树询问无修改可离线的问题,一些点分治的问题也可以用Dsu on Tree解决,并且常数较小,代码复杂度低,很具有可写性. 整体上的意思就是继承重儿子的信息,暴力修改轻 ...

  5. 20155306 白皎 0day漏洞——漏洞利用原理之GS

    20155306 白皎 0day漏洞--漏洞利用原理之GS 一.GS安全编译选项的保护原理 1.1 GS的提出 在第二篇博客(栈溢出利用)中,我们可以通过覆盖函数的返回地址来进行攻击,面对这个重灾区, ...

  6. 【转载】WINAPI宏

    原文:http://blog.sina.com.cn/s/blog_3f27dee60100qi4j.html 一直搞不懂为什么在函数前面加上WINAPI.CALLBACK等是什么意思 又不是返回值 ...

  7. 一个可以代替冗长switch-case的消息分发小框架

    在项目中,我需要维护一个应用层的字节流协议.这个协议的每条报文都是一个字节数组,数组的头两个字节表示消息的传送方向,第三.四个字节表示消息ID,也就是消息种类,再往后是消息内容.时间戳.校验码等……整 ...

  8. 自制一个H5图片拖拽、裁剪插件(原生JS)

    前言 如今的H5运营活动中,有很多都是让用户拍照或者上传图片,然后对照片加滤镜.加贴纸.评颜值之类的.尤其是一些拍照软件公司的运营活动几乎全部都是这样的. 博主也做过不少,为了省事就封装了一个简单的图 ...

  9. 3.3V电源LDO

    1:今天用到1颗3.3v的LDO,如图 输入输出都是3.3V,但是一个是做模拟电压,以后遇到这种情况可以这样使用. 2:二极管降压电路,1.8V转1.5V

  10. fiddler之会话数据的修改

    fiddler之会话数据的修改 fiddler记录http的请求,并且针对特定的http请求,可以分析请求数据.修改数据.调试web系统等,功能十分强大.本篇主要讲两种修改的数据的方法,断点和Unlo ...