دست به کد: جمعآوری خودکار توئیتهای فارسی با استفاده از GitLab CI
در ادامه مباحث جمع آوری و پردازش توئیتهای فارسی، به عنوان یک منبع عالی برای پردازش متن، سنجش احساسات و بررسی میزان گرایش و توجه بخش تحصیلکرده و جوان جامعه (اکثریت قریب به اتفاق توئیتکنندگان) به یک موضوع خاص، در این مقاله، قصد داریم به ایجاد یک خط تولید ساده جمعآوری توئیت بپردازیم که روزانه و بدون پرداخت هیچ هزینهای، به جمع آوری توئیتهای فارسی (عمومی و یا در یک حوزه خاص) بپردازد. این کار را با امکانات گیتلب انجام میدهیم و کاری میکنیم که توئیتهای جمعآوری شده به صورت روزانه در یک مخزن کد عمومی گیتهاب برای استفاده عموم ذخیره شود. این مقاله از چهار گام اصلی زیر تشکیل خواهد شد که در ادامه تک تک آنها را با هم انجام خواهیم داد :
- ارسال خودکار توئیتها به گیتهاب
- خودکارسازی اجرای کد
- دانلود توئیتهای جمعآوری شده
- ارسال خودکار توئیتها به گیتهاب
آنچه خواهیم دید
پیش نیازها
قبل از شروع کار، مطمئن شوید که اکانت گیتلب دارید که البته با توجه به تحریم جدید گیتهاب برای ایرانیان، مجدداً این سرویس رایگان و پیشرفته، مورد اقبال جامعه توسعهگران فارسی قرار گرفته است و احتمالاً حساب کاربری گیتلب خواهید داشت.
برای این پروژه، خیلی نیاز به آشنایی با گیت (یک سیستم مدیریت فایلها در پروژههای نرمافزاری) ندارید و میتوانید از امکانات خود گیتلب برای آپلود فایلهای پروژه استفاده کنید. برای اینکه همراه با توضیحات، به صورت عملی کدها را مشاهده کرده و به دلخواه، تغییراتی در آنها انجام دهید، بهتر است مخزن کد پروژه را از این آدرس، Fork
کنید تا کدها به حساب کاربری شما در گیتلب منتقل شود (گزینه Fork
زمانی که وارد حساب کاربری خود شده باشید، فعال خواهد شد). با این کار میتوانید برای ویرایش کدها (مثلاً جستجوی موضوعی خاص در توئیتر و جمعآوری توئیتهای مرتبط با آن) با رفتن به زبانه Details
از گزینه Web IDE
، به صورت آنلاین به تغییر و اجرای کدها بپردازید.(شکل زیر) خوبی ادیتور کد گیتلب این است که علاوه بر ویرایش فایلها، امکان آپلود فایلها و حذف آنها را هم برای شما فراهم میکند.
آخرین نکتهای که قبل از شروع کار، باید خاطرنشان کنم این است که هدف این نوشتار، تنها آشنایی با نحوه اجرای خودکار کدها و ایجاد یک خط تولید داده ساده است بنابراین روی بخش جمع آوری توئيتها با توجه به اینکه در دو مقاله قبلی، به تفصیل صحبت کردهایم، توضیحی نخواهم داد و فرض بر این است که کدی که قرار است به صورت روزانه اجرا شود، از قبل موجود است. این کد درون پروژه فوق با نام get_tweets.py
قرار دارد و در انتهای بخش اول این آموزش، نحوه اجرای خودکار این فایل را فراخواهیم گرفت و مطمئناً شما این کار را با هر فایل دیگری میتوانید انجام دهید.
مقدمهای بر CI یا تجمیع مداوم در مهندسی نرمافزار
در مهندسی نرم افزار مدرن برای تولید حرفهای یک محصول نرمافزاری، به ازای هر بخش از نرمافزار حتماً یک تست و آزمایش هم باید نوشته شود. این تست که خود یک برنامه کوچک است، این امکان را به ما میدهد که بتوانیم به صورت خودکار، تمام نرم افزار را تست کنیم و به ازای هر قابلیت جدید، مطمئن شویم که کدهای قبلی بدون اشکال اجرا خواهند شد. این موضوع باعث ایجاد یک روند در تولید نرمافزارها شده است که به آن تجمیع مداوم یا Continuous Integration
میگوئیم . به این ترتیب که به ازای هر قابلیت جدیدی که توسط یکی از اعضای تیم آماده و تحویل مدیر پروژه میشود، این قابلیت به صورت موقت به پروژه اصلی اضافه شده و تمامی تستها، به صورت اتومات اجرا میشوند. اگر همه تستها پاس شدندو خطایی تولید نشد، این قابلیت در لیست انتشار قرار میگیرد و یا می تواند به صورت خودکار، منتشر شده و در اختیار عموم قرار گیرد ( Continuous Deployment
).
امکان اجرای خودکار تستها که خود کدهای نرمافزاری هستند را گیتلب برای ما به رایگان فراهم کرده است و ما هم قصد داریم از همین امکان برای مقاصد خود که جمعآوری داده است، (سوء) استفاده کنیم!. با ما همراه باشید.
گام اول: ایجاد یک خط تولید
کدهایی که گیتلب برای ما اجرا میکند، در یک ماشین مجازی مجزا و ایزوله اجرا شده و بعد از پایان برنامه هم این ماشین مجازی پاک شده و تنها فایلهای لاگ آن (مثلا پرینتهایی که انجام دادهایم به همراه خروجیهای خود ماشین مجازی ) را میتوانیم مشاهده کنیم و بفهمیم آیا همه چیز به خوبی انجام شده است یا نه. اگر این کدها، تستهای پروژه باشند و خطایی پیش آمده باشد، جزییات آن به ما ایمیل خواهد شد.
اما این به تنهایی کافی نیست و ما میخواهیم علاوه بر ذخیره توئیتها در این ماشین مجازی که با اتمام کار آن، از بین خواهد رفت، بعداً بتوانیم به آنها دسترسی داشته باشیم. اینجاست که مفهومی با نام Artifact
در گیتلب معرفی شده است و منظور از آن، فایلهایی است که باید بعد از اجرای کدها، از ماشین مجازی استخراج و در اختیار کاربر قرار گیرد. بنابراین بهتر است خروجی مورد نظر خود را در یک پوشه مشخص قراردهید و همین پوشه را به گیتلب برای تولید خروجی اعلام نمایید. در این پروژه، ما توئیتها را در فایلی با نام data.txt
و در پوشه tweets
ذخیره میکنیم.
فرض کنید کدهای استخراج توئیت ما درون یک فایل با نام get_tweets.py
قرار گرفته است که دقیقاً همانکدهای مقالات قبلی است که تعداد توئیتهای آن به ده هزار عدد، محدود شده است و قصد داریم این کد را هر یک ساعت یک بار اجرا کنیم و بدین ترتیب خواهیم توانست روزانه حدود ۱۲۰ هزار توئیت را جمعآوری کنیم.
در مرحله بعد، کتابخانههایی که برای اجرای این کدها به آنها نیاز داریم در فایل requirements.txt
وارد میکنیم : نام هر کتابخانه دریک خط
علاوه بر این، فایل .gitlab-ci.yml
که حاوی تنظیمات اجرای خودکار کدها بعد از هر کامیت است را هم به صورت زیر به پروژه اضافه میکنیم . منظور از کامیت هم، هر نسخه جدیدی از پروژه است که با هر دستور git push
به گیتلب ارسال میشود و یا هر تغییری که با استفاده از Web IDE
به صورت آنلاین روی کدها صورت میدهیم.
اگر با داکر آشنا باشید، کدهای فوق برایتان گویا خواهد بود اما به طور خلاصه، در خط اول اعلام میکنیم که برای ایجاد یک خط تولید (اجرای مرحله به مرحله و خودکار یک فرآیند از برنامهها را خط تولید میگوییم.) به ایمیج پایه پایتون نیاز داریم. ایمیج پایه پایتون هم یک لینوکس سبک وزن است که بر روی آن، پایتون نصب شده است و آماده اجرای برنامههای پایتون است.
در خط دوم و سوم، نام مراحل این خط تولید را اعلام می کنیم که در مثال ما یک مرحله بیشتر نداریم و نام آن را هم gettweets
گذاشتهایم . در قسمت بعد،متغیر محیطی PIP _CACHE_DIR
را مقداردهی میکنیم که برای نصب کتابخانههای مورد استفاده در پروژه نیاز خواهد بود و در ادامه، کدهایی که قبل از اجرای برنامه پایتون ما باید روی این سرور مجازی اجرا شوند را در بخش before_script
مشخص میکنیم . دستور اول نسخه پایتون را چاپ می کند (برای مقاصد خطایابی) و دستور دوم هم کتابخانههای پایتون پروژه که در فایل requirements.txt
قرار گرفته است را نصب میکند.
خط یازدهم، شروع توضیحات هر مرحله از خط تولید است که میتوانیم با دادن هر نام دلخواهی شروع به ذکر جزییات هر مرحله نماییم. دقت کنید که در این بخش، جلوی متغیر stage
نام مرحله اولی که در بالا به آن اشاره کردهاید را حتما بنویسید. نهایتاً در قسمت script
کد پایتونی که باید اجرا شود را مشخص میکنیم و در بخش artifacts
هم مسیر خروجیهای پروژه و پسوند یا نام آنها را مشخص میکنیم .
اکنون همه چیز آماده اجرای خودکار کدهای مورد نظر ماست. اگر این پروژه را کامیت کنید و یا تغییراتی که آنلاین روی کدها دادهاید را ذخیره کنید، خط تولید شما به صورت خودکار شروع به اجرا خواهد کرد. کافی است به قسمت CI / CD
بروید و از قسمت Pipelines
بررسی کنید که خط تولید شما در حال اجراست یا نه .
اگر همه چیز اکی باشد، مشابه با شکل فوق، باید عبارت passed
را کنار شناسه خط تولید خود ببینید و اگر هم عبارت failed
را مشاهده کردید، کافی است بر روی شناسه خط تولید کلیک کنید تا به صفحه نمایش اطلاعات کارها یا jobs
آن خط تولید برود و از زبانه failed jobs
، خطای تولید شده را میتوانید مشاهده کنید. در این حالت، تصویری مشابه زیر خواهید دید :
البته همیشه میتوانید همزمان با اجرای خط تولید، این صفحه خروجی را هم مشاهده کنید و مثل شکل زیر چک کنید که توئیتها به درستی دریافت میشوند یا نه .
حال اگر خط تولید ما با موفقیت تمام کارها را به اتمام رسانده باشد، میتوانیم خروجی این خط تولید را که همان توئیتهای ما هستند از دکمه منتهی الیه سمت راست توضیحات آن خط تولید، دانلود کنیم. شکل زیر این امکان را نشان میدهد .
در این مرحله ذکر چند نکته هم خالی از لطف نیست :
- هنگام امتحان عملی این کدها،متوجه شدم که ایجاد فایلهای خروجی با خطا مواجه میشود. کاری که بنده انجام دادم این بود که این فایلها را در آدرس مطلوب، ایجاد کردم (یک فایل متن خالی) که مشکل حل شود. اگر شما هم با این خطا مواجه شدید میتوانید از این روش موقتاً کار خود را راه بیندازید.
- به صورت پیشفرض هر خط تولید باید حداکثر یک ساعت طول بکشید و در غیر اینصورت، کار در حال اجرا متوقف و خط تولید، در حالت شکست خورده (
Failed
) به اتمام میرسد. با سعی و خطایی که انجام دادم، تعداد ده هزار توئیت، برای نود درصد مواقع در زمانی خیلی کمتر از این عدد به اتمام می رسیدند و گاهی هم در یکساعت، به این تعداد نمی رسید و خط تولید، شکست میخورد. میتوانید از منوی تنظیمات و زبانهCI / CD
در بخشGeneral pipelines
زمان اجرا را بیشتر یا کمتر کنید. (من به شخصه زمان را روی دو ساعت تنظیم کردم) در هر صورت تنها تا ۲۰۰۰ ساعت در ماه، به صورت رایگان کدهای شما اجرا خواهد شد و حواستان به این موضوع هم باشد.
گام دوم: خودکارسازی اجرای کد
همانطور که در بالا اشاره شد، با ایجاد یک خط تولید پردازشی، با هر بار کامیت کردن کدها (تغییر و به روز رسانی مخزن کد)، این خط تولید به صورت خودکار اجرا میشود. اما ما قصد داریم این کار را به صورت زمانبندی شده و خودکار به ازای هر ساعت انجام دهیم. یعنی هر یک ساعت یکبار، این خط تولید شروع به اجرا کرده، توئیتهای ما را جمع آوری و ذخیره کند.
قالب زمانبندی خط تولید بر اساس Cron Jobs
لینوکس است که در آن، پنج کاراکتر به ترتیب زیر، زمان اجرا را در یک دقیقه خاص، ساعت یا روز مشخص از ماه، یک ماه خاص و یا یک روز هفته تعیین می کند. (مشاهده مثالهای بیشتر در این آدرس)
برای تعیین زمان اجرای خط تولید از منوی سمت چپ، از بخش CI / CD
زیر منوی کارهای زمانبندی شده یا Schedules
را انتخاب کرده، نوع زمان بندی را به صورت دستی و برابر * * * * ۰ قرار میدهیم یعنی سر دقیقه صفر هر ساعت (با شروع از زمان حال).
با ذخیره این زمانبند، از این به بعد هر یک ساعت یکبار کد شما اجرا شده و خروجی آن در قالب فایلهای تعیین شده، توسط شما قابل دانلود خواهد بود.
اما این که هر روز بخواهیم بیست و چهار خط تولید اجرا شده را بررسی و فایلهای تک تک را جداگانه دانلود و ذخیره کنیم، کمی غیر عملیاتی است. در گام بعد، با نوشتن یک کد ساده، این فایلها را با اجرای یک برنامه، دانلود و ذخیره خواهیم کرد. در گام آخر ، همین کار را هم به صورت خودکار انجام میدهیم و تمام توئیتهای جمعآوری شده در یک روز را به صورت خودکار به گیتهاب منتقل میکنیم.
گام سوم: دانلود توئیتهای جمعآوری شده
در گام سوم، برای بهبود فرآیند جمع آوری توئیتها به کمک امکانات خود گیتلب، به دانلود خروجیهای هر خط تولید میپردازیم. برای اینکار نیاز به شناسه پروژه در گیتهاب و یک توکن دسترسی برای دانلود خروجیها داریم. شناسه پروژه که در زیر نام مخزن کد در زبانه Details
به صورت زیر قابل مشاهده است :
برای ایجاد یک توکن دسترسی که با داشتن آن، گیتلب اجازه دانلود خروجیها را به ما خواهد داد، باید به قسمت تنظیمات گیتلب برویم و آنرا تولید کنیم. بر روی نام کاربری خود در گوشه بالای سمت راست صفحه کلیک کرده و گزینه تنظیمات را بزنید.
سپس از منوی سمت چپ، وارد بخش Access Tokens
شوید :
در مرحله آخر هم با وارد کردن نام اکسس توکن و دادن اطلاعاتی مانند زمان منقضی شدن آن ، دکمه ایجاد توکن را بزنید تا پیامی مشابه زیر به شما نشان داده شود. اکسس توکن تولید شده را که در زیر پیام Your New Personal Access Token
قرار گرفته است کپی کنید و برای خودتان آنرا ذخیره کنید چون به دلایل امنیتی این اکسس توکن مجدداً به شما نمایش داده نخواهد شد.
شناسه پروژه و اکسس توکن را مطابق زیر در کلاس CONFIG
وارد میکنیم. سپس با استفاده از تابع get_finished_jobs
شناسه تمام کارهایی که با موفقیت در خط تولید ما به اتمام رسیدهاند را استخراج میکنیم (برای این پروژه آنرا روی کارهای پایانیافته در ۶ ساعت اخیر تنظیم کردهایم). در انتها هم با استفاده از تابع download_artifact(job_id)
به دانلود و ذخیره توئیتها میپردازیم. کدهای این بخش درون فایل data_aggregator.py
قرار گرفته است.
گام چهارم : ارسال خودکار توئیتها به گیتهاب
برای اینکه خط تولید ما کاملا خودکار شده و توئیتهای روزانه را بتوانیم در یک مخزن کد مخصوص این کار ذخیره کنیم، میتوانیم یک خط تولید دیگر در گیتلب راهاندازی کنیم که هر بیست و چهار ساعت اجرا شده، به شیوه فوق تمام خروجیها را دانلود و در گیتهاب به عنوان یک نقطه تجمیع و دسترسی، برای ما ذخیره کند. البته برای این پروژه، با توجه به اینکه فایلهای بیش از ۲۵ مگابایت به صورت مستقیم در گیتهاب آپلود نمیشوند، با توجه به حجم توئیتهای جمعآوری شده، هر شش ساعت یکبار این کار را انجام دادهام و به دلایل امنیتی، برای این کار از یک پروژه جدید در گیتلب استفاده کردهام (چون مشخصات کاربری و رمز عبور گیتهاب و اکسس توکن بنده افشا میشد از یک پروژه خصوصی مجزا استفاده کردم اما شما اگر از همان ابتدا یک پروژه خصوصی ایجاد کنید نگران این مساله نباشید و خط تولید دومتان را هم در همین پروژه به سادگی ایجاد و مدیریت کنید)
میتوانید از توابع API سرویسهایی مثل آمازون درایو، گوگل درایو، وان درایو ، دراپ باکس و مانند آن به جای گیتهاب برای ذخیره خودکار توئیتها استفاده کنید. کد زیر در همان فایل data_aggregator.py
عمل آپلود فایل زیپ تولید شده در مرحله قبل به گیتهاب را انجام میدهد :
سخن پایانی
ایده اصلی این نوشتار از این مقاله گرفته شده است که نویسنده در آن، روزانه به جمع آوری اخبار یک خبرگزاری خاص پرداخته است. شما هم میتوانید با امکانات رایگان سایت گیتلب، به جمعآوری خودکار دادههای مورد نیاز خود و ذخیره آنها بپردازید.
دکتر بنایی عزیز مثل همیشه عالی