تجربه Api Twitter با پایتون ( قسمت سوم )

به نام خدا

به جذاب ترین بخش پست های تحلیل داده توییتر رسیدیم و این بخش بیشتر از سایر بخش ها من رو هیجان زده میکنه. امیدوارم بتونم به خوبی تجربیاتم رو منتقل کنم و افرادی که دوست دارند در این زمینه فعالیت بکنند، یک راهنمای خوب داشته باشند.

اگر پست های قبلی مربوط به تحلیل داده رو نخوندید میتونید از لینک های زیر دنبال کنید و دورنمایی از پروژه داشته باشید.

https://vrgl.ir/TKNSG


https://vrgl.ir/k6WW4


چه روش هایی برای جمع آوری داده وجود داره؟

من در ابتدای کار به طور مفصل درباره روش ها جستجو کردم و دنبال ساده ترین روش برای انجام دادن پروژه بودم. بنابر این روش های جمع آوری داده رو در ادامه شرح میدم و دلیل انتخاب کردن هر کدوم رو بهتون میگم.

اصولا برای تحلیل داده میتونیم فرایند جمع آوری داده رو به دو بخش تقسیم بندی بکنیم.

1 - دیتاست آماده از سایت هایی مانند کگل.

2 - جمع آوری داده با توجه به نیازمندی های پروژه.

دیتاست آماده ای که مناسب کار من باشه وجود نداشت. بنابر این من باید فرایند جمع آوری داده رو خودم انجام می دادم. برای این کار هم میتونستم از Api رسمی توییتر استفاده بکنم و هم از Crawler ها و کتابخانه های غیر رسمی برای این کار استفاده بکنم. من برای دریافت اطلاعات معتبر و سهولت از Api توییتر استفاده کردم.

ثبت نام در پنل توسعه دهندگان توییتر

https://developer.twitter.com/en

استفاده از Api توییتر باعث میشه برای دریافت اطلاعات سهولت بیشتری داشته باشیم و دقیقا اطلاعاتی که میخوایم رو دریافت بکنیم ولی نحوه گرفتن این Api اصلا کار ساده ای نیست و مثل تلگرام یا فیسبوک به راحتی وارد کردن یک فرم یا ثبت نام در قسمت Api نیست و فرایند دریافت Api اعتبار سنجی میشه و حتما باید دلیل خوبی برای دریافت Api داشته باشید و چندین بار ازتون سوال میشه که دقیقا با این Api چیکار میخواید بکنید. البته چون من حدود یکسال قبل از این که این پروژه رو شروع بکنم، برای کار دیگری این Api رو گرفتم، در زمان صرفه جویی شد.

صفحه توسعه دهندگان توییتر
صفحه توسعه دهندگان توییتر


من این فرایند رو توضیح نمیدم و فرض میکنیم که تونستیم ثبت نام بکنیم و Api رو بگیریم و پنل توسعه دهندگان برای ما فعال شده است. اگر دوست داشتید درباره نحوه گرفتن Api بیشتر بنویسم، حتما زیر این پست کامنت بزارید، چون فرض من این هست که این فرایند با توجه به داکیومنت های موجود در توییتر نکته مهم و قابل بحثی نداره.

در تصویر زیر App هایی که برای دریافت داده استفاده می شود را ساخته ام و دلیل تعداد زیاد آن محدودیت های توییتر برای دریافت داده است و من سعی کردم با استفاده از افزایش تعداد App ها زمان دریافت داده را کوتاه تر بکنم. به ازای هر پنل توسعه دهنده حداکثر 10 App می توان ساخت.


پنل توسعه دهندگان توییتر
پنل توسعه دهندگان توییتر


روش های متعددی برای Authentication در توییتر وجود دارد، من از ورژن 1.1 استفاده کردم. در این روش پس از ساختن App دو کلید که مخصوص شناسایی هر App است در اختیار ما قرار میگیرد. نام این کلید ها ConsumerKey و ConsumerSecret می باشد. پس از ساختن App باید دسترسی یک اکانت توییتر را به این App ها بدهیم. اگر App ما برای استفاده سوم شخص بود به وسیله آدرس مخصوص App خود و CallBack، توکن برای ما ارسال میشد و ما میتوانستیم دسترسی به آن اکانت را بگیریم، ولی چون تنها اکانتی که من میخواستم در این App رجیستر بشه، اکانت خودم بود ، به راحتی با چند کلیک توکن مربوط به خودم رو دریافت کردم که شامل دو تا کلید به نام های access_token و access_token_secret می شود ، این توکن ها صرفا یکبار ایجاد می شود و قابل بازیابی نیستند.

تصویر جزئیات هر App رو در ادامه مشاهده میکنید.

جزئیات هر App
جزئیات هر App


بعد از این که 4 تا کلیدی که بالا توضیح دادم رو دریافت کردیم، نوبت میرسه به این که ببینیم چه داده هایی از توییتر رو میخوایم دریافت بکنیم و همچنین Api توییتر چه داده هایی در اختیار ما قرار میده. نکته مهم دیگه ای میخوام بگم اینه که چون من از کتابخونه Tweepy استفاده کردم دیگه نیاز نبود خودم الگوریتم های Ouath 1 رو پیاده سازی بکنم و احرازهویت و تمام EndPoint ها در این کتابخانه به درستی پیاده سازی شده بود و من از این کتابخانه استفاده کردم.

حقیقت مهمی که وجود داره اینه که مبهم ترین قسمت کاری که میخواستم انجام بدم در این مرحله بود، من واقعا نمیدونستم چه داده ای رو باید دریافت بکنم و نمیدونستم حجم داده هایی که باهاشون روبرو هستم چقدر هست. تو این مرحله من خیلی پرس و جو کردم و سایت های زیادی رو سر زدم، یکی از سایت هایی که برای من خیلی مفید بود سایت https://bigdata-ir.com بود، خیلی مفاهیم خوبی درباره گراف ها به زبان فارسی در این سایت وجود داشت و من ایده گرفتم که چه داده هایی رو دریافت بکنم.

محدوده ای که من قصد داشتم روش کار بکنم توییت های فارسی بود، بنابر این قبل از هر کاری باید توییت های فارسی رو جدا میکردم و همچنین اکانت های فارسی رو تشخیص میدادم. توییتر به ابزار بسیار خوب برای این کار داره که محدودیتی برای دریافت توییت ها نداره. اسم این ابزار Twitter Streamer است.

ابزار Twitter Streamer

برای استفاده از توییتر استریمر ابتدا باید فیلتر هایی برای آن تعیین بکنیم. این فیلتر ها تعیین می کنند که توییت هایی که قصد داریم آن ها را دریافت بکنیم دارای چه خصوصیاتی هستند. به طور مثال فیلتر های مانند زبان، منطقه جغرافیایی، کلماتی که در توییت باید وجود داشته باشد و غیره . پس از تعیین فیلتر های فوق و کانکت شدن به سرور، به محض ایجاد شدن توییت هایی که با فیلتر های ایجاد شده همخوانی داشته باشد، توییت برای ما ارسال خواهد شد. اگر علاقه مند به سازوکار آن هستید می توانید از لینک زیر اطلاعات بیشتری کسب کنید.

https://developer.twitter.com/en/docs/twitter-api/v1/tweets/filter-realtime/guides/connecting

من برای اینکه مطمئن بشم اطلاعات دریافتی مربوط به توییت های فارسی است، دو فیلتر را اعمال میکنم. فیلتر اول مربوط به کلماتی متداول فارسی مانند [که به از چه در ... ] و فیلتر دوم انتخاب زبان فارسی برای متن توییت ها است.

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

داده ها رو کجا ذخیره بکنیم؟

در حقیقت من از همون ابتدا میدونستم که داده ها رو میخوام با Neo4J هندل بکنم و زبان سایفر رو یاد گرفتم و به شدت هم از قابلیت هاش هیجان زده شده بودم و قابلیت پیاده سازی الگوریتم های مختلف هم روش وجود داره ولی به منابع زیادی نیاز داره.

در ابتدا من از Neo4J استفاده می کردم ولی به سرعت به SqlServer/Mysql مهاجرت کردم. کد هایی که در ادامه برای دریافت اطلاعات با استفاده از استریمر توییتر آورده شده مربوط به پایگاه داده Neo4J است و اطلاعات در این پایگاه داده ذخیره شده است.

https://gist.github.com/vessaldaneshvar/3474fbbecb1a6d70488e09251b65c023

در ابتدا پکیج های مورد نیاز برای کار با Api توییتر و همچنین پکیج هایی برای کار با پایگاه داده ایمپورت شده است. در گام بعدی اطلاعات مربوط به اتصال به Neo4J وارد شده است و کلاس اتصال به پایگاه داده ساخته شده است. برای استفاده از استریمر ما نیاز به یک کلاس با دو متد برای حالت های مختلفی که رخ می دهد داریم. متدی برای هندل کردن ارور ها ، همچنین متدی برای هندل کردن داده هایی که برای ما ارسال می شود. در متد هندل کردن ارورها صرفا عملیات با فرستادن false متوقف میشه و اگر به مشکل بخوریم صرفا متوقفش میکنم تا ایراد رو پیدا کنم و خوشبختانه به مشکلی هم نخوردم و این الگوریتم تونست روی سرور حدود دو روز بدون مشکل اجرا بشه و داده جمع آوری بکنه.

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

نتایج:

بعد از این که script بالا دو روز اجرا شد، دقیقا یادم نیست چند میلیون توییت جمع آوری شده بود ولی در نهایت حدود 250 هزار یوزر یونیک جمع آوری شد. تخمین من از تعداد کاربران فارسی زبان بیشتر از یک میلیون یوزر بود و بنابر این باید فاز دوم جستجو رو شروع میکردم. با توجه به اینکه بازه زمانی دو روزه به شدت برای جمع آوری داده کوتاه است و اگر مدت زمان بیشتری جمع آوری داده انجام شده بود یوزر های بیشتری جمع آوری می شد ولی به دلیل محدودیت های زمانی این امکان وجود نداشت و من باید به روش سریع تری برای انجام این کار اقدام می کردم. نکته مهم دیگه ای که وجود داره اینه که بسیاری از افراد در توییتر فارسی صرفا خواننده هستند و با فاصله زمانی زیادی توییتی منتشر میکنند. بنابر این حتی اگر در یک بازه زمانی یک ماهه اسکریپت را اجرا می کردم شاید تعداد زیادی از افراد جمع آوری نمی شدند.




امیدوارم تا به اینجا این مطلب براتون مفید بوده باشه. در پست بعدی به جمع آوری داده های سایر افراد که با احتمال بالایی فارسی زبان هستند می پردازم.

ممنون که این پست رو خوندید .