علی معرفتی
علی معرفتی
خواندن ۶ دقیقه·۵ سال پیش

گراف دوستی بچه های دانشگاه خورازمی

تقریبا ۱٫۵ سال پیش بود که یه پروژه کوچیک برای خودم شروع کرده بودم ایدم این بود که بیام یه crawler بنویسم که بیاد از پیچ خودم توی اینستا گرام شروع کنه و تمامی بچه هایی که دانشجوی دانشگاه خوارزمی بود رو پیدا کنه و وارد دیتابیس کنه یه سری چالش ها بود که می خوام براتون تعریف میکنم.

اول بزارید نحوه کارش رو بگم
crawler از پیچ خودم شروع میکنه و اطلاعت تمای فالور ها و فالوینگ هام رو بدست میاره بعدا با فیلتر که میشن افراد وارد پیچ اونا میشه و این قضیه همینطوری ادامه پیدا میکنه و همه رو داخل دیتابیس وارد میکنه و ریلیشن میزنه بینشون در اخر هم با یه الگوریتم میاد و به هر نودی یه ارزشی میده.

چالش ها :

۱)محدودیت های اینستاگرام برای crawling
اینستا خیلی زود تشخیص میده که یه ربات داره تو سایتش میچرخه و بعد از چنتا رکوست بلاک میشی راهکار هایی که برا دور زدنش انجام دادم فاصله انداختن بین دوتا رکوست اونم با تایم های تصادفی .
بخشی رو با private-api های اینستاگرام نوشتم و بخشیش رو هم از selenium کمک گرفته بودم همزمان هم از چنتا اکانت اینستاگرام استفاده میکردم و به سرعت مناسبی رسیده بودم.

۲) پیدا کردن افراد درست
چالش بدی این بود که چطور بچه های دانشگاه رو از بقیه فالور ها و فالوینگ های تشخیص بدم از اون جایی که خیلی از بچه ها توی bio اینستا زدن که دانشجوی دانشگاه خوارزمی هستن خیلی راحت از این موضوع استفاده کردم ولی تکلیف کسایی که bio ندارن چی ؟؟ با چنتا تکنیک آماری ساده مثل میزان مشاهده شدن این افراد در بین بقیه افرادی که ازشون مطمن هستیم و ... حل شد.
مشکل دیگه این بود که پیچ یه سری از دوستان private بود خب تنها کاری که میشد کرد درخواست دوستی بود ادامه ماجرا (این مشکل بزرگی نبود و به داده ها صدمه ای وارد نمیکرد دلیلش رو جلوتر میگم).

۳) دخیره سازی داده ها
برای سیو کردن داده ها sql خیلی مناسب نبود می تونید در این مورد بیشتر مطالعه کنید تا کامل متوجه بشید. من از دیتابیس neo4j استفاده کردم (اسکرین شات قرار داده شده) و به راحتی داده ها رو وارد دیتابیس میکردم برا اولین بار بود از graph database ها استفاده میکردم جالبه که زبان دیگه های برای query زدن داره به نام cypher اولش شاید براتون سخت باشه ولی به عنوان یه چیز جدید که بخواین یاد بگیرید کار باحالیه.
همچین کتابخونه های خوبی هم داشت که راحت میشد توی برنامتون ازشون استفاده کنید . py2neo کار رو خیلی بیشتر هم براتون راحت میکنه.
اگر قرار باشه دوباره از دیتابیس های مبتنی بر گراف استفاده کنم میرم سراغ orientdb هم برای کوری زدن از sql میتونید استفاده کنید و خیلی راحت با js توش توابعی رو که لازم دارید رو پیاده سازی کنید.

۴) تا کی باید ادامه بدم ؟
سوالی که برام پیش اومده بود این بود که تا کی باید بزارم برنامه کار کنه ؟ چند تا نکته هست:
× با توجه به فیلتر هایی که انجام میشد روند پیدا کردن افراد جدید نزولی است
× هزینه کار بالا بود و زمان زیادی رو می گرفت

به همین دلیل چنتا سرچ کردم برای پروژه های مشابه (اغلب اوقات تو اولین نفر نیستی :)) ) کار های باحالی پیداکردم ولی در صدر اونا گوگل رو ماکروسافت که هین کار رو با ایمیل انجام داده بودن تا رابطه بین افراد رو پیدا کنند (در اخر امار جالبی هم بتون میدم) کافی بود اونقدری این کار رو ادامه بدم تا به صورت میانگین کمترین فاصله بین دو فردی که ارتباط مستقیمی با هم ندارند کمتر از ۷ باشه. پس برنامه برای چندین روز در حال کار بود O.o


چالش های دیگه ای هم بود مثل ترسیم داده ها چون neo4j برای این کار خیلی بده یکم که داده ها زیاد میشه به شدت سیستم کند میشه که از d3.js میشه استفاده کرد . برای ارزش دهی به هر نود هم از مدل ها مارکوف استفاده کردم الگوریتم خیلی هوشمندانه ای داره می تونید مطالعه کنید درموردش .
در کل در دو مرحله crawling رو انجام دادم یک بار فقط اسم افراد و فالور ها و فالوینگ ها شون رو جمع اوری میکردم ولی برا دفعه های بعد لیست کسایی که کامنت گزاشتن یا لایک کردن و .... رو هم گرفتن.
قاعدتا الگوریتم ارزش دهی و .. رو هم دستخوش تغییرات زیادی شد.

درمورد گوگل و ماکروسافت گفتم که همچین کاری رو با میلیون ها ایمیل انجام داده بودن نتیجه جالبی که گرفته بودن این بود که میانگین کمترین فاصله بین دو فرد که باهم ارتباط مستقیمی ندارن (بهم ایمیلی نداده بودن یا توی این پروژه همدیگه رو فالو نکرده بودن) کمتر مساوی ۷ هست WoWw چیز باحالی بود وقتی خوندمش این نه تنها در ایملی و فالو بلکه در دنیای واقعی شما می تونید به هرکسی از دنیا کانکت بشین تقریبا با ۷ تا ادم واسط (که پیدا کردنشون غیر ممکنه O.o ) در حال محسابه همچین معیاری روی پروژه خودم بودم که به دلیل بسته بودم و ارتباط بیشتر بچه های دانشگاه به صورت میانگین تقریبا به عدد ۵٫۶ رسیدم
اینجا بود که مشکل اکانت های private خیلی خودش رو نشون نمیداد و می شد ازشون صرفه نظر کرد چون فالور های گمشده اون اکانت ها از راه هایی دیگه ای در دسترس بود .

در آخر بیش از ۳۰۰۰ نفر از بچه ها شناسایی و ۷۸۰۰۰ ریلشن بیشنون ایجاد شده بود.


من علی معرفتی هستم و طرفدار سفت و سخت دنیای برنامه های آزاد .
دوست دارم هر چیزی رو که بلدم رو به اشتراک بزارم و این فرهنگ رو گسترش بدیم تا همه بتونیم باهم پیشرفت کنیم.اگر خواستین بیشتر باهم در ارتباط باشیم به من ایمل بزنید : marefati110@gmail.com
پایتونcrawlاینستاگرامگراف
just a tech / DevOps / marefati110@gmail.com
شاید از این پست‌ها خوشتان بیاید