بعد از انتخابات امسال، چند روز پیش یهو برام یه سوال پیش اومد:
با دیدار رییسی با تتلو چقدر به حامیان رییسی اضافه شد؟ حس کردم که اینستا جای خوبی هستش برای اندازه گیری چنین چیزی. مشکلی که وجود داره اینه که ما دیتای قبل از این دیدار رو نداریم ولی به هر حال باز هم برام جالب بود که ببینم فالوئرهای پیج رییسی و تتلو چقدر با یکدیگر اشتراک دارند.
چیزی که در ادامه میخونید مسیری هستش که طی کردم تا بتونم دیتا رو جمعآوری، ذخیره و تحلیل بکنم و یه مقداری فنی هستش. اگر براتون مهم نیست که چجوری این کار انجام شده، میتونید برید قسمت نتایج.
خب... دست به کار شدم و رفتم ببینم که چجوری میتونم چنین دیتایی رو به دست بیارم. اول یه نگاهی انداختم به API ای که خودت اینستا به ملت میدادش. API نسبتاً محدود و ضعیفی بودش و چیز خاصی در مورد پیج ها توش پیدا نکردم. بنابراین مجبور شدم که خودم یه crawler ای بنویسم که این کار رو برام انجام بده. برای شروع باید میدیدم که چه ریکوئستی به اینستا زده میشه تا لیست فالوئرها رو بهمون نشون بده. کافیه که توی chrome اون ابزارهای توسعهدهندگان رو باز کنید و برید قسمت network و مشاهده کنید که وقتی لیست فالوئرها رو باز میکنید چه درخواستی به سمت سرور میفرستید. درخواست همچین آدرسی داشتش:
https://www.instagram.com/graphql/query/query_id=17851374694183129&id=49069741&first=10
این که graphql چیه رو پیشنهاد میکنم یه نگاهی بندازید چیز جالبیه. خب حالا باید یه خورده با این آدرس ور میرفتم تا ببینم چه کارایی میشه روش کرد. اول از همه قسمت first=10 جذاب بود که وقتی زیادش میکردم تعداد نتایجی که برمیگردوند هم زیاد میشد اما خب تا یه جایی این اتفاق افتاد و بعدش دیگه شروع کرد بهم فحش دادن. خب حالا که نمیتونم کل فالوئرها رو یه جا بگیریم باید شبیه به یه کلاینت عادی «اسکرول» کنم و هی درخواست جدید بدم. انتهای هر یک از این نتیجههایی که بر میگردوند، یه آدرسی شبیه به next_page وجود داشت که اگر اون رو هم یه جایی توی URL قرار میدادم میرفتم صفحهی بعد! این مکانیزم برای pagination خیلی رایج هستش و حقیقتاً هوشمندانهست! خلاصه با کمی آزمون و خطا تونستم یه اسکریپت پایتون بنویسم که شروع میکرد و فالوئرهای یک پیج رو جمعآوری میکرد.
دیتا به قدری زیاد بود که نتونم خیلی راحت تو رم نگهش دارم، همچنین این که دیتا توی یه پروسس پایتون باشه که به محض کیل شدنش نیست و نابود بشه خیلی خوشایند نبود، برای همین نیاز داشتم که یه جایی ذخیره بکنمش. اولین ایده نوشتن تو فایل بود و اگر مشکلی نداشتش همون راه رو میرفتم! ولی خب ممکن بود فایل به هر دلیلی corrupt بشه، مدل ذخیره سازی توش رو خودم باید یه جوری هندل میکردم و کلاً تمیز نبود. برای همین به موجودات باهوشتری به نام دیتابیس روی اوردم! اینستا فالوئرها رو به شکل یه سری آبجکت JSON برمیگردوند و چه دیتابیسی بهتر از mongo برای ذخیرهسازی این مدل دیتاها. حوصله نداشتم یاد بگیرمش ولی تونستم ازش استفاده بکنم! با docker سریع بالا اوردمش، درایور پایتونش رو نصب کردم و شروع کردم به ریختن دیتا توش. خوبی این کار این بود که تونستم اسکریپتهام رو به طور موازی هم اجرا کنم و همشون میریختن توی یه دیتابیس.
چیز اصلی که میخواستم در بیارم اشتراک لیست فالوئرهای پیجهای مختلف بود. و این که کلاً چقدر به هم ربط دارند این صفحات. برای بعضی صفحات خاص نمودار ون کشیدم که اینجا میبینید:


کار جذابتری که بعدش اانجام دادم این بود که حدود ۲۰ تا از صفحات معروف ایرانی رو کراول کردم و دیتاشون رو در اوردم. بعد سعی کردم ببینم این پیجها چقدر به هم نزدیک هستند. برای این که یه متریک خوب از این که دو پیج چقدر به هم نزدیک هستند در بیارم، از فرمول Pointwise Mutual Information استفاده کردم که یه مقدار تاثیر میزان فالوئرهای یه صفحه رو کم میکرد و بعدش به کمک کتابخونه pheatmap تو R یه همچین تصویری کشیدم:

این تصویر نشون میده که چقدر دوتا پیج به هم نزدیک هستند و سعی میکنه یه خوشه بندی سلسلهمراتبی از روشون بسازه. هر چقدر که سلول قرمزتر یا داغتر باشه نشون میده که دو صفحه از نظر اشتراک فالوئر به هم نزدیکتر هستند. درختی که اون بالا وجود داره نشون میده که از نظر خوشهبندی چه وضعیتی وجود داره، مثلاً پیج khamenei_ir و raisi_org توی درخت بغل هم هستند، یه جورایی یعنی رفتار فالوئرهاشون خیلی به هم شبیه هست، مثلاً اکثرشون صفحه bbcpersian رو دنبال نمیکنن. خوشهبندی اتوماتیکی که الگوریتم انجام میده خیلی خوبه! مثلاً خیلی راحت میبینیم که پیجهای مهناز افشار و الناز شاکردوست کنار هم هستند، بعدش نزدیکترین پیج به این دو، پیج امیرتتلو هستش. همچنین افراد این دسته شبیه به افرادی هستند که پیجهای عروسآینده و همهچیز برای خانومهای شیک رو دنبال میکنند. این دستهاز پیجها به طور خاص خیلی با بقیه تفاوت داشت و یه بار دیگه هم بعد از حذف این دسته تصویر رو کشیدم:

در نهایت خیلی به اون سوال اولیهام نتونستم جوابی بدم و تو نمودارها هم رابطهی عجیب غریبی بین تتلو و رییسی وجود نداشت ولی کلی چیزهای جالب دیگه دراومد و کلی خوش گذشت. ?
نت بوک پایتونی که باهاش استخراج و ذخیرهسازی رو انجام دادم، خیلی تر و تمیز نیست اما امیدوارم به درد بخوره.
کد R ای که باهاش heatmap رو کشیدم.
فایلهای دیتاست یه ۴۰۰-۵۰۰ مگی میشد که من حال نداشتم جای درست درمونی آپلود کنم. اگر خواستید میتونید این زیر کامنت بذارید من اون موقع تلاشمو بکنم ?
اینستاگرام از توییتر و فیسبوک برای جمع کردن دیتای شبکههای اجتماعی تو ایران خیلی جذابتر هستش، چون فیلتر نیست و افراد بیشتری توش عضو هستند. کارهای بامزهی دیگری هم میشه در ادامهی این کار انجام داد، مثلاً ببینیم چقدر از فالوئرهای صفحات fake هستند یا کارهایی از این قبیل.
جالبی این کار برای خودم این بود که حدس میزدم API های سفت و سختتری وجود داشته باشه و نشه اینقدر راحت کراول کرد سایت رو. ولی اینجوری نشد و در نهایت به نتایج خیلی بامزهای رسیدم.