自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[205045]]

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

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

API和工具簡介

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

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

安裝

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

  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 

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

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

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

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

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

基本請求

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

  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格式給出的,其中包括了所有請求的數(shù)據(jù)。

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

 

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

獲取并查看Instagram時間線

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

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

  1. InstagramAPI.timelineFeed() 

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

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

函數(shù)

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

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

 

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

 

 

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

獲取最受歡迎的帖子

現(xiàn)在我們已經(jīng)知道了如何發(fā)出基本請求,但是如何實現(xiàn)更復(fù)雜的請求呢?下面我們要做一些類似的事情,即如何獲取我們的帖子中最受歡迎的。要實現(xiàn)這個目的,首先需要獲取當(dāng)前登錄用戶的所有帖子,然后將帖子按點贊數(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ù)到磁盤

因為上面的請求可能需要很長的時間才能完成,我們并不想在沒有必要時運行它,因此好的做法是將結(jié)果保存起來,并在繼續(xù)工作時再次加載。為此,我們將使用Pickle。Pickle可以將任何變量序列化并保存到文件中,進而加載它們。下面給出一個工作例子:

保存:

  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))  

按點贊數(shù)排序

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

  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:]  

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

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

過濾圖片

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

  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)然,你可以對結(jié)果中的任何變量做過濾,發(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.  

僅來自特定用戶的通知

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

  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  

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

下面的代碼繪制了通知的時間日期:

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

 

 

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

獲取粉絲和被粉列表

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

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

 

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

  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ā)出一個請求,然后對結(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  

對于被粉列表也可以同樣做,但是我并不會這樣做,因為就我而言,一次請求就足以獲取我的所有被粉者。

現(xiàn)在我們得到了JSON格式的所有粉絲和被粉者的列表數(shù)據(jù)。我將轉(zhuǎn)化該列表為一種對用戶更友好的數(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)  

這里我選取了所有用戶名的集合。對“full_name”也可同樣操作,并且結(jié)果更為用戶友好。但是結(jié)果可能并非唯一,因為一些用戶可能沒有提供全名。

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

 

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

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

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

2019-01-15 14:21:13

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

2022-06-09 11:47:21

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

2020-06-05 14:29:07

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

2024-07-26 21:36:43

2017-04-26 14:02:18

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

2022-11-02 14:45:24

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

2024-10-18 09:16:45

2017-03-07 10:37:05

非數(shù)據(jù)數(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ù)分析

2019-12-19 15:56:10

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

2020-07-04 11:05:35

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

2015-09-23 09:24:56

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

2012-03-21 09:31:51

ibmdw

2024-07-01 13:51:14

2020-02-20 10:45:51

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

2016-08-21 15:02:47

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

2022-06-24 09:58:35

大數(shù)據(jù)JavaPython

2018-08-30 17:50:30

圖像數(shù)據(jù)分析通道
點贊
收藏

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