我写这篇文章的目的是展示以编程方式使用Instagram的基础知识。我的方法可以用于数据分析、计算机视觉以及您能想到的任何其他很酷的项目。Instagram是最大的照片分享社交媒体平台,月活跃用户约5亿,每天有9500万张图片和视频上传到Instagram。其数据量巨大,潜力巨大。本文将展示如何使用Instagram作为数据源而不是平台,并在项目中介绍本文给出的开发方法。API和工具介绍Instagram提供官方API,但这些API有些过时,目前提供的功能非常有限。所以在本文中,我使用了LevPasha提供的非官方InstagramAPI。该API支持所有关键功能,如点赞、关注、上传图片和视频等。它是用Python编写的,在本文中我只关注数据端操作。我推荐JupyterNotebook和IPython。虽然使用官方的Python没有问题,但是没有提供图片显示等功能。安装可以使用pip安装软件库,命令如下:python-mpipinstall-egit+https://github.com/LevPasha/Instagram-API-python.git#egg=InstagramAPI如果没有安装ffmpeg在系统中,然后在LinuxWindows上,可以使用以下命令安装:sudoapt-getinstallffmpeg对于Windows系统,需要在Python解释器中运行以下命令:importimageioimageio.plugins.ffmpeg.download()接下来,使用登录Instragram的API:fromInstagramAPIimportInstagramAPIusername="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'NourGalaby',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时间线让我们在下面实现一些更有用的功能。我们将请求时间线中的最后一篇文章,并在JupyterNotebook中查看它。下面的代码实现了获取时间线:InstagramAPI.timelineFeed()和前面的请求实现类似,我们同样使用LastJson()查看结果。查看生成的JSON数据,我们可以看到它包含一系列称为“条目”的键值。列表中的每个元素保存了时间线上特定帖子的信息,包括以下元素:[text]:保存标题下帖子的文本内容,包括hashtag。[喜欢]:帖子中的喜欢数量。[created_at]:发布创建时间。[评论]:对帖子的评论。[image_versions]:包含指向实际JPG文件的链接,可用于在JupyterNotebook中显示图像。函数Get_posts_from_list()和Get_url()函数循环遍历帖子列表,在每个帖子中找到URL,并将其附加到我们的空列表中。以上功能完成后,我们会得到一个url列表,如下图:我们可以使用IPython.display模块来查看图片,代码如下:在IPythonNotebook中查看图片是一个非常有用的功能,我们稍后会使用这些功能查看结果,请继续。获取最受欢迎的帖子现在我们知道如何提出基本请求,那么更复杂的请求呢?接下来我们将做类似的事情,如何获得最受欢迎的帖子。为此,首先需要获取当前登录用户的所有帖子,然后按照点赞数对帖子进行排序。获取用户的所有帖子要获取所有帖子,我们将使用next_max_id和more_avialable值对结果列表执行循环。importtimemyposts=[]has_more_posts=Truemax_id=""whilehas_more_posts:InstagramAPI.getSelfUserFeed(maxid=max_id)ifInstagramAPI.LastJson['more_available']isnotTrue:has_more_posts=False#stopconditionprint"停止"max_id=InstagramAPI.LastJson.getid(',next_max'')myposts.extend(InstagramAPI.LastJson['items'])#mergeliststime.sleep(2)#Slowsthescriptdowntoavoidfloodingtheserversprintlen(myposts)保存并加载数据到磁盘,因为上面的请求可能需要很长时间才能完成,我们不想运行当您不需要时,最好保存结果并在您继续工作时再次加载它们。为此,我们将使用Pickle。Pickle可以将任何变量序列化并保存到文件中,然后加载它们。下面给出了一个工作示例:保存:importpicklefilename=username+"_posts"pickle.dump(myposts,open(filename,"wb"))加载:importpicklefilename="nourgalaby_posts"myposts=pickle.load(file=open(filename))按喜欢排序现在我们有一个名为“myposts”的有序字典。要实现根据字典中的键值排序,我们可以使用Lambda表达式,代码如下:10]bottom_posts=myposts_sorted[-10:]下面的代码可以实现和上面一样的显示:image_urls=get_images_from_list(top_posts)display_images_from_url(image_urls)filterimages我们可能想对我们的帖子做一些过滤。例如,某些帖子中可能有视频,但我们只想要图片帖子。我们可以这样过滤:printlen(myposts_vids)当然,您可以过滤结果中的任何变量,发挥您的创造力!NotifyInstagramAPI.getRecentActivity()get_recent_activity_response=InstagramAPI.LastJsonfornotifcationinget_recent_activity_response['old_stories']:printnotifcation['args']['text']结果可能是:userohamed3likedyourpost.userhacker32likedyourpost.user22likedyourpost.userz77likedyourpost.userwww77startedourpost2user2user22you仅来自特定用户的通知现在我们可以根据需要操作和使用通知。例如,我可以获得来自特定用户的通知列表:示例:获取您最喜欢的时刻,人们最喜欢一天中的什么时间。为此,我们将绘制一张图表,显示一天中的时间与您收到的点赞数的关系。以下代码绘制了通知的时间和日期:importpandasaspddf=pd.DataFrame({"date":dates})df.groupby(df["date"].dt.hour).count().plot(kind="bar",title="Hour")如您在此示例中所见,我在下午6点到晚上10点之间获得最多点赞。如果您对社交媒体有所了解,就会知道这是使用高峰期,大多数企业选择发帖以获得最大认可度的时间。获取关注者和关注者列表接下来我将获取关注者和关注者列表,并对列表进行一些操作。要使用getUserFollowings和getUserFollowers函数,您首先需要获取user_id。下面给出了一种获取user_id的方法:现在您可以按如下方式调用该函数。请注意,如果关注者的数量非常多,您将需要发出多个请求(详见下文)。现在我们请求获取粉丝和追随者的列表。JSON结果给出了一个用户列表,其中包含每个关注者和关注者的信息。InstagramAPI.getUserFollowings(user_id)printlen(InstagramAPI.LastJson['users'])following_list=InstagramAPI.LastJson['users']InstagramAPI.getUserFollowers(user_id)printlen(InstagramAPI.LastJson['users'])followers_list=InstagramAPI.LastJson['users']如果关注者数量很大,结果可能不是完整的列表。获取所有关注者获取所有关注者的列表类似于获取所有帖子。我们将发出请求,然后使用next_max_id键遍历结果。感谢FrancescGarcia的支持。importtimefollowers=[]next_max_id=Truewhilenext_max_id:printnext_max_id#firstiterationhackifnext_max_id==True:next_max_id=''=InstagramAPI.getUserFollowers(user_id,maxid=next_max_id)followers.extend(InstagramAPI.LastJson.get('用户',[]))next_max_id=InstagramAPI.LastJson.get('next_max_id','')time.sleep(1)followers_list=followers可以为关注者列表做同样的事情,但我不这样做,因为在我的情况下,一个请求就足够了Get我所有的追随者。现在我们以JSON格式获取所有关注者和关注者的列表数据。我会将列表转换为一种更方便用户使用的数据类型,即集合,以方便对数据进行一系列操作。我只是在其中获取“用户名”键值并在其上使用set()。user_list=map(lambdax:x['username'],following_list)following_set=set(user_list)printlen(following_set)user_list=map(lambdax:x['username'],followers_list)followers_set=set(user_list)printlen(followers_set)这里我选择了所有用户名的集合。对“full_name”也可以这样做,结果更加人性化。但结果可能不是唯一的,因为有些用户可能没有提供全名。现在我们得到两个集合。我们可以这样做:这里我给出一些粉丝的统计数据。您可以做很多事情,例如保存您的关注者列表并稍后进行比较以查看您的关注者下降情况。上面我们给出了可以对Instagram数据执行的操作。我希望您已经学会了如何使用InstagramAPI,并且对您可以用它做什么有一些基本的了解。请关注官方API,它们还在开发中,未来你可以用它们做更多的事情。如果您有任何问题或建议,请与我联系。
