تحليل بيانات Instagram باستخدام Python

في هذا المنشور ، أود أن أتحدث قليلاً عن كيفية استكشاف بيانات حسابك على Instagram وإنشاء رؤى مثيرة للاهتمام. سأستخدم Google Colab لهذا ، مع الحزم التالية:

  • الباندا
  • InstagramApi (واجهة برمجة تطبيقات Instagram الرسمية)

أفترض أنه سيكون لديك الباندا مثبتة بالفعل. إذا لم يكن كذلك ، يمكنك تثبيت المكتبة

تثبيت الباندا
! pip تثبيت InstagramApi

بعد ذلك ، دعنا نستورد الحزم الضرورية التي سيتم استخدامها مع هذا العرض التوضيحي:

من InstagramAPI استيراد InstagramAPI
استيراد الباندا كما pd
من pandas.io.json استيراد json_normalize

ثم قم بإنشاء وظيفة صغيرة لتسجيل الدخول إلى Instagram باستخدام حسابك:

def login_to_instagram (اسم المستخدم وكلمة المرور): api = InstagramAPI (اسم المستخدم وكلمة المرور) api.login () إرجاع api api = login_to_instagram ('instagram_username'، 'instagram_password')

بمجرد التنفيذ ، يجب أن تتلقى رسالة الإرجاع هذه: نجاح تسجيل الدخول!

رائع ، لقد قمنا بتسجيل الدخول إلى Instagram! الآن يمكننا البدء في استكشافه. أعتقد أنه من الطبيعي البدء في استرداد جميع مشاركاتك:

def get_my_posts (api): "" 'استرداد كل المشاركات من ملف التعريف الخاص بك' '' my_posts = [] has_more_posts = True max_id = '' بينما has_more_posts: api.getSelfUserFeed (maxid = max_id) إذا كان api.LastJson ['more_available'] هو ليس صحيحًا: has_more_posts = خطأ #stop شرط max_id = api.LastJson.get ('next_max_id'، '') my_posts.extend (api.LastJson ['items']) # قوائم دمج إذا كان has_more_posts: طباعة (str (len (my_posts )) + 'المشاركات المستردة حتى الآن ...') print ('إجمالي المشاركات المستردة:' + str (len (my_posts)))) إرجاع my_posts my_posts = get_my_posts (api)

يجب أن يبدو الإخراج كما يلي:

تم استرداد 18 مشاركة حتى الآن ... تم استرداد 36 وظيفة حتى الآن ... تم استرداد 54 مشاركة حتى الآن ... تم استرداد 72 وظيفة حتى الآن ... تم استرداد 90 مشاركة حتى الآن ... تم استرداد 108 مشاركات حتى الآن ... 126 مشاركة تم استردادها حتى الآن ... تم استرداد 144 مشاركة حتى الآن ... تم استرداد 162 وظيفة حتى الآن ... تم استرداد 180 وظيفة حتى الآن ... تم استرداد 198 وظيفة حتى الآن ... إجمالي المشاركات المستردة: 209

ستكون my_posts قائمة بالقواميس ، ويمثل كل عنصر مشاركة واحدة من حساب Instagram الخاص بك. في حالتي ، لدي 90 وظيفة فقط. أنا أشجعك على استكشاف الحقول المتاحة لكل منشور. هناك الكثير من الاشياء المثيرة للاهتمام :)

الآن بعد أن حصلنا على جميع المشاركات ، دعنا نسترد جميع "منشئي المحتوى" لمعرفة المستخدمين الذين يحبون مشاركاتك

def get_posts_likers (api، my_posts): "" استرجاع كل المعجبين في جميع المنشورات "" likers = [] print ('wait٪ .1f minutes'٪ (len (my_posts) * 2/60.)) لـ i في النطاق (len (my_posts)): m_id = my_posts [i] ['id'] api.getMediaLikers (m_id) likers + = [api.LastJson] # تضمين post_id في قائمة الإعجابات لقائمة الإعجابات [i] ['post_id'] = m_id طباعة ("تم") إرجاع الإعجابات
الإعجابات = get_posts_likers (api، my_posts)

يجب أن يستغرق ذلك بضع دقائق ، اعتمادًا على عدد المشاركات التي لديك. سيتم عرض وقت انتظار تقريبي:

انتظر 7.0 دقائق

سوف تتلقى الانتهاء عند الانتهاء. ستكون المعجبون أيضًا قائمة بالقواميس ، ويجب أن يكون لها نفس طول my_posts. داخل كل قاموس ، ستجد المستخدمين الأساسيين ، الذين يحتويون على جميع المستخدمين الذين أحبوا مشاركة معينة.

حسنًا ، فلنقم بعملية مماثلة ، ولكن لإرجاع معلقي النشر هذه المرة:

def get_posts_commenters (api، my_posts): "" استرجاع كل المعلقين على كل المنشورات "" معلقون = [] طباعة ('انتظر٪ .1f دقيقة'٪ (len (my_posts) * 2/60.)) لـ i ضمن النطاق (len (my_posts)): m_id = my_posts [i] ['id'] api.getMediaComments (m_id) المعلقين + = [api.LastJson] # تضمين post_id في المعلقين تملي قائمة المعلقين [i] ['post_id'] = m_id طباعة ("تم") إعادة المعلقين
المعلقون = get_posts_commenters (api ، my_posts)

سيكون عليك الانتظار في نفس الوقت الذي انتظرته لاسترداد المعجبين ، وسيتم طباعته بمجرد الانتهاء. سيكون المعلقون أيضًا قائمة بالقواميس ، ويجب أن يكون لها نفس طول my_posts. ستكون التعليقات الفعلية تحت التعليقات الرئيسية لكل عنصر في قائمة المعلقين.

التحويل إلى الباندا DataFrames

حان الوقت لاستخدام حزمة الباندا القوية وهيكلة هذه البيانات قليلاً. سأستخدم json_normalize داخل pandas.io.json. يختلف تحويل البيانات قليلاً بين المعجبين والمعلقين:

def posts_likers_to_df (likers): "" يحول قائمة المعجبين بالمحبينات إلى pandas DataFrame "" # يقوم بتطبيع الإعجابات عن طريق الحصول على قائمة "المستخدمين" و post_id لكل منها مثل df_likers = json_normalize (المعجبون ، "المستخدمون" ، ["post_id" ]) # أضف عمود "content_type" لمعرفة الصفوف مثل df_likers ['content_type'] = 'like' return df_likers
def posts_commenters_to_df (المعلقين): '' 'يحول قائمة المعلقين من الإملاءات إلى pandas DataFrame' '# # تضمين اسم المستخدم والاسم الكامل للمعلق في قائمة' التعليقات 'للأوامر في النطاق (len (المعلقين)): إذا len (المعلقون [ i] ['comments'])> 0: # تحقق إذا كان هناك أي تعليق على المنشور لـ j في النطاق (len (المعلقين [i] ['التعليقات'])): # يضع اسم المستخدم / full_name المعلقين على مستوى واحد [ i] ['comments'] [j] ['username'] = المعلقين [i] ['comments'] [j] ['user'] ['username'] المعلقين [i] ['التعليقات'] [j] ['full_name'] = المعلقين [i] ['comments'] [j] ['user'] ['full_name']
    # إنشاء DataFrame # تطبيع المعلقين للحصول على صف واحد لكل تعليق ، والحصول على "post_id" من الوالد df_commenters = json_normalize (المعلقين ، "التعليقات" ، "post_id" # تخلص من عمود "المستخدم" لأننا عالجناه بالفعل فوق del df_commenters [ 'user'] إرجاع df_commenters
df_likers = posts_likers_to_df (المعجبون) df_commenters = posts_commenters_to_df (المعلقين)

مع هذا ، لدينا 2 باندا DataFrame: df_likers و df_commenters. يمثل كل صف من df_likers مثلًا واحدًا ، ويمثل كل صف من df_commenters تعليقًا واحدًا. يمكننا الآن الحصول على بعض الأرقام المثيرة للاهتمام. لنبدأ ببعض التهم الأساسية:

طباعة ("إجمالي المشاركات:" + str (len (my_posts)))
طباعة('---------')
طباعة ("إجمالي الإعجابات في الملف الشخصي:" + str (df_likers.shape [0])) #shape [0] يمثل عدد الصفوف
طباعة ("المستخدمون المميزون الذين أحبوا مشاركاتك:" + str (df_likers.username.nunique ())) # nunique () سيحسب القيم المميزة للعمود
طباعة('---------')
طباعة ("إجمالي التعليقات على الملف الشخصي:" + str (df_comment.shape [0]))
طباعة ("المستخدمون المميزون الذين علقوا على مشاركاتك:" + str (df_comment.username.nunique ()))
مجموع الوظائف: 209
---------
إجمالي الإعجابات في الملف الشخصي: 2324
المستخدمون المميزون الذين أحبوا مشاركاتك: 991
---------
إجمالي التعليقات على الملف الشخصي: 85
المستخدمون المميزون الذين علقوا على مشاركاتك: 68

أفضل 10 معجبين في حسابي على Instagram:

# نظرًا لأن كل صف يمثل ما شابه ، يمكننا إجراء قيم_القيمة على اسم المستخدم وتقسيمه إلى العناصر العشرة الأولى (الباندا تطلبه بالفعل لنا)
df_likers.username.value_counts () [: 10]
hc_ka_sky 77 ceddie112 72 tcyinv3v 55 cheunghotinfeat.cm 52 ngtszkin18 42 lawlaw0925 34 yanyuwong 28 eric_khshing 27 photo.by.min 24 raychongtk 22 الاسم: اسم المستخدم ، dtype: int64

حسنًا ، "hc_ka_sky" هو أكثر الأشخاص الذين أعجبوا بمنشورتي: من أصل 209 مشاركة ، كان يحب 77 منها! دعونا نرسم توزيع هذا العشرة الأوائل:

مؤامرة بار

df_likers.username.value_counts () [: 10] .plot (kind = 'bar'، title = 'Top 10 media likers'، grid = True، figsize = (12،6))

مؤامرة فطيرة

df_likers.username.value_counts () [: 10] .plot (kind = 'pie'، title = 'Top 10 media likers distribution'، autopct = '٪ 1.1f ٪٪'، figsize = (12،6))