偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何使用Python對(duì)Instagram進(jìn)行數(shù)據(jù)分析?

開(kāi)發(fā) 后端 數(shù)據(jù)分析
Instagram是最大的圖片分享社交媒體平臺(tái),每月活躍用戶約五億,每日有九千五百萬(wàn)的圖片和視頻被上傳到Instagram。其數(shù)據(jù)規(guī)模巨大,具有很大的潛能。本文將給出如何將Instagram作為數(shù)據(jù)源而非一個(gè)平臺(tái),并介紹在項(xiàng)目中使用本文所給出的開(kāi)發(fā)方法。

[[205045]]

我寫此文的目的在于展示以編程的方式使用Instagram的基本方法。我的方法可用于數(shù)據(jù)分析、計(jì)算機(jī)視覺(jué)以及任何你所能想到的酷炫項(xiàng)目中。

Instagram是最大的圖片分享社交媒體平臺(tái),每月活躍用戶約五億,每日有九千五百萬(wàn)的圖片和視頻被上傳到Instagram。其數(shù)據(jù)規(guī)模巨大,具有很大的潛能。本文將給出如何將Instagram作為數(shù)據(jù)源而非一個(gè)平臺(tái),并介紹在項(xiàng)目中使用本文所給出的開(kāi)發(fā)方法。

API和工具簡(jiǎn)介

Instagram提供了官方API,但是這些API有些過(guò)時(shí),并且當(dāng)前所提供的功能也非常有限。因此在本文中,我使用了LevPasha提供的非Instagram官方API。該API支持所有關(guān)鍵特性,例如點(diǎn)贊、加粉、上傳圖片和視頻等。它使用Python編寫,本文中我只關(guān)注數(shù)據(jù)端的操作。

我推薦使用Jupyter Notebook和IPython。使用官方Python雖然沒(méi)有問(wèn)題,但是它不提供圖片顯示等特性。

安裝

你可以使用pip安裝該軟件庫(kù),命令如下:

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

如果系統(tǒng)中尚未安裝ffmpeg,那么在Linux上,可以使用如下命令安裝:

  1. sudo apt-get install ffmpeg 

對(duì)于Windows系統(tǒng),需在Python解釋器中運(yùn)行如下命令:

  1. import imageio 
  2.  
  3. imageio.plugins.ffmpeg.download()  

下面使用API,實(shí)現(xiàn)登入Instragram: 

  1. from InstagramAPI import InstagramAPI 
  2.  
  3. username="YOURUSERNAME" 
  4.  
  5. InstagramAPI = InstagramAPI(username, "YOURPASSWORD"
  6.  
  7. InstagramAPI.login()  

如果登錄成功,那么你會(huì)收到“登陸成功”的消息。

基本請(qǐng)求

做好上面的準(zhǔn)備工作后,我們可以著手實(shí)現(xiàn)首次請(qǐng)求:

  1. InstagramAPI.getProfileData() 
  2.  
  3. result = InstagramAPI.LastJson  
  1. {u'status': u'ok'
  2.  u'user': {u'biography': u''
  3.   u'birthday': None, 
  4.   u'country_code': 20, 
  5.   u'email': aaa@hotmail.com', 
  6.   u'external_url': u''
  7.   u'full_name': u'Nour Galaby'
  8.   u'gender': 1, 
  9.   u'has_anonymous_profile_picture'False
  10.   u'hd_profile_pic_url_info': {u'height': 1080, 
  11.    u'url': u'https://instagram.fcai2-1.fna.fbcdn.net/t51.2885-1aaa7448121591_1aa.jpg'
  12.    u'width': 1080}, 
  13.   u'hd_profile_pic_versions': [{u'height': 320, 
  14.     u'url': u'https://instagram.fcai2-1.fna.fbcdn.net/t51.2885-19/s320x320/19aa23237_4337448121591_195310aaa32_a.jpg'
  15.     u'width': 320}, 
  16.    {u'height': 640, 
  17.     u'url': u'https://instagram.fcai2-1.fna.fbcdn.net/t51.2885-19/s640x640/19623237_45581744812153_44_a.jpg'
  18.     u'width': 640}], 
  19.   u'is_private'True
  20.   u'is_verified'False
  21.   u'national_number': 122, 
  22.   u'phone_number': u'+201220'
  23.   u'pk': 22412229, 
  24.   u'profile_pic_id': u'1550239680720880455_22'
  25.   u'profile_pic_url': u'https://instagram.fcai2-1.fna.fbcdn.net/t51.2885-19/s150x150/19623237_455817448121591_195310166162_a.jpg'
  26.   u'show_conversion_edit_entry'False
  27.   u'username': u'nourgalaby'}}  

如上所示,結(jié)果是以JSON格式給出的,其中包括了所有請(qǐng)求的數(shù)據(jù)。

你可以使用正常的鍵值方式訪問(wèn)結(jié)果數(shù)據(jù)。例如:

 

你也可以使用工具(例如Notepad++)查看JSON數(shù)據(jù),并一探究竟。

獲取并查看Instagram時(shí)間線

下面讓我們實(shí)現(xiàn)一些更有用的功能。我們將請(qǐng)求排在時(shí)間線最后的帖子,并在Jupyter Notebook中查看。

下面代碼實(shí)現(xiàn)獲取時(shí)間線:

  1. InstagramAPI.timelineFeed() 

類似于前面的請(qǐng)求實(shí)現(xiàn),我們同樣使用LastJson()查看結(jié)果。查看結(jié)果JSON數(shù)據(jù),我們可以看到其中包括一系列稱為“條目”的鍵值。列表中的每個(gè)元素保存了時(shí)間線上特定帖子的信息,其中包括如下元素:

  • [text]:保存了標(biāo)題下的帖子文本內(nèi)容,包括hashtag。
  • [likes]:帖子中的點(diǎn)贊數(shù)。
  • [created_at]:帖子創(chuàng)建時(shí)間。
  • [comments]:帖子的評(píng)論。
  • [image_versions]:保存有指向?qū)嶋HJPG文件的鏈接,可使用該鏈接在Jupyter Notebook中顯示圖片。

函數(shù)

函數(shù)Get_posts_from_list()和Get_url()在帖子列表上循環(huán),查找每個(gè)帖子中的URL,并附加到我們的空列表中。

上述函數(shù)完成后,我們將得到一個(gè)URL列表,如下所示:

 

我們可以使用IPython.display模塊查看圖片,代碼如下:

 

 

在IPython Notebook中查看圖片是十分有用的功能,我們之后還會(huì)使用這些函數(shù)去查看結(jié)果,敬請(qǐng)繼續(xù)。

獲取最受歡迎的帖子

現(xiàn)在我們已經(jīng)知道了如何發(fā)出基本請(qǐng)求,但是如何實(shí)現(xiàn)更復(fù)雜的請(qǐng)求呢?下面我們要做一些類似的事情,即如何獲取我們的帖子中最受歡迎的。要實(shí)現(xiàn)這個(gè)目的,首先需要獲取當(dāng)前登錄用戶的所有帖子,然后將帖子按點(diǎn)贊數(shù)排序。

獲取用戶的所有帖子

要獲取所有帖子,我們將使用next_max_id和more_avialable值在結(jié)果列表上執(zhí)行循環(huán)。

  1. import time 
  2. myposts=[] 
  3. has_more_posts = True 
  4. max_id="" 
  5.  
  6. while has_more_posts: 
  7.     InstagramAPI.getSelfUserFeed(maxid=max_id) 
  8.     if InstagramAPI.LastJson['more_available'is not True
  9.         has_more_posts = False #stop condition 
  10.         print "stopped" 
  11.  
  12.     max_id = InstagramAPI.LastJson.get('next_max_id',''
  13.     myposts.extend(InstagramAPI.LastJson['items']) #merge lists 
  14.     time.sleep(2) # Slows the script down to avoid flooding the servers  
  15.  
  16. print len(myposts)  

保存和加載數(shù)據(jù)到磁盤

因?yàn)樯厦娴恼?qǐng)求可能需要很長(zhǎng)的時(shí)間才能完成,我們并不想在沒(méi)有必要時(shí)運(yùn)行它,因此好的做法是將結(jié)果保存起來(lái),并在繼續(xù)工作時(shí)再次加載。為此,我們將使用Pickle。Pickle可以將任何變量序列化并保存到文件中,進(jìn)而加載它們。下面給出一個(gè)工作例子:

保存:

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

加載:

  1. import pickle 
  2.  
  3. filename="nourgalaby_posts" 
  4.  
  5. myposts=pickle.load(file=open(filename))  

按點(diǎn)贊數(shù)排序

現(xiàn)在我們得到了一個(gè)名稱為“myposts”的有序字典。要實(shí)現(xiàn)根據(jù)字典中的某個(gè)鍵值排序,我們可以使用Lambda表達(dá)式,代碼如下:

  1. myposts_sorted = sorted(myposts, key=lambda k: 
  2.  
  3. k['like_count'],reverse=True
  4.  
  5. top_posts=myposts_sorted[:10] 
  6.  
  7. bottom_posts=myposts_sorted[-10:]  

如下代碼可以實(shí)現(xiàn)和上面一樣的顯示:

  1. image_urls=get_images_from_list(top_posts) 
  2.  
  3. display_images_from_url(image_urls)  

過(guò)濾圖片

我們可能想要對(duì)我們的帖子做一些過(guò)濾。例如,可能有的帖子中是視頻,但是我們只想要圖片帖子。我們可以這樣做過(guò)濾:

  1. myposts_photos= filter(lambda k: k['media_type']==1, myposts) 
  2. myposts_vids= filter(lambda k: k['media_type']==2, myposts) 
  3. print len(myposts) 
  4. print len(myposts_photos) 
  5. print len(myposts_vids)  

當(dāng)然,你可以對(duì)結(jié)果中的任何變量做過(guò)濾,發(fā)揮你的創(chuàng)造力吧!

通知

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

結(jié)果可能是:

  1. userohamed3 liked your post. 
  2. userhacker32 liked your post. 
  3. user22 liked your post. 
  4. userz77 liked your post. 
  5. userwww77 started following you. 
  6. user2222 liked your post. 
  7. user23553 liked your post.  

僅來(lái)自特定用戶的通知

現(xiàn)在,我們可以按我們的要求操作并玩轉(zhuǎn)通知。例如,我可以獲得來(lái)自于特定用戶的通知列表:

  1. username="diana" 
  2. for notifcation in get_recent_activity_response['old_stories']: 
  3.     text = notifcation['args']['text'
  4.     if username  in text: 
  5.         print text  

讓我們嘗試一些更有意思的操作,例如:得到你被點(diǎn)贊最多的時(shí)刻,一天中何時(shí)人們點(diǎn)贊最多。要實(shí)現(xiàn)這些操作,我們將繪制一個(gè)關(guān)系圖,顯示一天中的時(shí)刻和你所收到點(diǎn)贊數(shù)的關(guān)系。

下面的代碼繪制了通知的時(shí)間日期:

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

 

 

正如在此例中所看到的,我在下午六點(diǎn)到十點(diǎn)間得到的點(diǎn)贊最多。如果你了解社交媒體,你就會(huì)知道這是高峰使用時(shí)間,大多數(shù)企業(yè)選取此時(shí)間段發(fā)帖以獲得最大的認(rèn)可度。

獲取粉絲和被粉列表

下面我將獲取粉絲和跟帖列表,并在列表上執(zhí)行一些操作。

要使用getUserFollowings和getUserFollowers這兩個(gè)函數(shù),你首先需要取得user_id。下面給出了一種獲取user_id的方式:

 

現(xiàn)在你可以如下調(diào)用函數(shù)。注意,如果粉絲數(shù)量非常大,你需要做多次請(qǐng)求(下文將詳細(xì)介紹)?,F(xiàn)在我們做了一次請(qǐng)求去獲取粉絲和被粉列表。JSON結(jié)果中給出了用戶列表,其中包含每個(gè)粉絲和被粉者的信息。

  1. InstagramAPI.getUserFollowings(user_id) 
  2.  
  3. print len(InstagramAPI.LastJson['users']) 
  4.  
  5. following_list=InstagramAPI.LastJson['users'
  6.  
  7. InstagramAPI.getUserFollowers(user_id) 
  8.  
  9. print len(InstagramAPI.LastJson['users']) 
  10.  
  11. followers_list=InstagramAPI.LastJson['users' 

如果粉絲數(shù)量很大,那么給出的結(jié)果可能并非完整列表。

獲得所有的粉絲

獲得所有粉絲列表類似于獲得所有帖子。我們將發(fā)出一個(gè)請(qǐng)求,然后對(duì)結(jié)果使用next_max_id鍵值做迭代處理。

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

  1. import time 
  2.  
  3. followers   = [] 
  4. next_max_id = True 
  5. while next_max_id: 
  6.     print next_max_id 
  7.     #first iteration hack 
  8.     if next_max_id == True: next_max_id='' 
  9.     _ = InstagramAPI.getUserFollowers(user_id,maxid=next_max_id) 
  10.     followers.extend ( InstagramAPI.LastJson.get('users',[])) 
  11.     next_max_id = InstagramAPI.LastJson.get('next_max_id',''
  12.     time.sleep(1)  
  13.  
  14. followers_list=followers  

對(duì)于被粉列表也可以同樣做,但是我并不會(huì)這樣做,因?yàn)榫臀叶裕淮握?qǐng)求就足以獲取我的所有被粉者。

現(xiàn)在我們得到了JSON格式的所有粉絲和被粉者的列表數(shù)據(jù)。我將轉(zhuǎn)化該列表為一種對(duì)用戶更友好的數(shù)據(jù)類型,即集合,以方便在數(shù)據(jù)上做一系列的操作。

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

  1. user_list = map(lambda x: x['username'] , following_list) 
  2. following_set= set(user_list) 
  3. print len(following_set) 
  4.  
  5. user_list = map(lambda x: x['username'] , followers_list) 
  6. followers_set= set(user_list) 
  7. print len(followers_set)  

這里我選取了所有用戶名的集合。對(duì)“full_name”也可同樣操作,并且結(jié)果更為用戶友好。但是結(jié)果可能并非唯一,因?yàn)橐恍┯脩艨赡軟](méi)有提供全名。

現(xiàn)在我們得到了兩個(gè)集合。我們可以做如下操作:

 

這里我給出了粉絲的一些統(tǒng)計(jì)數(shù)字。你可以做很多事情,例如保存粉絲列表并稍后做對(duì)比,以了解掉粉的情況。

上面我們給出了可對(duì)Instagram數(shù)據(jù)進(jìn)行的操作。我希望你已經(jīng)學(xué)會(huì)了如何使用Instagram API,并具備了一些使用這些API可以做哪些事情的基本想法。敬請(qǐng)關(guān)注一下官方API,它們依然在開(kāi)發(fā)中,未來(lái)你可以使用它們做更多的事情。如有任何疑問(wèn)或建議,歡迎聯(lián)系我。 

責(zé)任編輯:龐桂玉 來(lái)源: 36大數(shù)據(jù)
相關(guān)推薦

2019-01-15 14:21:13

Python數(shù)據(jù)分析數(shù)據(jù)

2022-06-09 11:47:21

工具數(shù)據(jù)儀連接器

2024-07-26 21:36:43

2020-06-05 14:29:07

PythonPandas數(shù)據(jù)分析

2017-04-26 14:02:18

大數(shù)據(jù)數(shù)據(jù)分析Excel

2017-03-07 10:37:05

非數(shù)據(jù)數(shù)據(jù)分析

2024-10-18 09:16:45

2022-11-02 14:45:24

Python數(shù)據(jù)分析工具

2009-12-23 17:50:38

ADO.NET Fra

2021-12-28 11:23:36

SQLServerExcel數(shù)據(jù)分析

2015-04-21 14:21:07

大數(shù)據(jù)數(shù)據(jù)分析

2012-03-21 09:31:51

ibmdw

2020-07-04 11:05:35

DaskPython數(shù)據(jù)分析

2015-09-23 09:24:56

spark數(shù)據(jù)分析

2024-07-01 13:51:14

2019-12-19 15:56:10

Python數(shù)據(jù)工具

2020-02-20 10:45:51

Python數(shù)據(jù)疾病

2016-08-21 15:02:47

APP推廣數(shù)據(jù)分析數(shù)據(jù)統(tǒng)計(jì)工具

2018-08-30 17:50:30

圖像數(shù)據(jù)分析通道

2022-06-24 09:58:35

大數(shù)據(jù)JavaPython
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)