پروژه های پایتون برای تمرین برنامه نویسی – ۱۲ تمرین از ساده تا دشوار
- - نحوه پیادهسازی بازیهای عدد ۲۱ و ۲۰۴۸ و برنامه ضبط صدا را یاد میگیرید.
- - با ساخت ربات اینستاگرام و ابزارهای ورود خودکار و کلیک خودکار آشنا میشوید.
- - نحوه کنترل اسکرول صفحه با تشخیص رنگ و استفاده از وباسکرپینگ را یاد میگیرید.
- - ساخت ماشینحساب گرافیکی با Tkinter و رسم صفحه شطرنج با Turtle را تمرین میکنید.
- - نحوه استخراج و ذخیره فریمهای ویدئو با OpenCV را یاد میگیرید.
- - با پیادهسازی پروژههای وب با جنگو و استخراج اطلاعات تماس از وب آشنا میشوید.
در این مطلب از مجله فرادرس میخواهیم چند مورد از پروژه های تمرینی پایتون را بررسی کنیم. ابتدا همه پروژه های پایتون برای تمرین را به صورت منظم دستهبندی میکنیم. سپس یک به یک هر دسته را بررسی کرده و پروژه های مربوط به آنها را اجرا میکنیم. این پروژه ها از نکات ساده شروع شده و تا پروژه های تخصصی OpenCV و جنگو ادامه پیدا میکنند.
پروژه های پایتون برای تمرین
در این مطلب میخواهیم ۱۲ پروژه مختلف پایتون را بررسی کنیم. این پروژه ها از ساده تا دشوار متغیر هستند. برای مرتب کردن پروژه ها آنها را در چند دسته اصلی قرار میدهیم.
- پروژههای پایتون ساده برای تازهکارها
- پروژه های پیشرفته پایتون
- پروژه های وب اسکرپینگ
- پروژه های TKinter و Turtle
- پروژه های OpenCV
- پروژه جنگو

در ادامه این مطلب، سعی کردهایم که برای هر کدام از دستههای بالا چند پروژه را حل کنیم.
پروژه های پایتون ساده برای تازهکارها
در این بخش میخواهیم سه پروژه پایتون ساده را حل کنیم. حل کردن این پروژه ها کمک میکند تا مهارتهای برنامه نویسی ما به میزان قابل توجهی افزایش پیدا کنند.
تمرین ۱: بازی عدد ۲۱
به این بازی، بازی «بیست به علاوه یک» نیز گفته میشود. این بازی به شکل چندنفره هم قابل انجام است اما در این بخش میخواهیم بازی را به صورت دونفره (کاربر در مقابل کامپیوتر) پیادهسازی کنیم.
دستورالعمل بازی به شکل زیر است:
- نوبتدهی: بازی بین دو بازیکن انجام میشود و هر بازیکن در نوبت خود بازی میکند.
- انتخاب اعداد: هر بازیکن در نوبت خود میتواند از ۱ تا ۳ عدد را اعلام کند.
- ترتیب اعداد: اعداد باید پشت سر هم و به ترتیب باشند. برای مثال، اعلام اعداد ۵، ۶ و ۷ مجاز است. اگر بازیکنی از یک عدد عبور کند، از بازی حذف میشود و میبازد.
- شروع شمارش: شمارش از عدد ۱ آغاز میشود و به ترتیب رو به بالا ادامه پیدا میکند. بازیکن اول باید بازی را با عدد ۱ شروع کند.
- شرط باخت: بازیکنی که مجبور شود عدد ۲۱ را اعلام کند، بازنده بازی خواهد بود.

تا به این قسمت از مطلب توضیح دادیم که کدام نوع از پروژه های پایتون برای تمرین را بررسی خواهیم کرد. در ادامه تمام پروژههای مورد نظر را یک به یک پیادهسازی میکنیم. در صورت تمایل به مطالعه مطالبی مانند این مورد، پیشنهاد میکنیم که حتما اپلیکیشن مجله فرادرس را بر روی دستگاههای همراه خود نصب کنید.
پیاده سازی بازی عدد ۲۱
در کادر پایین، نکات مهم نوشته شده در کدهای بالا را توضیح دادهایم.
- تابع nearestMultiple(num) عدد بعدی را که بر 4 بخشپذیر است، محاسبه میکند. کامپیوتر با استفاده از این مقدار میتواند از روش خود برای تشخیص بازنده بازی استفاده کند.
- تابع lose1() پیام باخت را نمایش میدهد و با اجرای دستور exit(0) برنامه را میبندد. این تابع، فقط زمانی که بازیکن بازی را ببازد یا ورودی نامعتبری را وارد کند، اجرا میشود.
- تابع check(xyz) بررسی میکند که اعداد وارد شده پشت سر هم باشند. این بررسی با سنجش اختلاف بین اعداد مجاور انجام میشود. اختلاف هر دو عدد مجاور باید برابر با ۱ باشد.
پیادهسازی کدهای بدنه و جریان بازی
در مرحله بعد با ساخت تابع اصلی پروژه میخواهیم مقدار اولیه بازی را بسازیم. اول از همه باید متغیرهای مورد نیاز را راهاندازی کنیم. سپس به بازیکن انسانی اجازه میدهیم که نوبت خود را در بازی (نفر اول یا دوم) انتخاب کند.
در کادر پایین، نکات مهم نوشته شده در کدهای بالا را توضیح دادهایم.
- تابع start1() روند بازی را کنترل میکند.
- فهرست xyz تمام عددهایی را که در طول بازی گفته میشوند نگه میدارد.
- متغیر last آخرین عدد وارد شده را پیگیری میکند.
- از بازیکن میپرسیم که میخواهد اول بازی کند (F) یا دوم (S).
پیاده سازی منطق بازی
الان زمان پیادهسازی منطق اصلی بازی رسیده است. در این منطق فرایند نوبتدهی به بازیکن و کامپیوتر اجرا میشود. دادههای ورودی اعتبارسنجی میشوند. بازی تا زمان مشخص شدن برنده و بازنده ادامه پیدا میکند. توجه کنید که این کد در داخل تابع start1() نوشته میشود و دستور خط اول if chance.upper() == "F": به شکل دقیق زیر دستور chance = input('> ') از کادر بالا قرار میگیرد.
در کادر پایین، نکات مهم نوشته شده در کدهای بالا را توضیح دادهایم.
- اگر بازیکن گزینه F را انتخاب کند، بازی را با وارد کردن یک تا سه عدد متوالی شروع میکند و سپس رایانه حرکت خود را انجام میدهد.
- اگر بازیکن گزینه S را انتخاب کند، رایانه اول شروع میکند و هر زمان که امکان داشته باشد، با کمک تابع nearestMultiple() عدد را به چهار، هشت، دوازده، شانزده یا بیست میرساند.
- تابع check() درست بودن و پشت سر هم بودن اعداد بازیکن را میسنجد.
- اگر بازیکن، اعداد نادرستی وارد کند یا عدد بیست و یک را بگوید، تابع lose1() فراخوانی میشود. این تابع بازی را تمام میکند.

کدهای مربوط به جریان اجرای بازی
سپس با پرسیدن سوال از بازیکن بازی را شروع میکنیم. اگر بازیکن تمایل به شروع بازی داشت این بازی باید تا زمان اعلام خروج توسط او ادامه پیدا کند.
در کادر پایین، نکات مهم نوشته شده در کدهای بالا را توضیح دادهایم.
- متغیر game برنامه را در حال اجرا نگه میدارد.
- حلقه تکرار پی در پی از بازیکن میپرسد که آیا میخواهد بازی تازهای را شروع کند یا خیر.
- اگر بازیکن بله بگوید، تابع start1() فراخوانی میشود.
- اگر بازیکن خیر بگوید، برنامه میپرسد که آیا میخواهد از بازی خارج شود یا به بازی ادامه دهد.
تمرین ۲:ساخت ابزار ضبط صدا با پایتون
pip install sounddeviceدر این پروژه از ماژولهای wavio و scipy هم برای ذخیره کردن فایلهای صوتی در قالبهای مرتبط استفاده خواهیم کرد. برای نصب این ابزارها میتوانیم از دستورات زیر استفاده کنیم.
pip install wavio
pip install scipy
با نصب کتابخانههای بالا مرحله تهیه پیش نیازها به پایان رسیده است. در ادامه کدهای اصلی پروژه را اجرا خواهیم کرد.

- گام اول: قبل از هر کاری باید کتابخانههای کاربردی پروژه را در فضای کدنویسی ایمپورت کنیم.
- گام دوم: در مرحله بعد باید چند متغیر اصلی را تعریف کنیم.
- نخستین متغیر، نرخ نمونهبرداری صوت است (که در بیشتر موارد بر روی ۴۴۱۰۰ یا ۴۸۰۰۰ فریم در ثانیه تنظیم میشود.).
- متغیر دوم، مدت زمان ضبط است. مدت زمان را باید بر حسب ثانیه مشخص کنیم تا ضبط صدا پس از گذشت زمان تعیین شده متوقف شود.
- گام سوم: الان آماده هستیم که کدهای مربوط به ضبط را بنویسیم. این کدها از صداهای ضبط شده، آرایه نامپای میسازند. هر کانال، مسیری مستقل برای ذخیره سیگنال صوتی است. تعداد کانالها در این مثال میتواند ۱ یا ۲ باشد.
- گام چهارم: الان کارهای مربوط به ضبط صدا را به پایان رساندهایم. نوبت به ذخیره کردن صدای ضبط شده رسیده است.
- برای ذخیره کرده فایل صوتی میتوانیم از ماژول wavio یا scipy استفاده کنیم. در پایین روش استفاده از هر دو ماژول را به صورت جداگانه آموزش دادهایم.
-
- برای تبدیل آرایه نامپای به فایل صوتی، از تابع write در کتابخانه scipy.io.wavfile استفاده میکنیم.
در کادر پایین، نسخه کامل کدهای این پروژه پایتون برای تمرین را نوشتهایم.
تمرین ۳: ساخت بازی ۲۰۴۸ در پایتون
در این قسمت از پروژه های پایتون برای تمرین میخواهیم روش پیادهسازی بازی ۲۰۴۸ را در محیط خط فرمان بررسی کنیم. بازی ۲۰۴۸ پازل تکنفرهای است که در آن کاشیهایی با مقادیر یکسان با هم ترکیب میشوند تا کاشی جدیدی با ارزش ۲۰۴۸ ساخته شود. این بازی را میتوان با استفاده از ماتریس ۴ در ۴ در پایتون پیادهسازی کرد، به طوری که تمامی عملیات بازی از طریق محیط کنسول و بدون نیاز به رابط گرافیکی انجام شود.
این پروژه از دو فایل پایتون تشکیل شده است:
- فایل logic.py: منطق بازی شامل حرکت کاشیها، ادغام آنها، تولید تصادفی کاشیهای جدید و بررسی وضعیت بازی را پیادهسازی میکند.
- فایل 2048.py: بازی را راهاندازی میکند، ورودیهای کاربر را میگیرد و صفحه بهروزرسانیشده بازی را نمایش میدهد.

خلاصه دستورالعمل بازی
ابتدا توضیح کوتاهی درباره خلاصه روش انجام بازی مینویسیم.
- ابتدا صفحه جدولی به صورت چهار در چهار داریم که میتوان آن را با هر عددی پر کرد. در آغاز، دو خانه تصادفی با عدد 2 پر میشوند و بقیه خانهها خالی میمانند.
- بازیکنان میتوانند یکی از چهار کلید را برای جابهجا کردن کاشیها فشار دهند:
- کلید W یا w برای حرکت به بالا
- کلید S یا s برای حرکت به پایین
- کلید A یا a برای حرکت به چپ
- کلید D یا d برای حرکت به راست
- پس از فشرده شدن کلیدها و حرکت دادن خانهها، یکی از خانههای خالی به شکل تصادفی با عدد دو پر میشود.
- با تکرار این روند، باید با جمع کردن اعداد مشابه، آنها را دو برابر کنیم تا در نهایت یکی از خانهها به عدد ۲۰۴۸ برسد. اگر توانستیم این کار را انجام دهیم، برنده میشویم.
- اما اگر در جریان بازی هیچ خانه خالی برای پر شدن با عدد جدید باقی نمانده باشد، بازی به پایان میرسد و میبازیم.
پیاده سازی بازی
برای پیادهسازی چهار حرکت اصلی بازی از توابع compress() و merge() و reverse() و transpose() استفاده خواهیم کرد. در کادر پایین، تمام توابع کمکی مورد نیاز برای اجرای منطق بازی را نوشتهایم. این فایل را با نام «logic.py» ذخیره کنید.
در فهرست زیر، کدهای مهم کادر بالا را توضیح دادهایم.
- تابع start_game() صفحه بازی چهار در چهار را با صفرها میسازد، نخستین عدد 2 را در یکی از خانههای خالی تصادفی میگذارد و کلیدهای کنترل حرکت را نشان میدهد.
- تابع add_new_2(mat) عدد 2 را به یک خانه خالی تصادفی اضافه میکند. اگر خانه انتخابی پر باشد، تابع آن قدر تلاش میکند تا خانه خالی پیدا شود.
- تابع get_current_state(mat) اگر کاشی با ارزش ۲۰۴۸ پیدا شود عبارت «برنده» (WON) را برمیگرداند. اگر خانههای خالی یا امکان ترکیب معتبر وجود داشته باشد مقدار «بازی تمام نشده» (GAME NOT OVER) و اگر هیچ حرکت معتبری نمانده باشد مقدار «باخته» (LOST) را برمیگرداند.
- تابع move_left(grid) کاشیها را به سمت چپ فشرده میکند، کاشیهای مجاور با ارزشهای یکسان را با هم ترکیب میکند و دوباره جدول را فشرده میکند.
- تابع move_right(grid) جدول را معکوس میکند، حرکت به سمت چپ را روی آن انجام میدهد و دوباره جدول را معکوس میکند.
- تابع move_up(grid) ابتدا سطرها و ستونهای جدول را جابهجا میکند تا بتواند با استفاده از تابع move_left()، حرکت به سمت بالا را اجرا کند. سپس جدول را به حالت اولیه برمیگرداند و جدول بهروز شده را همراه با متغیر changed برمیگرداند.
- تابع move_down(grid) ابتدا سطرها و ستونهای جدول را جابهجا میکند تا بتواند با استفاده از تابع move_right()، حرکت به سمت پایین را اجرا کند. سپس جدول را به حالت اولیه برمیگرداند و جدول بهروز شده را همراه با متغیر changed برمیگرداند.
- تابع compress(mat) تمام کاشیهای غیر صفر را به سمت چپ جابهجا میکند.
- تابع merge(mat) کاشیهای مجاور با مقادیر یکسان را با هم ترکیب میکند.
- تابع reverse(mat) هر سطر از جدول را معکوس میکند.
- تابع transpose(mat) سطرها و ستونهای جدول را با هم جابهجا میکند.
- تابع findEmpty(mat) نخستین خانه خالی را در جدول پیدا کرده و برمیگرداند.

در کادر پایین، هم کدهای مربوط به فایل اصلی اجرای بازی را نوشتهایم. این فایل را با نام «2048.py» ذخیره کنید.
در فهرست زیر، کدهای مهم کادر بالا را توضیح دادهایم.
- تابع logic.start_game() صفحه بازی را راهاندازی میکند، نخستین عدد 2 را در خانه خالی تصادفی میگذارد و کلیدهای کنترل حرکت را نمایش میدهد.
- تابع logic.move_up(mat) همه کاشیها را با فشردهسازی و ترکیب کردن، طبق قوانین بازی به سمت بالا حرکت میدهد.
- تابع logic.move_down(mat) همه کاشیها را با فشردهسازی و ترکیب کردن، طبق قوانین بازی به سمت پایین حرکت میدهد.
- تابع logic.move_left(mat) همه کاشیها را با فشردهسازی و ترکیب کردن طبق قوانین بازی به سمت چپ حرکت میدهد.
- تابع logic.move_right(mat) همه کاشیها را با فشردهسازی و ترکیب کردن طبق قوانین بازی به سمت راست حرکت میدهد.
- تابع logic.get_current_state(mat) بررسی میکند که آیا بازیکن برنده شده است، بازی باید ادامه پیدا کند یا هیچ حرکت معتبری باقی نمانده است.
- تابع logic.add_new_2(mat) پس از هر حرکت معتبر، عدد 2 جدید را در یکی از خانههای خالی تصادفی قرار میدهد.
- اگر کاربر کلیدی به جز W یا A یا S یا D (چه بزرگ و چه کوچک) وارد کند، برنامه عبارت «Invalid Key Pressed» را چاپ میکند.
چطور پایتون را در فرادرس بگیریم؟
فرادرس بزرگترین تولیدکننده محتوای آموزشی آنلاین در ایران است که هزاران فیلم آموزشی در موضوعات مختلف منتشر کرده است. آموزشهای پایتون نیز بخشی از این محتوا را تشکیل میدهند. این زبان برنامه نویسی کاربردهای گستردهای دارد و متخصصان آن در حوزههای مختلفی فعالیت میکنند.
فرادرس مجموعهای از فیلمهای آموزشی پایتون را از سطح مقدماتی تا پیشرفته ارائه کرده است. با مشاهده این آموزشها و تمرین مستمر میتوانید مهارت خود را ارتقا دهید و برای ورود به فرصتهای شغلی متنوع آماده شوید.
در پایین چند مورد از فیلمهای مربوط به مجموعه آموزشی پایتون را معرفی کردهایم.
- فیلم آموزش رایگان پایتون، برنامه نویسی سریع و آسان در ۱۴۰ دقیقه + گواهینامه
- فیلم آموزش پروژه محور پایتون، حل ۲۰ مسئله کاربردی در برنامه نویسی + گواهینامه
- فیلم آموزش برنامه نویسی پایتون پیشرفته، بررسی ترفندهای Python + گواهینامه
- فیلم آموزش ساخت ربات تلگرام با پایتون Python، دوره تکمیلی
- فیلم آموزش رایگان پروژه محور پایتو، درباره حل مسئله جرم-فنر-دمپر به روش رانگ کوتا
در ادامه چند مورد پیشرفته از پروژه های پایتون برای تمرین را بررسی خواهیم کرد.
پروژه های پیشرفته پایتون
اجرای پروژه های پیشرفته تاثیر زیادی در ارتقای مهارتهای برنامه نویسی پایتون دارند. به عنوان چند نمونه از پروژه های پایتون برای تمرین، میتوانید رباتهایی برای توییتر، واتساپ و تلگرام بسازید. همچنین میتوانید ابزارهایی مانند «ربات لاگین خودکار به حساب کاربری» (Auto Login Bot) یا «کلیک خودکار» (Auto Clicker) را طراحی کنید. این پروژه ها کمک میکنند تا همزمان با ساخت ابزارهایی برای کارهای واقعی، مهارتهای پیشرفتهتری در پایتون بیاموزید.
تمرین ۴: ربات اینستگرام
با کمک دستور زیر میتوانید ماژول InstaPy رو داخل سیستم نصب کنید.
pip install instapyقبل از هر کاری با کدهای زیر، اسکریپت پایتون درست میکنیم. بجای عبارتهای your username نام کاربری و your password رمز عبور خود را وارد میکنیم. به محض اینکه این اسکریپت را اجرا کنیم، پایتون وارد حساب کاربری میشود.
بعد از متصل شدن InstaPy به اینستاگرام میتوانیم وضعیت اتصال اینترنت و سرورهای اینستاگرام رو هم بررسی کنیم. البته متصل شدن InstaPy به اینستاگرام چند دقیقه طول میکشد.

لایک کردن پستها
کد زیر برای لایککردن پستهایی است که از هشتگهای #dance یا #mercedes استفاده کردهاند. برای اجرای این عملیات از تابع like_by_tags() کمک میگیریم.
همینطور که مشاهده میکنید پارامتر اول این تابع، لیستی از هشتگهایی است که باید پستهای مربوط به آنها را لایک کنیم. پارامتر دوم هم بیشینه تعداد پستهایی است که ربات اجازه دارد لایک کند.

تابع دیگری هم به نام set_dont_like() وجود دارد. میتوانیم از این تابع برای جلوگیری از لایک کردن پستهایی استفاده کنیم که هشتگهای نامناسب دارند یا در توضیحات یا نظرات نویسنده پست، واژههای نامناسب به کار برده شدهاند.
نوشتن کامنت
برای نوشتن کامنت در اینستاگرام با کمک InstaPy باید از تابع set_do_comment() (برای فعال کردن امکان کامنتگذاری) استفاده کنیم. سپس با استفاده از تابع set_comments() به ربات میگوییم که از چه کامنتهایی استفاده کند.
فالو کردن
با استفاده از تابع set_do_follow() میتوانیم نویسندههای پستها را هم فالو کنیم.
تنظیم تعامل
در مرحله بعد، باید از تابع set_user_interact() استفاده کنیم تا رفتار واقعی ربات پس از یک بار تعامل با رابط کاربری مشخص شود. در این تابع، مقدار amount تعداد پستهایی را مشخص میکند که ربات در هر پروفایل با آنها تعامل خواهد داشت.
نکته: ابتدا باید «تنظیمات پیکربندی» (Configuration) را انجام دهید و سپس بخش فعالیتها را فراخوانی کنید. در ضمن، باید تنظیمات «تعامل» (Interaction) را نیز مشخص کنید. یعنی اینکه پس از پیکربندی سشن، باید فعالیتهای مورد نظر خود را انجام دهید. در غیر این صورت، ربات فقط پستها را لایک میکند، ولی کامنت نمیگذارد یا کاربران را دنبال نمیکند.
پایان کار ربات
بعد از به پایان رساندن عملیات و نوشتن دستورات مربوط به ربات خیلی مهم است که سشن باز شده را ببندیم. برای این کار فقط کافی است که از دستور end() استفاده کنیم.
تمرین ۵: اشتراکگذاری فایل
در این بخش یاد میگیریم چگونه با استفاده از پایتون، اپلیکیشنی ساده برای اشتراکگذاری فایل بسازیم. در این پروژه از ماژولها و کتابخانههای زیر استفاده میکنیم:
- ماژول HTTPServer سروری بر پایه socketserver است. این ماژول با استفاده از سوکت HTTP، اتصالها را برقرار میکند و به درخواستها گوش میدهد.
- ماژول socketserver فرایند نوشتن سرورهای شبکه را سادهتر میکند.
- ماژول webbrowser امکان باز کردن و نمایش اسناد وب را فراهم میکند. برای این کار میتوانیم تابع open() را فراخوانی کنیم.
- ماژول pyqrcode امکان ساخت بارکد «کیو آر کد» (QR Code) را تنها با دو خط کد فراهم میکند.
- ماژول OS امکان تعامل با سیستم عامل را به پایتون میدهد. با استفاده از این ماژول میتوان فایلها را باز کرد، با مسیر فایلها کار کرد و تمام خطوط فایلها را در خط فرمان خواند.
- کتابخانه PyPNG امکان خواندن و نوشتن فایلهای تصویری PNG را با استفاده از پایتون فراهم میکند.
نصب ماژولهای شخص ثالث
برای نصب ماژولهای موردنیاز، دستورهای زیر را در خط فرمان اجرا کنید:
pip install pyqrcode
pip install pypngوارد کردن ماژولهای موردنیاز
برای اجرای پروژه، ماژولهای زیر را وارد کنید:
- ماژولهای http.server و socketserver برای راهاندازی سروری به کار میروند که از طریق مرورگر میتوانید به آن دسترسی داشته باشید.
- ماژول pyqrcode برای ساخت کیو آر کد به کار برده میشوند.
- ماژول png برای تبدیل QR Code به فایل PNG استفاده میشود.
- از ماژول os هم برای تعامل با سیستمعامل استفاده خواهیم کرد.

کدهای اجرای پروژه در پایین نوشته شدهاند.
فایل پایتون حاوی کد بالا را روی رایانه خود باز کنید. با این کار، «بارکد کیوآر» (QR Code) تولید خواهد کرد. اکنون یا کیو آر کد را اسکن کنید و یا نشانی IP نمایشداده شده در «شل پایتون» (Python Shell) را در مرورگر تلفن همراه خود وارد کنید. به سادگی با اسکن کردن این کد یا رفتن به آدرس IP داده شده در مرورگر موبایل میتوانید بین کامپیوتر و موبایل خود فایلها را جابهجا کنید.
نکته ۱: توجه کنید که این کدها فقط برای اتصال بین دو سیستم مختلف بر روی یک شبکه محلی استفاده میشوند. امکان استفاده از آنها بر روی اینترنت وجود ندارد. برای دسترسی از طریق اینترنت، میتوانید وبسرور را به شبکه خصوصی VPN متصل کنید. در این حالت، آدرس QR باید از طریق VPN قابل دسترسی باشد، نه آدرس محلی که این کد بهتنهایی تشخیص میدهد.
پروژه های وب اسکرپینگ
وب اسکرپینگ به برنامه نویسان کمک میکند تا اطلاعات با ارزشی را از وبسایتها بدست بیاورند. «وب اسکرپینگ» (Web Scraping) عملیات جمعآوری داده از سایتها را خودکارسازی میکند. در این بخش، دو پروژه حرفهای و کوتاه درباره وباسکرپینگ را بررسی خواهیم کرد.
تمرین ۶: اسکرول صفحه با تشخیص رنگ در پایتون
برای اجرای این پروژه از دو ماژول زیر کمک میگیریم.
- OpenCV
- PyAutoGUI
برای انجام برخی کارها در کامپیوتر، لازم نیست حتما از ماوس یا تاچپد استفاده کنید. برای مثال، میتوانید با استفاده از پایتون و وبکم، اسکرول صفحه را کنترل کنید. در این پروژه از ماژول OpenCV برای تشخیص رنگ و از ماژول PyAutoGUI برای کنترل اسکرول استفاده میکنیم. برنامه تصویر وبکم را به صورت پیوسته بررسی میکند و با تشخیص ناحیهای به رنگ مشخص، حرکت آن را دنبال میکند. سپس با توجه به جهت حرکت ناحیه رنگی، صفحه را به بالا یا پایین اسکرول میکند.

در کار زیر کدهای مربوط به این برنامه را نوشتهایم.
مهمترین مراحل اجرای کدهای بالا را در فهرست پایین توضیح دادهایم.
- ابتدا ماژولهای موردنیاز را وارد میکنیم.
- برای دریافت تصویر از وبکم، از تابع cv2.VideoCapture() استفاده میکنیم. به طور معمول عدد 0 در پارامتر اول این تابع به وبکم پیشفرض اشاره میکند. در این کد، از cv2.CAP_DSHOW نیز برای دسترسی به دوربین در ویندوز استفاده میکنیم.
- با استفاده از تابع cap.read()، فریمهای ویدیو را دریافت میکنیم. این تابع، تصویر هر فریم و وضعیت دریافت آن را برمیگرداند.
- از خط ۲۱ تا ۲۳ بررسی میکنیم که اگر دریافت فریم موفق نباشد، از حلقه خارج میشویم.
- با استفاده از تابع cv2.cvtColor() ، فضای رنگی تصویر را از BGR به HSV تبدیل میکنیم تا تشخیص رنگ موردنظر آسانتر شود.
- با تابع cv2.inRange()، ماسکی میسازیم که نواحی دارای رنگ قهوهای در محدوده تعیینشده را مشخص میکند. این محدوده برای تشخیص رنگ قهوهای در نظر گرفته شده است، اما نتیجه به نور محیط و رنگ واقعی جسم نیز وابسته است.
- با استفاده از تابع cv2.findContours()، خطوط دور خارجی نواحی مشخص شده در ماسک را استخراج میکنیم.
- در خطوط ۳۲ تا ۳۶ به کمک حلقه for، خطوط دور را بررسی میکنیم و مساحت هر ناحیه را با تابع cv2.contourArea() به دست میآوریم. در این برنامه، فقط اولین ناحیه با مساحت بیشتر از ۱۰۰۰ پیکسل را بررسی میکنیم.
- با تابع cv2.boundingRect()، مستطیلی پیرامون ناحیه رنگی رسم میکنیم. سپس مختصات عمودی آن را با مختصات فریم قبلی مقایسه میکنیم. اگر ناحیه به سمت بالا حرکت کرده باشد، با دستور pyautogui.scroll(-3) صفحه را به پایین اسکرول میکنیم. اگر ناحیه به سمت پایین حرکت کرده باشد، با دستور pyautogui.scroll(3) صفحه را به بالا اسکرول میکنیم.
- با استفاده از تابع cv2.imshow()، تصویر وبکم را نمایش میدهیم. برای دریافت و نمایش پیوسته فریمها، از حلقه while استفاده میکنیم. با کمک تابع cv2.waitKey()، فشرده شدن کلید q را بررسی میکنیم تا بتوانیم برنامه را متوقف کنیم. همچنین بسته شدن پنجره تصویر را بررسی میکنیم.
- در پایان، اتصال به وبکم را با تابع cap.release() آزاد میکنیم و با تابع cv2.destroyAllWindows() پنجرههای OpenCV را میبندیم. این دستورات را در بخش finally قرار میدهیم تا حتی در صورت رخ دادن خطا نیز بتوانیم منابع را آزاد کنیم.

تمرین ۷: واکشی داده از گوگل مپ با پایتون
در این مورد از پروژه های پایتون برای تمرین میآموزیم که چگونه اطلاعات را از «گوگل مپ» (Google Maps) جمعآوری کنیم. این اطلاعات میتوانند شامل نامها، امتیازها، توضیحات، نظرات، نشانیها، شمارههای تماس و موارد دیگر باشند.
در فهرست زیر، ماژولهای مورد نیاز برای اجرای این پروژه را معرفی کردهایم.
- «سلنیوم» (Selenium): سلنیوم برای خودکارسازی آزمایشها به کار میرود، اما میتوانیم از آن برای جمعآوری دادهها نیز استفاده کنیم. با بهکارگیری سلنیوم میتوانیم کارهایی مانند کلیک کردن، اسکرول کردن و کار با بخشهای مختلف صفحات وب را به صورت خودکار انجام دهیم.
- «درایور وب یا کروم» (Web/Chrome Driver): سلنیوم برای برقراری ارتباط با مرورگر انتخاب شده به درایور وب نیاز دارد. درایورهای وب از پروتکل ارتباطی مشترکی برای تعامل با «سرور وب راه دور» (Remote Web Server) استفاده میکنند. به این منظور باید درایور مناسب مرورگر دلخواه خود را پیدا و نصب کنید تا ارتباط میان سلنیوم و مرورگر برقرار شود.
در فهرست زیر، چند مورد از مهمترین دستورات مورد استفاده در این نوع پروژهها را نوشتهایم.
- برای دریافت نام مکان از دستور زیر استفاده میکنیم.
- برای دریافت امتیاز مکان از دستور زیر استفاده میکنیم.
- برای واکشی توصیف مکان از دستور زیر استفاده میکنیم.
- برای واکشی آدرس مکان از دستور زیر استفاده میکنیم.
- برای دریافت شماره تماس مکان از دستور زیر استفاده میکنیم.
- برای دریافت نظرات مربوط به مکان از دستور زیر استفاده میکنیم.
در ادامه بعضی از کدهای بالا را پیادهسازی خواهیم کرد.
مثال اول: دریافت نام و آدرس
در این مثال میخواهیم نام و آدرس دو مکان جغرافیایی را بدست بیاوریم.
بعد از اجرای کدهای بالا خروجی زیر در ترمینال ظاهر میشود.
1 - City Theatre
Address: Tehran Province, Tehran, District 11, Enghelab St, Iran
2 - Saat Square
Address: East Azerbaijan Province, Tabriz, Nowbar, Emam St, 37FW+MF4, Iranمثال دوم: دریافت نام و شماره تلفن
در این مثال میخواهیم نام و شماره تلفن دو مکان جغرافیایی را بدست بیاوریم.
بعد از اجرای کدهای بالا خروجی زیر در ترمینال ظاهر میشود.
1 - Children's Medical Center
Contact Number: +98 21 6147 9000
2 - Firouzgar Hospital Genetic Lab
Contact Number: +98 919 116 1744پروژه های TKinter و Turtle
تمرین ۸: ساخت ماشین حساب با TKinter
در این قسمت از پروژه های پایتون برای تمرین میخواهیم با استفاده از ماژول Tkinter، ماشینحساب گرافیکی سادهای بسازیم که بتواند عملگرهای اصلی ریاضی شامل جمع، تفریق، ضرب و تقسیم را انجام دهد.
برای ساخت اپلیکیشن با Tkinter باید مراحل زیر را دنبال کنید:
- ایمپورت کردن ماژول tkinter
- ایجاد پنجره اصلی
- افزودن تعداد دلخواهی از «ویجتها» (Widgets) به پنجره اصلی
- اعمال «رویدادها» (Event Triggers) روی ویجتها

ظاهر رابط گرافیکی به شکل زیر خواهد شد:

در ادامه کد پیادهسازی ماشین حساب را پیادهسازی کردهایم.
در فهرست زیر به شکل مختصر مهمترین نکات کدهای بالا را توضیح دادهایم.
- تابع press(key) ورودی را به عبارت اضافه میکند و نمایشگر را بهروزرسانی میکند، تابع equal() عبارت را ارزیابی کرده و نتیجه یا خطا را نشان میدهد و تابع clear() همهچیز را بازنشانی میکند.
- پنجره اصلی را با عنوان، اندازه، رنگ پسزمینه و «متغیر رشتهای» (StringVar) متصل به ویجت ورودی برای نمایش ورودی و خروجی راهاندازی میکنیم.
- دکمههای عددی (0 تا 9) در یک شبکه مرتب شدهاند و هر کدام تابع press() را با شماره خود فراخوانی میکنند.
- دکمههای عملگر + و - و * و / در شبکه قرار گرفتهاند. هر کدام از دکمهها تابع press() را با نماد عملگر فراخوانی میکنند.
- دکمههای اضافی شامل علامت مساوی برای راهاندازی محاسبات، دکمه پاک کردن صفحه (Clear) برای بازنشانی و نقطه (.) برای افزودن ممیز هستند.
- از تابع grid() برای جایگذاری مرتب دکمهها با اندازه و رنگ یکنواخت استفاده کرده و حلقه رویداد اصلی tkinter را اجرا میکنیم.
تمرین ۹: طراحی صفحه شطرنج با Turtle
ماژول Turtle یکی از ماژولهای توکار در پایتون است که امکان رسم اشکال را با استفاده از صفحه به عنوان بوم و لاکپشت به عنوان قلم فراهم میکند. برای کشیدن هر چیزی روی صفحه، باید لاکپشت را حرکت دهیم. توابعی مانند forward() و backward() با هدف حرکت دادن لاکپشت، ارائه شدهاند.
برای رسم صفحه شطرنج، مراحل زیر را به ترتیب انجام میدهیم.
- ماژول turtle را وارد میکنیم و شیهای بوم و لاکپشت را میسازیم.
- اندازه صفحه رسم و سرعت حرکت لاکپشت را تنظیم میکنیم.
- تابعی برای رسم و رنگآمیزی مربعها تعریف میکنیم.
- با استفاده از دو حلقه تو در تو، ۸ ردیف و ۸ ستون از مربعها را رسم میکنیم. رنگ مربعها را بر اساس موقعیت آنها به صورت یکیدرمیان سیاه و سفید انتخاب میکنیم.
- پس از پایان رسم، شی لاکپشت را پنهان میکنیم.
- با فراخوانی turtle.done() پنجره رسم را باز نگه میداریم تا کاربر آن را ببندد.
در ادامه کد پیادهسازی را نوشتهایم:
بعد از اجرای کدهای بالا خروجی به شکل زیر ساخته خواهد شد.

پروژه های OpenCV
در این بخش از مطلب پروژه های پایتون برای تمرین، سعی کردهایم دو پروژه کاربردی از OpenCV را پیادهسازی کنیم. با تمرین روی این پروژه ها علاوه بر اینکه به حل مسائل واقعی میپردازید مهارت و درک خود را از کار با OpenCV نیز ارتقا میدهید.
تمرین ۱۰: استخراج فریم از ویدئو با کمک OpenCV
در این بخش از پروژه های پایتون برای تمرین، یاد میگیریم چگونه فریمهای ویدیو را به صورت تصویر استخراج کنیم. با استفاده از پایتون و کتابخانه OpenCV میتوان فریمها را به ترتیب از فایل ویدیویی یا تصاویر دریافتی از دوربین استخراج کرد. سپس میتوانیم هر فریم را در فایل تصویری جداگانه ذخیره کنیم.
از این روش در پروژههای مختلفی مانند بررسی حرکت، ردیابی اشیا و ساخت مجموعهداده برای آموزش مدلهای یادگیری ماشین استفاده میشود. برای اجرای این وظیفه از کتابخانههای زیر استفاده خواهیم کرد.
- OpenCV
- OS
با استفاده از دستور pip میتوانیم OpenCV را بر روی سیستم خود نصب کنیم.
pip install opencv-python
کدهای مربوط به این پروژه حرفهای و ساده را در پایین نوشتهایم.
در فهرست زیر، مهمترین نکات کدهای بالا را توضیح دادهایم.
- دستور cv2.VideoCapture("path") فایل ویدیویی را باز میکند و شیئی برای ضبط میسازد.
- دستور vid.read() فریم بعدی ویدیو را میخواند و دو مقدار برمیگرداند.
- مقدار اول، success، مشخص میکند که خواندن فریم موفق بوده است یا نه.
- مقدار دوم، تصویر فریم است که در متغیر image ذخیره میشود.
- بررسی if success تضمین میکند که پیش از ذخیرهسازی، تنها فریمهای معتبر پردازش شوند.
- ترکیب cv2.imwrite(f"frame{count}.jpg", image) و count += 1 هر فریم را به عنوان تصویری با نام افزایشی ذخیره میکند.
- دستور vid.release() اتصال به ویدیو را قطع میکند و پس از پایان استخراج، منابع سیستم را پس میگیرد.
تمرین ۱۱: کشف و استخراج متن از عکس با OpenCV و OCR
فناوری «تشخیص نوری حروف» (Optical Character Recognition | OCR) برای استخراج متن از تصاویر به کار میرود. این فناوری در کارهایی مانند دیجیتالی کردن اسناد، پلاکخوانی و ورود خودکار دادهها استفاده میشود. در این قسمت از پروژه های پایتون برای تمرین، بررسی میکنیم که چگونه با استفاده از «OpenCV» و «Tesseract OCR»، میتوانیم حروف و کلمات را از درون تصویر شناسایی و استخراج کنیم.
پیش از شروع لازم است با استفاده از دستورهای زیر، کتابخانههای مورد نیاز را نصب کنید:
!pip install opencv-python
!pip install pytesseract
!sudo apt-get install tesseract-ocr
گام اول: وارد کردن بستههای مورد نیاز
کتابخانههای مورد نیاز پایتون مانند OpenCV یا cv2 و pytesseract و matplotlib را وارد کنید.
گام دوم: بارگذاری عکس
اکنون میخواهیم با استفاده از تابع cv2.imread() عکس را در برنامه بارگذاری کنیم. کتابخانه OpenCV عکسها را در فرمت BGR بارگذاری میکند. اما matplotlib برای کار به فرمت RGB نیاز دارد. بنابراین باید با استفاده از تابع cv2.cvtColor() فرمت عکس را به فرمت درست تبدیل کنیم.
گام سوم: تبدیل عکس به حالت خاکستری
با تبدیل کردن عکس به مقیاس خاکستری، عکس سادهتر شده و اطلاعات مربوط به رنگها از آن حذف میشوند.
بعد از تبدیل کردن عکس به خاکستری تصویر زیر نمایش داده میشود:

گام چهارم: نمایش عکس اصلی
در این مرحله عکس اصلی را با کمک کتابخانه Matplotlib نمایش میدهیم.
بعد از اجرای کدهای بالا خروجی زیر نمایش داده میشود.

گام پنجم: استخراج متن از عکس
در این مرحله برای استخراج متن از عکس از تابع pytesseract.image_to_string() کمک میگیریم.
نکته: با اختصاص رشته eng+fas به پارامتر lang در واقع به کامپیوتر میگوییم که هر دو متون فارسی و انگلیسی را استخراج کن. اگر بخواهیم فقط یکی از این متون استخراج شوند باید این بخش از کد را به صورت lang="eng" یا lang="fas" بنویسیم.
بعد از اجرای دستور بالا خروجی زیر در کنسول پایتون نمایش داده میشود. همینطور که میبینید به طرز جالبی کل متن فارسی شناسایی شده است. اما متن انگلیسی ناقص است. به احتمال زیاد تغییر رنگ پسزمینه متن انگلیسی در این مسئله، تاثیر دارد.
Extracted Text:
مجله فرادرس، مجله جوانان
5 ‘a Rashidiگام ششم: رسم خط به دور متن کشف شده در عکس اصلی
اکنون میخواهیم به دور تمام کلمات کشف شده یک به یک بچرخیم و کادری به رنگ آبی رسم کنیم. برای انجام این عملیات هم از تابع cv2.reactangle استفاده میکنیم.
گام هفتم: نمایش عکس با کلمات کادر بندی شده
در نهایت هم تصویر اصلی را همراه با کلمات کادر بندی شده در خروجی نمایش میدهیم.
بعد از اجرای کدهای بالا، تصویر زیر در خروجی نمایش داده میشود. همینطور که میبینید در کادر پایین، به دور حروف انگلیسی با پسزمینه کرمی رنگ کادر آبی کشیده نشده است. این حروف اصلا از متن استخراج نشدهاند. در ضمن، کلمه «جوانان» هم با اینکه در بخش بالا به درستی استخراج شده است اما کادر آبی ندارد. به منظور برطرف کردن این خطاها میتوانید به صورت شخصی بر روی کدهای نوشته شده در بالا کار کنید.

یادگیری بهتر پایتون با اجرای پروژه های واقعی
یادگیری پایتون زمانی کاملتر میشود که بتوانید مفاهیم و مهارتهای مختلف را در پروژههای عملی به کار بگیرید. فرادرس با آموزش پروژهمحور پایتون، نحوه استفاده ترکیبی از کتابخانهها و ساختارهای مختلف این زبان را آموزش میدهد. در ادامه، چند مورد از این آموزشها را معرفی میکنیم.
- فیلم آموزش ساخت داشبورد هوش تجاری با Streamlit، پروژه عملی + گواهینامه
- فیلم آموزش سیستم های کنترلی در پایتون، طراحی و پیاده سازی کنترلر PID
- فیلم آموزش پروژه محور پایتون، ایجاد QR Code و اسکن آن با ۴ کتابخانه Python
- فیلم آموزش پیاده سازی ربات معامله گر با مدل SVM در پایتون
- فیلم آموزش ساخت چت روم با سوکت نویسی در پایتون، Socket Programming در Python
در بخش بعد از پروژه های پایتون برای تمرین به سراغ اجرای پروژه کاربردی و حرفهای از جنگو میرویم.
پروژه جنگو
تمرین ۱۲: وب اپلیکیشن اعلام آب و هوا
در این بخش میخواهیم با کمک فریمورک «جنگو» (Django)، اپلیکیشنی برای اعلام آبوهوا به صورت آنلاین بسازیم. این وباپلیکیشن به کاربران اجازه میدهد هر شهری را جستجو کرده و جزئیات آبوهوای فعلی آن شامل دما، رطوبت، فشار و شرایط جوی را مشاهده کنند.
اپلیکیشن اعلام آب و هوا، دادههای زنده را از API مربوط به سایت OpenWeatherMap دریافت میکند و آنها را در رابط کاربری ساده و کاربرپسندی به نمایش میگذارد. علاوه بر این، اپلیکیشن جستجوهای اخیر را پیگیری میکند و به کاربران امکان میدهد به سرعت ۵ شهر آخر جستجو شده خود را به همراه جزئیات آبوهوای آنها ببینند.
گام اول: پیکربندی اپلیکیشن و تعریف مدل
پروژهای به نام «weather» را در نظر بگیرید که اپلیکیشنی به نام «main» دارد. پس از راهاندازی پروژه و اپلیکیشن، main را به فهرست INSTALLED_APPS در فایل «settings.py» اضافه کنید. پس از انجام این کار، وقت ساخت مدلی برای ذخیره دادهها در اپلیکیشن است.
کدهای زیر را در فایل «main/models.py» وارد کنید.
مهمترین عملیات مربوط به کدهای بالا را در فهرست پایین توضیح دادهایم.
- این مدل نام شهر، دما، رطوبت، فشار، توضیحات و زمان جستجوها را در متغیرهایی با نامهای با معنی ذخیره میکند.
- وظیفه مدل SearchHistory این است که به پیگیری جستجوهای اخیر کمک کرده و به صورت اختیاری دادهها را برای کاهش تعداد درخواستهای API ذخیره میکند.
Python manage.py makemigrations
Python manage.py migrateگام دوم ساخت ویو
کدهای زیر را در داخل فایل «views.py» بنویسید.
در فهرست پایین مهمترین نکات کدهای بالا را توضیح دادهایم.
- تابع index(request): تابع نمای اصلی است که درخواستهای GET و POST را برای اپلیکیشن آبوهوا مدیریت میکند.
- دستور requests.get(...): این دستور در خطوط ۲۵ تا ۳۴ نوشته شده است. درخواست HTTP را به API وبسایت «OpenWeatherMap» میفرستد و دادههای آبوهوایی را به صورت زنده در قالب JSON دریافت میکند.
- دستور response.json(): پاسخ API را برای دسترسی آسان به دیکشنری پایتون تبدیل میکند.
- دستور SearchHistory.objects.order_by('-searched_at')[:5]: پنج جستجوی اخیر شهرها را از پایگاه داده بازیابی میکند.
- دستور SearchHistory.objects.create(...): ورودی جدید جستجوی آبوهوا (شامل نام شهر، دما و غیره) را در پایگاه داده ذخیره میکند.
- تابع render(request, "main/index.html", {...}): قالب HTML را رندر میکند و دادههای آبوهوا، جستجوهای اخیر و پیامهای خطا را به عنوان متغیرهای زمینه انتقال میدهد.

گام سوم: پیکربندی «نشانیهای وب» (URLs)
در فایل «weather/urls.py» این کدها را وارد کنید.
گام چهارم: تعریف URL-ها برای تابع main
فایلی با نام «urls.py» در دایرکتوری main بسازید. سپس کدهای زیرا داخل این فایل بنویسید:
گام پنجم: ساخت قالب مناسب
اول از همه باید فایل «index.html» را داخل مسیر «main/templates/main» بسازید. سپس کدهای زیر را داخل این فایل وارد کنید.
مهمترین نکات کدهای بالا را در فهرست پایین بررسی کردهایم.
- دستور <form method="post">: نام شهر وارد شده را از طریق درخواست POST به نمای جنگو ارسال میکند.
- دستور {% csrf_token %}: از فرم در برابر حملات «جعل درخواست بینسایتی» (Cross-Site Request Forgery | CSRF) محافظت میکند.
- دستور {% if error %} ... {% endif %}: در صورت وجود خطا در «زمینه» (Context)، پیام خطا نمایش میدهد.
- دستور {% if weather %} ... {% endif %}: در صورت در دسترس بودن، جزئیات آبوهوای دریافت شده (شهر، دما و غیره) را به صورت پویا نمایش میدهد.
- دستور <img src="[https://openweathermap.org/img/wn/](https://openweathermap.org/img/wn/){{ weather.icon }}@2x.png">: آیکون آبوهوا را بر اساس دادههای API نمایش میدهد.
- دستور {% if recent_searches %} ... {% for search in recent_searches %}: پنج شهر جستجو شده آخر را همراه با دما و توصیف آبوهوا فهرست میکند.
- «استایل درونخطی» (Inline CSS): طراحی اصلی چیدمان، دکمهها، متن و فاصله گذاریها را مدیریت میکند تا رابط کاربری تمیز و خوانا بماند.
گام ششم: اجرای پروژه
با اجرای دستور زیر در خط فرمان، سرور توسعه را راهاندازی کنید:
python manage.py runserverبا نوشتن آدرس http://127.0.0.1:8000 در نوارد آدرس مرورگر میتوانید از سرور توسعه بازدید کنید:

مطالب مجله فرادرس را در جستجوی گوگل سریعتر ببینید












