<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های ابوالفضل ملک پور</title>
        <link>https://virgool.io/feed/@m_974892</link>
        <description>یک برنامه نویس جوان?</description>
        <language>fa</language>
        <pubDate>2026-06-16 16:50:07</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/298295/avatar/1VfGQh.jpeg?height=120&amp;width=120</url>
            <title>ابوالفضل ملک پور</title>
            <link>https://virgool.io/@m_974892</link>
        </image>

                    <item>
                <title>آمار بازدید پست‌های من در سال ۹۹</title>
                <link>https://virgool.io/@m_974892/%D8%A2%D9%85%D8%A7%D8%B1-%D8%A8%D8%A7%D8%B2%D8%AF%DB%8C%D8%AF-%D9%BE%D8%B3%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D9%86-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-%DB%B9%DB%B9-tu3zqohxedvp</link>
                <description>در طول تاریخ از اعداد استفاده کردیم تا اغلب داد و ستد کنیم و آن‌چیزی که شمردنی است را بشماریم. برای هر عدد واحد درست کردیم تا عددهای زندگی قاطی نشوند و از اعداد، شفاف‌تر استفاده کنیم؛ مثلا وقتی می‌گوییم ده هزار تومان به پول اشاره داریم و وقتی می‌گوییم ده هزار بلیط به بلیط!روز به روز که در زندگی جلو‌تر رفتیم عددها فرقی نکردند ولی این واحدها بودند که زیاد شدند. واحد کریپتو، واحد اصله درخت، واحد فاصله و …«واحد» یک توافق عمومی است برای شمردن؛ تا همانطور که گفتم شمردن‌ها قاطی نشود. مشاهده افراد دارای ثروت (اجتماعی یا مالی) به من ثابت کرده اینکه چه چیزی را بشماریم از اینکه چطور بشماریم مهم‌تر است. هرکس با واحد خاصی مسائل زندگی را می‌شمارد. اینطور به نظرم آمده که مشخص کردن واحد یعنی مشخص کردن اینکه من در زندگی برای چه چیزهایی ارزش قائلم و می‌خواهم چه چیزهایی را در زندگی بشمارم. https://cdn.virgool.io/annual-report/1399/nmcumgyxg6yp-Cqeng.mp4 اعدادی که بدون واحد ثبت کردمبه ویدیویی که ویرگول برایم ساخته که نگاه می‌کنم میبینم که در سال ۹۹، من در مجموع ۹,۹۵۲ کلمه در ویرگول نوشتم و منتشر کردم و مخاطبین، پست‌های من را ۲۸ مرتبه پسندیدند و  ۸ بار هم نظر خود را روی پست‌های من به اشتراک گذاشتند. در سال ۹۹، ۴ نفر در ویرگول من را دنبال کردند تا پست‌های بعدیم را بخوانند. این اعداد نشان میدهند من کاری کرده‌ام. هرکدام به واحدی وصل هستند. از خودم می‌پرسم من کدام واحد را شمارش کرده‌ام؟ کدامیک از واحدهای بالا از همه برای من مهم‌تر است؟ ادامه ویدیو را می‌بینم.آمار از اثر بیرونی می‌گویندطبق آمار پست‌های من ۴۸۷ بار خوانده شدند و ۱۷,۹۲۹ ثانیه صرف مطالعه آنها شده است، که با توجه به جمعیتی که در ایران به اینترنت دسترسی دارند، ویرگول به من می‌گوید که توانستم  ۰/۰۰۰۲۴۵۸۰۵ ثانیه، سرانه مطالعه دیجیتال کشور را بالا ببرم.از طرف دیگر ویرگول به من می‌گوید که اگر قرار بود پست‌هایم را چاپ و به دست تک تک خوانندگان برسانم باید ۱,۷۶۹ کاغذ مصرف می‌کردم.آن عددهای کوچک ابتدای ویدیو حالا تبدیل شده‌اند به عددهای بزرگ به اینکه من جلوی مصرف این تعداد کاغذ را گرفتم یا به اینکه من  ۰/۰۰۰۲۴۵۸۰۵ ثانیه، سرانه مطالعه دیجیتال کشور را جابه جا کرده‌ام. واحد این عددها برای من ملموس‌تر است.واحد نوشتن چیست؟همه عددهای بالا و همینطور اثر بیرونی که روی خوانندگان و همینطور در مقیاس بزرگتر طبیعت و جامعه اطرافم گذاشتم اعدادی هستند که من دوستشان دارم و به آنها افتخار می‌کنم. اگر چنین ویدیویی دست شما نیز رسید به شما بابت تک تک اعداد تبریک می‌گویم.اثر هر نوشته تا حدودی معلوم است، اگر بنویسید جلوی قطع درخت را می‌گیرید، به سرانه مطالعه کشور اضافه می‌کنید و خوانندگانی جذب می‌کنید که شما را از طریق نوشته‌هایتان می‌شناسند و …به نظرم می‌رسد که نوشته‌های من و شما واحد ندارند ولی اثر بیرونی دارند.</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Sun, 04 Apr 2021 11:46:29 +0430</pubDate>
            </item>
                    <item>
                <title>جوک سری ۳</title>
                <link>https://virgool.io/Laughterfriends/%D8%AC%D9%88%DA%A9-%D8%B3%D8%B1%DB%8C-%DB%B3-kwdx4d0dc4ou</link>
                <description> طرف عکس مومو گذاشته پروفایل دوس دخترش......بعد به زن و بچش گفته خیلی مراقب باشین،اگه این زنگ زد نه جواب بدین نه پیاماشو باز کنین...مرد ایرانی مرد لحظه هاجک خنده دار‏بابام گفت بیا یاد بگیر چجوری جارو برقی رو درست میکنم وقتی زن گرفتی بکارت میاد. وقتی کارش تموم شد و زدش به برق روشن نشد. گفتم این که درست نشدگفت آخه کی به تو زن میده که نگاه میکنی؟خنده دار ترین جک هاکی میگه ما مردا احساسات نداریم؟من خودم بارها و بارها احساس تشنگی کردمشاید باورتون نشه ولی احساس گشنگی هم می کنم !جک خنده داریعنی من خودم رو یه یک لحظه جای این دخترای مجرد میزارمخیلی حالم گرفته میشه که پسر خوشتیپ و خوشگل و تحصیل کرده ای مثل منقصد ازدواج نداره !!مطالب طنز و خنده دار‏مامانم میگه جارو‌برقی بکش، میکشم، اتو کن، اتومیکنم، گردگیری کن، غذا بپز و......تموم که شد، میگه ولی چقدر کار داشتیمااا پاشو چایی بذار خستگیمون در برهجک خنده دار‏به شوهرم میگم :میدونی مهریه ام چند میلیارد شدهمیگه:میدونی دیه ات فقط اندازه ی بیستا از اون سکه هاستچه حاضر جواب شدهاز مسئولین خواهش میکنم دیه رو افزایش بدنجوک خنده داریه بار ندای درونم گفتم:&quot; پسر تو قیافت هیچ نقصی نداره، خودتو باور داشته باش ک چهرت زیباست&quot;. همون موقع اتفاقی از جلو آینه رد شدمو الان ۲۰سالی هست ک دیگه ندای درونم روش نمیشه حرف بزنهجکهای خنده دارشما همین الان به همسرت یا نامزدت پیام بده بگو عزیزم حس میکنم ازم ناراحتی میشه دلیل‌شو بگی؟!اگه سریع یه عیب ازت نکشید بیرون یا معجزه شده یا  ایرانی نیستی؛جوک جدید و خنده دارگهی استخدام برای چوپان شدن ؛ مدارک لازم ؛شلوار گشاد/کتری سیاه/مهارت در سوت/دبه آب/سابقه3سال اقامت درکوه/عکس با گوسفند6قطعه/درضمن داشتن سگ الزامی می باشد .نخند مدارکتو کامل کن بیکار نمونی ؟؟از درس خوندن و پول گذاشتن تو بورس که چیزی نصیبمون نشدبفرستید برای گروههای دیگه شاید گرهی باز شدجک خنده دار جدیددامپزشکان انگلیسی برای یک الاغ عینک تجویز کردندیک الاغ در انگلیس صاحب عینک طبی شد.....اونوقت من با شماره چشم هفت به بابام میگم پول بده عینک بخرم، میگه پسرم این دنیا ارزش دیدن ندارهجک خنده دارهمه رژیم‌های غذایی یه مرحله مشترک داره به اسم “ولم کن بابا مگه من چقد زنده‌م که غذاهای مورد علاقه‌مو نخورم”به اینجا برسی کارت تمومهجوکهای خنده دار و بامزهبا ماشیم بابام تصادف کردمبهش میگم چقدر مرگ به آدم نزدیکه واقعا این دنیا ارزش مادیات نداره حالا نصف ماشین هم رفت که رفت من میرم کارت اهدا عضو بگیرمبابام میگه آفرین پسرم فقط رو کلیه ات حساب نکن گذاشتم واسه فروشجک خنده دارچالش بازی مومو‌ چیه، بابا ما بچه بودیم بازی داشتیم به اسم شاه دزد وزیر! خدا نصیب نکنه اونی که دزد میشد، سیبیل آتشین براش میکشیدن تا یه ماه پشت لبش پوست پوست میشدجک های خنده داربچه بودم داشتم قدم میزدم افتادم تو چاه،با خودم گفتم منم به سرنوشت حضرت یوسف دچار شدم،گفتم خدایا چقدر ما خوشگلارو اذیت میکنی؟یکی با یه آچار زد به پام گفت یوزارسیف برو کنار له شدم.تازه فهمیدم افتادم تو چاه مکانیکیجک خنده دارنیمه پر لیوان یعنی پدر مادرها تو کرونا فهمیدن بچه‌هاشون چه بلایی سر معلماشون میارن و اینکه همشون نابغه و انیشتین نیستنخنده دار ترین جک هابراتون مهمون میاد شام هم میمونه همتونم خوشحالین؟؟یه سری خونه ما مهمون اومد نزدیک شام بابام برگشت گفت: میرسید برین خونه شام بزارین؟ دیرتون نشهدیگه هیچ وقت نیومدن خونمونجک خنده داریادش بخیر یه زمانی توو مدرسه با دوستمون هماهنگ می کردیم که :تو اجازه بگیر برو بیرون منم ۲دقیقه دیگه میام!بعد معلم عقده ای می گفت صبر کن تا دوستت بیاد بعد برو…..من که حلالشون نمی کنم!!!!!جوک های خنده دارخانمی داشت شماره های موبایل شوهرش را چک میکرد که به شماره ای بنام مومو (Momo) برخورد کرد.با کنجکاوی به این شماره زنگ زد و با تعجب دید گوشی خودش زنگ خوردمن یقرا فاتحه...جک خنده دارمرد متاهلی به سالن بدنسازی رفت و گفت ؛کجاست آن دستگاهی که بدنم را قشنگ میکند و زنم را وادار میکند که برایم بمیرد!!!مربی او را به خارج از سالن برد و دستگاه خودپرداز بانک را  نشان داد و گفت؛فقط همین یه دستگاه است که همسرت تو را دوست خواهد داشت و بقیه دستگاهها همه شایعه است!!جوک خنده دارتخمه آفتابگردون كيلويي ٣٩ تومنتسبيح دونه اي ٤٠ تومنكاپشن پفي ٤٠٠ تومنشلوار شيش جيب ٢٨٠ تومنكتوني تايگر فيك ١٨٠ تومنواسه سر كوچه علاف واستادن و تخمه شكستن تو ايران حدودا يه تومن سرمايه لازمهجک خنده دارمکالمه ای بین من و مادرم:- مامان- جونم- داشتم ماست می خوردم- نوش جونت پسرم- ریخت رو فرش- کوفتو بخوری نکبت؛ خاک تو سرت….جوک خنده داررفتم ساندویچی،میگم آقا یه بندری لطفامیگه سوسیس بندری دیگهمیگم پ ن پ،یه نوار بندری بزار میخوام واست قر بدم تا خستگیت رفع بشه!</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Mon, 08 Mar 2021 12:32:52 +0330</pubDate>
            </item>
                    <item>
                <title>جوک خرخونی</title>
                <link>https://virgool.io/Laughterfriends/%D8%AC%D9%88%DA%A9-%D8%AE%D8%B1%D8%AE%D9%88%D9%86%DB%8C-qvvjrkiuss5a</link>
                <description> خوب اینم از سری دوم جوک های خنده دارتنها کاری که ایرانیا توش باهم همکاری میکنن چیه؟...تو جاده چراغ میزنن که پلیس وایساده°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°سر کلاس استاد داشت فلسفه کلمه خر رو توضیح میداد!روکرد به ما گفت:در کل، خر به معنی بزرگ و ارجمند هستمثل خرپول، خرخون، خرشانسپس شما همتون خریدمنم برگشتم گفتم:استاد شکسته نفسی می کنید... چشاتون خر میبینهخری از خودتونه....خودتون از همه خر تریداصلا اگه یه خر توی این کلاس باشه اونم شمایید....نمی دونم چرا بیرونم کرد از کلاس..°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°رفتم داروخانه چسب زخم بگیرمنداشتن..دختره افتاده دنبالممیگهخودم مرهم زخمات میشمچشم و چراغ خونت میشم°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°دیشب نصف شبی ﯾﻬﻮﯾﯽ ﻫﻮﺱ ﺳﻮﺷﯽ ﮐﺮﺩﻡ !...ﻓﻘﻂ ﻧﻤﯿﺪﻭﻧﻢ ﭼﯽ ﻫﺴﺖ...°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°دیروز رفتم نمایشگاه ماشینیه دونه مازراتی دیدم خیلی خوشم اومداین ماه حقوقمو بگیرم...یه آژانس میگیرم میرم دوباره میبینمش!°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°ﺍﻭﻣﺪﻡ ﮐﺎﺭ ﺍﻣﺮﻭﺯﻣﻮ ﺑﻨﺪﺍﺯﻡ ﺑﺮﺍ ﻓﺮﺩﺍ.....ﺑﻠﻨﺪ ﺍﻧﺪﺍﺧﺘﻢ ﺍﻓﺘﺎﺩ ﭘﺲ ﻓﺮﺩﺍﺍﻧﻘﺪ ﺧﻮﺷﺤﺎﻟﻢ ﺍﻻﻥ°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°به درجه ای از عرفان و معرفت رسیدم که...واسه خودم یه چیزی تعریف میکنم میخندم تازه آخرش هم از خودم میپرسم:جان من!؟°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°میگن عشق اینجوری تعریف شدهع :علاقهش :شدیدق :قلبی...ولی..میتونس اینجوری باشهع :عکستش :شبیهق :قورباغه سخخخخخ°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°دیشب سر سفره شام بودیمیهو گوشیم پی ام اومد...بابام گفت بشین من میارممن سریع رفتم سمت گوشیدیدم بابام اس داده حالا که پا شدی اب بیار سر سفره°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°من اینقدر ساده ام!...زرتی با یه کارت شارژ گول میخورم!..هر کی خواست امتحان کنه، فقط ایرانسل باشه لطفا°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°مرد چیست؟موجود بد شانسی که موقع تولدش میگن:حال مادرش چطوره؟؟موقع عروسیش میگن :چه عروس خوشگلی!!موقع مرگش میگن:بیچاره زن و بچش!!ولی بعد از مرگش هر خطایی از بچه هایش سر بزند میگن:تو روح پدرش با این بچه تربیت کردنش!°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°امروز با سر و صدای مامان بابام از خواب پریدمرفتم بیرون میپرسم چی شده !بابام میگه من دیشب خواب دیدم یه زن دیگه گرفتمواسه مامانت تعریف کردماونم گیر داده باید همین الان بخوابی و طلاقش بدی°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°اگه گفتین وقتی برنج با آب میخورین چی بهش میگن ...؟؟...میگن... واترپلوخداییش از این همه اطلاعاتی که در اختیارتون میزارم استفاده کنین بدردتون می خوره°•°•°•°•°•°•°•°• جوکهای جدید خنده دار لاین و وایبر •°•°•°•°•°•°•°•°دوستم دعوتم کرد به گروهوارد شدم میبینم فقط منو خودشیم(!!)میگم خب میومدی pvمیگهنه اینجا بزرگتره</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Mon, 08 Mar 2021 12:23:20 +0330</pubDate>
            </item>
                    <item>
                <title>جوک</title>
                <link>https://virgool.io/Laughterfriends/laughter-qtc9hiphfonj</link>
                <description>خب! گلچینی از بهترین جوک هایی که خوندم:تو کوچه موتوریه اومد دختره رو اذیت کنه..دویدم رفتم کمک فرار کرد پسرهیکم آب دادم دختره خورد حالش که جا اومد گفت شما پسرا همتون آشغالین، و رفت*****************دختره رفته قصابی گفته :آقا جگر دارید ؟قصاب گفته جگر سفید یا سیاه؟...دختره گفته رنگای دیگه کی میارید ؟میگن قصاب پشم گوسفند و انداخته رو خودش فقط میگه بع بع...*****************دیشب برق رفت، بابام گفت پاشو یه شمع روشن کنگفتم نمیخواد وجودت خودش نوره،...یهو دیدم یه دمپایی پرت کرد طرفم و گفت؛ لایک، خوشم اومد*****************مرد با کنایه به زن گفت چرا زنها ،در هر کاری کمتر از مردها موفق می شوندزن در جواب گفت برای اینکه خانم ها ،خودشان زن ندارند تا در کارها کمکشان کنداخه چرا با این موجودات حاضر جواب بحث میکنید*****************یه بارم بابام کنتور گاز رو دستکاری کرد،...روزی ١٣٠٠ تومن اداره گاز باید به ما پول میداد*****************‏یارو ﺍﺯ ﻣﻐﺎﺯﻩ ﻣﯿﺎﺩ ﺑﯿﺮﻭﻥ ﻏﺶ ﻏﺶ ﻣﯿﺨﻨﺪﻩﻣﯿﮕﻦ:ﭼﯽ ﺷﺪﻩ؟‏ﻣﯿﮕﻪ:رفتم مغازه اسگلشون کردم‏میگن:چی کار کردی…؟‏میگه:ﭘﻮﻝ ﺩﺍﺩﻡ ﻫﯿﭽﯽ ﻧﺨﺮﯾﺪﻡ*****************امروز یه پشه یه ربع بی حرکتنشسته بود رو میز ناهار خوریمنم سریع زدم لهش کردم!!بعد از چن دقیقه یه پشه دیگه اومد بالا سرم گفت:بی وجدان اون معلول بوودلامصب داغون شدم با حرفش*****************پسرها بعد 10 دقیقه به تفاهم میرسند که روز جمعه برای تفریح کجا برن...دخترها بعد 4 ساعت بحث ،تفریحشون لغو میشه چون الهه به نسترن گفت :خرس*****************دنبال نیمه گمشدتون نگردید بعضی هام مثل ما لنگه به لنگه آفریده شدن!..یعنی همون بعضیام مثل من لنگه ندارن*****************افسر :خانم شما با سرعت غیر مجاز رانندگی میکردیدخواهش میکنم بزارید برم، من معلم هستم الان کلاسم دیر میشهافسر :معلم؟ یه عمر منتظر این روز بودم، حالا شروع کن هزار بار بنویس “من دیگه با سرعت غیر مجاز رانندگی نمیکنم&quot;*****************دقت کردین...بعضی اوقات بچه های کلاس با میز و نیمکت یک اهنگهایی میسازن که بتهوون که سهله بابای بتهوونم نمی تونه اونا رو بسازه*****************سر ناهار دستم خورد به بطری آب همش ریخت تو غذای بابام.هر کی بود یه چک میخوابوند زیر گوش بچه ش.....ولی بابام نزد.......بشقابشو با بشقابم عوض کرد....*****************‏یه جوری میگین کوالا فقط میخوره و میخوابه انگار مثلا گوسفند 5 صبح بیدار میشه یه چایی تلخ میخوره تا شب میره سر دکل نفت*****************روال دعوا تو مدرسه تو دهه شصت به این شکل بود کهاول همو مث سگ میزدیم ، ناظم میومد جدامون می کردبعد تک تک هممونو مث سگ میزد ما ناظمه رو جدا می کردیمبعد زنگ میزد بابامون میومد باباهه هم مث سگ میزدمون ناظمه جدامون می کرد**************آقا یجوری می گین بالا خر هست،(بالاخره) انگار پایین هم انسان با شعور و با معرفتیه....آقا اگه با معرفت بود چرا میرفت زیر پا؟</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Mon, 08 Mar 2021 12:14:02 +0330</pubDate>
            </item>
                    <item>
                <title>نحوه کنترل ماوس در اسمبلی</title>
                <link>https://virgool.io/Acpublication/%D9%86%D8%AD%D9%88%D9%87-%DA%A9%D9%86%D8%AA%D8%B1%D9%84-%D9%85%D8%A7%D9%88%D8%B3-%D8%AF%D8%B1-%D8%A7%D8%B3%D9%85%D8%A8%D9%84%DB%8C-kvjjqnazkrtw</link>
                <description>سلام. امیدوارم که حالتون خوب باشد و همیشه شاداب و سرحال باشید.من برای پروژه ای نیاز دارم که کدی را در اسمبلی بنویسم تا وقتی ماوس حرکت کرد، مکان نما روی صفحه هم حرکت کند.شاید الان بگید که خوب تو هر سیستم عاملی باشی خودش مکان نما رو نشون میده دیگه!!!ولی پروژه من ساخت همون سیستم عامل است که آموزشش به زودی در ویرگول قرار میگیرد.لطفا اگر اطلاعات دارید کمک کنید?</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Mon, 08 Mar 2021 11:35:01 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت خزنده وب با پایتون- قسمت دو</title>
                <link>https://virgool.io/@m_974892/%D8%B3%D8%A7%D8%AE%D8%AA-%D8%AE%D8%B2%D9%86%D8%AF%D9%87-%D9%88%D8%A8-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88-m6aup47djmv8</link>
                <description> کنیم. شما می‌توانید نام عنکبوت خود را بر اساس نیازهای خود تعیین کنید.ساختار پروژه نهایی چیزی مانند تصویر زیر خواهد بود:?همان طور که می‌بینید یک پوشه مستقل برای هر عنکبوت وجود دارد. شما می‌توانید چند عنکبوت را به یک پروژه منفرد اضافه کنید. اگر فایل عنکبوت electronics.py را باز کنیم با چیزی مانند زیر مواجه می‌شویم:1234567891011# -*- coding: utf-8 -*-import scrapyclass ElectronicsSpider(scrapy.Spider):name = &quot;electronics&quot;allowed_domains = [&quot;www.olx.com.pk&quot;]start_urls = [&#x27;http://www.olx.com.pk/&#x27;]def parse(self, response):passچنان که مشاهده می‌کنید، ElectronicsSpider یک زیرکلاس از scrapy.Spider است. مشخصه name در واقع نام عنکبوت است که در دستور تولید عنکبوت تعیین شده است. این نام در زمانی که خزنده، خود را اجرا می‌کند به کار می‌آید. مشخصه allowed_domains تعیین می‌کند که کدام دامنه‌ها در دسترس این خزنده هستند و start_urls جایی است که URL-های ابتدایی در آنجا نگه‌داری می‌شوند. این URL-های ابتدایی در زمان آغاز به کار عنکبوت مورد نیاز هستند. علاوه بر ساختار فایل، این یک قابلیت خوب برای ایجاد کران‌هایی برای خزنده است.متد parse چنان که از نامش برمی‌آید، محتوای صفحه‌ای را که مورد دسترسی قرار داده است تحلیل خواهد کرد. ما می‌خواهیم خزنده‌ای بنویسیم که به چندین صفحه برود و به این منظور باید برخی تغییرات ایجاد کنیم.12345678910111213141516171819from scrapy.spiders import CrawlSpider, Rulefrom scrapy.linkextractors import LinkExtractorclass ElectronicsSpider(CrawlSpider):name = &quot;electronics&quot;allowed_domains = [&quot;www.olx.com.pk&quot;]start_urls = [&#x27;https://www.olx.com.pk/computers-accessories/&#x27;,&#x27;https://www.olx.com.pk/tv-video-audio/&#x27;,&#x27;https://www.olx.com.pk/games-entertainment/&#x27;]rules = (Rule(LinkExtractor(allow=(), restrict_css=(&#x27;.pageNextPrev&#x27;,)),callback=&quot;parse_item&quot;,follow=True),)def parse_item(self, response):print(&#x27;Processing..&#x27; + response.url)برای این که خزنده به چندین صفحه سر بزند، به جای scrapy.Spider یک زیرکلاس از آن ایجاد می‌کنیم. این کلاس موجب می‌شود که خزش روی صفحه‌های چندگانه آسان‌تر باشد. شما می‌توانید با کد تولید شده هر کاری که دوست دارید انجام دهید، اما باید مواظب باشید که دوباره به صفحه‌های قبلی بازنگردید.گام بعدی این است که متغیرهای قاعده خود را تنظیم کنید. در اینجا قواعد ناوبری وب‌سایت را بررسی می‌کنیم. LinkExtractor در واقع پارامترهایی برای رسم کران‌ها می‌گیرد. ما در این مثال از پارامتر restrict_css برای تعیین کلاسی جهت صفحه بعدی استفاده می‌کنیم. اگر به این صفحه (+) مراجعه کنید، چیزی مانند تصویر زیر را مشاهده خواهید کرد:?pageNextPrev کلاسی است که برای واکشی لینک‌ها صفحه‌های بعدی استفاده می‌شود. پارامتر call_back مشخصی می‌کند که کدام متد برای دسترسی به عناصر استفاده می‌شود. این متد را در ادامه بررسی می‌کنیم.به خاطر داشته باشید که باید نام متد را از ()parse به ()parse_item با هر چیزی که دوست دارید تغییر دهید تا از override شدن کلاس مبنا جلوگیری شود. در غیر این صورت قاعده شما کار نخواهد کرد حتی اگر مقدار follow=True تنظیم کنید.تا به اینجا همه چیز به خوبی پیش رفته است. در ادامه خزنده‌ای را که تا به اینجا ساخته‌ایم تست می‌کنیم. در دایرکتوری پروژه به ترمینال بروید و دستور زیر را وارد کنید:1scrapy crawl electronicsپارامتر سوم در واقع نام عنکبوتی است که قبلاً در مشخصه name کلاس ElectronicsSpiders تعیین کرده‌ایم. در ترمینال اطلاعات مفید زیادی می‌یابید که برای دیباگ کردن خزنده مفید هستند. در صورتی که نخواهید اطلاعات دیباگ کردن را ببینید، می‌توانید گزینه debugger را غیرفعال کنید. دستور مشابهی با سوئیچ –nolog وجود دارد:1scrapy crawl --nolog electronicsاگر این دستور را در حال حاضر اجرا کنید، خروجی چیزی مانند زیر خواهد بود:12345678910111213141516171819202122Adnans-MBP:olx AdnanAhmad$ scrapy crawl --nolog  electronicsProcessing..https://www.olx.com.pk/computers-accessories/?page=2Processing..https://www.olx.com.pk/tv-video-audio/?page=2Processing..https://www.olx.com.pk/games-entertainment/?page=2Processing..https://www.olx.com.pk/computers-accessories/Processing..https://www.olx.com.pk/tv-video-audio/Processing..https://www.olx.com.pk/games-entertainment/Processing..https://www.olx.com.pk/computers-accessories/?page=3Processing..https://www.olx.com.pk/tv-video-audio/?page=3Processing..https://www.olx.com.pk/games-entertainment/?page=3Processing..https://www.olx.com.pk/computers-accessories/?page=4Processing..https://www.olx.com.pk/tv-video-audio/?page=4Processing..https://www.olx.com.pk/games-entertainment/?page=4Processing..https://www.olx.com.pk/computers-accessories/?page=5Processing..https://www.olx.com.pk/tv-video-audio/?page=5Processing..https://www.olx.com.pk/games-entertainment/?page=5Processing..https://www.olx.com.pk/computers-accessories/?page=6Processing..https://www.olx.com.pk/tv-video-audio/?page=6Processing..https://www.olx.com.pk/games-entertainment/?page=6Processing..https://www.olx.com.pk/computers-accessories/?page=7Processing..https://www.olx.com.pk/tv-video-audio/?page=7Processing..https://www.olx.com.pk/games-entertainment/?page=7از آنجا که مقدار follow=True را تنظیم کرده‌ایم، خزنده قاعده صفحه بعد را بررسی می‌کند و به ناوبری خود ادامه می‌دهد، مگر این که به صفحه‌ای برخورد کند که قاعده در مورد آن صدق نمی‌کند که معمولاً صفحه آخر لیست است.اینک تصور کنید بخواهیم منطق مشابهی را با چیزهایی که در این صفحه (+) اشاره شده‌اند بنویسیم، ابتدا باید کدی بنویسیم که روی چندین پردازنده کار کند. همچنین باید کدی بنویسیم که نه تنها به صفحه بعد برود، بلکه اسکریپت را از طریق عدم دسترسی به URL های ناخواسته، در داخل کران‌های تعریف شده نگه دارد. Scrapy همه این وظایف را از دوش ما بر می‌دارد و کاری می‌کند که صرفاً روی منطق متمرکز شویم، یعنی خزنده‌ای برای استخراج اطلاعات بنویسیم. اینک قصد داریم کدی بنویسیم که لینک‌های آیتم منفرد مانند صفحه‌های فهرست‌بندی را واکشی کند بدین ترتیب کدی را که در متد parse_item داشتیم تغییر می‌دهیم:123item_links = response.css(&#x27;.large &gt; .detailsLink::attr(href)&#x27;).extract()for a in item_links:yield scrapy.Request(a, callback=self.parse_detail_page)در این کد ما لینک‌ها را با استفاده از متد css. پاسخ واکشی می‌کنیم. چنان که گفتیم می‌توان از xpath نیز استفاده کرد و بستگی به نظر شما دارد.. در این حالت همه چیز کاملاً ساده خواهد بود:?لینک دیگر کلاسی به نام detailsLink دارد. اگر تنها از (‘response.css(‘.detailsLink استفاده کنیم، در این صورت لینک‌های تکراری از یک مدخل منفرد گردآوری می‌شوند، زیرا لینک‌ها در تگ‌های img و h3 تکرار شده‌اند. همچنین به کلاس والد large اشاره کرده‌ایم تا لینک‌های یکتا دریافت کنیم. ما از (attr(href:: برای استخراج بخش href خود لینک استفاده می‌کنیم. سپس از متد ()extract استفاده می‌کنیم.دلیل استفاده از این متد آن است که css. و xpath. شیء SelectorList را بازگشت می‌دهند و ()extract به بازگرداندن DOM واقعی برای پردازش بیشتر کمک می‌کند. در نهایت لینک‌ها را در scrapy.Request با یک callback به صورت کامل yield می‌کنیم. ما کد داخلی Scrapy را بررسی نکرده‌ایم، اما احتمالاً از yield به جای return استفاده می‌کند، زیرا می‌توانید چندین آیتم را return کنید. از آنجا که خزنده باید مراقب لینک‌های چندگانه همراه با هم نیز باشد، در این صورت yield بهترین انتخاب خواهد بود.متد parse_detail_page چنان که از نامش هویدا است، اطلاعات منفرد را از صفحه جزییات تحلیل می‌کند. بنابراین اتفاقی که در عمل می‌افتد این است که:یک لیست از مدخل‌ها در parse_item به دست می‌آورید.می‌توانید آن‌ها را در یک متد callback برای پردازش بیشتر ارسال کنید.از آنجا که تنها پیمایش دوسطحی وجود دارد، قادر شدیم به کمک دو متد به پایین‌ترین سطح برسیم. اگر قصد داشتیم شروع به خزش از صفحه اصلی وب‌سایت OLX بکنیم، باید سه متد می‌نوشتیم که دو مورد برای واکشی دسته‌بندی‌های فرعی و مداخل آن‌ها و متد آخر برای تحلیل اطلاعات واقعی بود.در نهایت قصد داریم اطلاعات واقعی را تحلیل کنیم که روی یکی از مدخل‌ها مانند این (+) در دسترس است.تحلیل اطلاعات این صفحه کار دشواری نیست، اما این کاری است که باید روی اطلاعات ذخیره‌شده صورت بگیرد. ما باید model را برای داده‌های خود تعریف کنیم. این بدان معنی است باید به Scrapy بگوییم چه اطلاعاتی را می‌خواهیم برای استفاده‌های بعدی ذخیره کنیم. در ادامه فایل item.py را ویرایش می‌کنیم که قبلاً از سوی Scrapy ایجاد شده است:123456import scrapyclass OlxItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()passOlxItem کلاسی است که در آن فیلدهای مورد نیاز برای نگهداری اطلاعات را تنظیم خواهیم کرد. ما قصد داریم سه فیلد برای کلاس مدل خود تعریف کنیم.123456import scrapyclass OlxItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()passدر این فیلدها عنوان مطلب، قیمت و خود URL را ذخیره می‌کنیم. در این مرحله به فایل کلاس خزنده بازمی‌گردیم و parse_detail_page را ویرایش می‌کنیم. اکنون یک متد برای آغاز نوشتن کد، یکی برای تست از طریق اجرای کل خزنده و دیگری برای مشاهده درست بودن مسیر است، اما ابزار جالب دیگری نیز وجود دارد که از سوی Scrapy عرضه شده است.شل ScrapyShell یا پوسته Scrapy (+) یک ابزار خط فرمان است که فرصت تست کد تحلیل‌شده را بدون اجرای کلی خزنده در اختیار ما قرار می‌دهد. برخلاف خزنده که به همه لینک‌ها سر می‌زند، شل Scrapy اقدام به ذخیره‌سازی DOM یک صفحه منفرد برای استخراج داده‌ها می‌کند:1Adnans-MBP:olx AdnanAhmad$ scrapy shell https://www.olx.com.pk/item/asus-eee-pc-atom-dual-core-4cpus-beautiful-laptops-fresh-stock-IDUVo6B.html#4001329891اکنون می‌توان به سادگی کد را بدون مراجعه چندباره به همان URL تست کرد. بدین ترتیب عنوان صفحه را با کد زیر واکشی کرده‌ایم:12In [8]: response.css(&#x27;h1::text&#x27;).extract()[0].strip()Out[8]: u&quot;Asus Eee PC Atom Dual-Core 4CPU&#x27;s Beautiful Laptops fresh Stock&quot;آن response.css آشنا را اینجا هم می‌توانید مشاهده کنید. از آنجا که کل DOM موجود است می‌توان هر کاری با آن انجام داد. برای نمونه آن را می‌توان به صورت زیر واکشی کرد:12In [11]: response.css(&#x27;.pricelabel &amp;gt; strong::text&#x27;).extract()[0]Out[11]: u&#x27;Rs 10,500&#x27;نیازی به انجام هیچ کاری برای واکشی url نیست، زیرا response.url اقدام به بازگشت دادن URL-ی می‌کند که هم اینک مورد دسترسی قرار گرفته است.اکنون که همه کد را بررسی کردیم، نوبت آن رسیده است که parse_detail_page را مورد استفاده قرار دهیم:1234567title = response.css(&#x27;h1::text&#x27;).extract()[0].strip()price = response.css(&#x27;.pricelabel &gt; strong::text&#x27;).extract()[0]item = OlxItem()item[&#x27;title&#x27;] = titleitem[&#x27;price&#x27;] = priceitem[&#x27;url&#x27;] = response.urlyield itemوهله OlxItem پس از تحلیل کردن اطلاعات لازم ایجاد می‌شود و مشخصه‌ها تعیین می‌شوند. اینک که نوبت اجرای خزنده و ذخیره‌سازی اطلاعات رسیده است، کمی تغییر در دستور باید ایجاد کرد:1scrapy crawl electronics -o data.csv -t csvما نام فایل و قالب‌بندی فایل را برای ذخیره‌سازی داده‌ها ارسال می‌کنیم. زمانی که دستور فوق اجرا شود فایل CSV برای شما می‌سازد. چنان که می‌بینید روند ساده‌ای است و برخلاف خزنده‌ای که خود می‌باید می‌نوشتیم، در اینجا کافی است رویه مورد نیاز برای ذخیره‌سازی داده‌ها را بنویسیم.اما زیاد عجله نکنید! کار به همین جا ختم نمی‌شود. شما می‌توانید حتی داده‌ها را در قالب JSON نیز ذخیره کنید، تنها کاری که به این منظور لازم است ارسال مقدار json با سوئیچ t- است.Scrapy قابلیت‌های دیگری نیز در اختیار ما قرار می‌دهد. برای نمونه می‌توان یک نام فایل ثابت ارسال کرد که در سناریوهای دنیای واقعی هیچ معنایی ندارد. چرا باید برنامه‌ای نوشت که نام فایل ثابتی تولید کند؟ یکی از موارد استفاده آن این است که باید فایل settings.py را اصلاح و این دو مدخل را اضافه کنید:12FEED_URI = &#x27;data/%(name)s/%(time)s.json&#x27;FEED_FORMAT = &#x27;json&#x27;در ادامه الگوی فایلی که ایجاد کرده‌ایم را ارائه می‌کنیم. %(name)% نام خود خزنده است، time زمان را نشان می‌دهد. اکنون زمانی که دستور زیر را اجرا کنیم:1scrapy crawl --nolog electronicsو یا دستور زیر را اجرا کنیم:1scrapy crawl electronicsیک فایل JSON در پوشه data مانند زیر ایجاد می‌شود:1234567[{&quot;url&quot;: &quot;https://www.olx.com.pk/item/acer-ultra-slim-gaming-laptop-with-amd-fx-processor-3gb-dedicated-IDUQ1k9.html&quot;, &quot;price&quot;: &quot;Rs 42,000&quot;, &quot;title&quot;: &quot;Acer Ultra Slim Gaming Laptop with AMD FX Processor 3GB Dedicated&quot;},{&quot;url&quot;: &quot;https://www.olx.com.pk/item/saw-machine-IDUYww5.html&quot;, &quot;price&quot;: &quot;Rs 80,000&quot;, &quot;title&quot;: &quot;Saw Machine&quot;},{&quot;url&quot;: &quot;https://www.olx.com.pk/item/laptop-hp-probook-6570b-core-i-5-3rd-gen-IDUYejF.html&quot;, &quot;price&quot;: &quot;Rs 22,000&quot;, &quot;title&quot;: &quot;Laptop HP Probook 6570b Core i 5 3rd Gen&quot;},{&quot;url&quot;: &quot;https://www.olx.com.pk/item/zong-4g-could-mifi-anlock-all-sim-supported-IDUYedh.html&quot;, &quot;price&quot;: &quot;Rs 4,000&quot;, &quot;title&quot;: &quot;Zong 4g could mifi anlock all Sim supported&quot;},...]</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Wed, 24 Feb 2021 10:20:53 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت خزنده وب با پایتون</title>
                <link>https://virgool.io/@m_974892/%D8%B3%D8%A7%D8%AE%D8%AA-%D8%AE%D8%B2%D9%86%D8%AF%D9%87-%D9%88%D8%A8-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-yuaevg48e7ue</link>
                <description> ساخت خزنده وب با Scrapy ? اخیرا برای پروژه ای نیاز به استخراج داده از سایت IMDB داشتم ، البته خود سایت IMDB بخشی از اطلاعات فیلم ها رو بصورت فایل CSV در اختیارتون قرار میده ولی این اطلاعات چندان کامل نبود و مجبور شدم برای این کار یک خزنده وب با Scrapy ایجاد کنم در این یادداشت سعی میکنم فرایند توسعه این خزنده و البته نحوه استفاده از scrapy برای این منظور را توضیح بدهم.خزنده وب چیست؟خزنده وب یا Web Crawler ابزاری است که فرایند دریافت داده های موجود در صفحات وب را خودکار می کند، برای مثال دوست دارید لیست قیمت محصولات دیجیکالا را بصورت روزانه دریافت کنید و تغییرات را مقایسه کنید ، دیجیکالا هیچ API ای برای دسترسی به اطلاعات محصولاتش دراختیار عموم قرار نمیده ، پس یا باید به صورت دستی قیمت ها رو کپی کنیم ? یا ابزاری داشته باشیم که این کار به صورت خودکار انجام بده ، خزنده های وب دقیقا برای این منظور ساخته شده اند. خزنده وب محتوای وبسایت را دانلود می کند و بخش هایی از سایت که محتوای مورد نظر ما اونجا قرار دارد رو استخراج میکند. ? اسکرپی چیست؟ ? ابزارهای مختلفی برای داده کاوی در وب وجود داره ، یکی از راحت ترین اون ها پلاگین Data Scraper برای مرورگر کروم هست (البته پلن پولی داره) ، ولی اگر کمی برنامه نویسی بلد باشید ساخت یک خزنده وب با Scrapy اصلا کار سختی نیست ، در واقع Scrapy یک فریم ورک مبتنی بر پایتون برای ساخت خزنده های وب است. Scrapy فرایند ساخت ، اجرا و ذخیره خروجی خرنده وب رو پوشش میده.گام اول: نصب Scrapyاگر قبلا روی سیستم تان پایتون نصب کرده اید می توانید با استفاده از pip اقدام به نصب Scrapy کنید1pip install Scrapyبر خلاف اون چیزی که انتظار داشتم نصب Scrapy حداقل در ویندوز و با نسخه 3.6 پایتون کمی به مشکل بر میخوره ولی با نسخه 2.7 پایتون همه چیز خوب پیش رفت ، ولی نتیجه تجربه ای که در نصب scrapy در ویندوز داشتم اینه که بهترین راه برای نصب Scrapy حداقل در ویندوز استفاده از Anaconda و البته نسخه کم حجم اون یعنی MiniConda است ، نیازی به نصب مفسر Python نیست و همه چیز همراه آناکوندا نصب میشه.بعد از دانلود و نصب Miniconda نوبت به نصب Scrapy میرسه ، کافیه در خط فرمان دستور زیر رو برای نصب Scrapy اجرا کنید1conda install -c conda-forge scrapyپس از پایان نصب می‌توانید از طریق دستور scrapy از موفق بودن نصب اون اطمینان حاصل کنید ? تست Scrapyپیش از اینکه درگیر کدنویسی بشوید، می‌توانید با استفاده از شل scrapy از امکانات اون بصورت تعاملی استفاده کنید ، کار بسیار ساده است و کافیه با استفاده از دستور زیر وارد shell بشوید:1scrapy shell &lt;website_url&gt;بعد از اجرای این دستور صفحه وب دانلود میشه و وارد محیط shell می شوید و می توانید با استفاده از انتخابگر های موجود به المان های موجود در صفحه دسترسی داشته باشید:برای مثال انتخاب عناوین 250 فیلم برتر در imdb:1scrapy shell https://www.imdb.com/chart/topبا استفاده از آبجکت response می توان به محتوای صفحه دانلود شده دسترسی داشت ، برای مثال برای مشاهده کد html صفحه دانلود شده می‌توان از response.body استفاده کرد.برای انتخاب المان های مشخص scrapy دو راه حل قدرتمند در اختیارتان قرار میدهد :انتخابگر CSSانتخابگر xpathاگر با html و css آشنایی داشته باشید استفاده از انتخابگر css برایتان بسیار ساده خواهد بود ، برای مثال انتخاب عناوین فیلم های موجود در IMDB می تواند با انتخابگر زیر انجام شود:1.lister-list .titleColumn a ?انتخابگرcssبرایعناوینفیلمها 1response.css(&amp;quot.lister-list .titleColumn a::text&amp;quot).extract() ?اسامی250فیلمبرترIMDB تبریک میگم ، به همین سادگی لیست فیلم های برتر موجود در وب سایت imdb رو استخراج کردیم.همانطور که مشخص است ، برای دریافت متن المان میتوان از text:: استفاده کرد و برای استخراج باید متد extract را بعد از انتخابگر css تان بنویسید. برای انتخاب المان نخست می‌توانید از extract_first استفاده کنید.انتخابگر xpath روشی دیگر برای انتخاب عناصر موجود در صفحه وب مبتنی بر xml است و می‌توانید با استفاده از ابزار Developer Tool موجود در مرورگرتان آدرس xpath مربوط به المان انتخابی تان را دریافت کنید ?دریافتآدرسانتخابگرxpathبرایالمانخاص برای مثال انتخابگر عنوان فیلم ها با xpath به شکل زیر است:1response.xpath(&amp;quot/html/body/div[1]/div/div[2]/div[3]/div/div[1]/div/span/div/div/div[3]/table/tbody/tr[1]/td[2]/a/text()&amp;quot).extract()اطلاعات بیشتر درباره xpathایجاد پروژهفکر میکنم تا اینجا توضیح کافیه ، بیاید اولین پروژه مان را ایجاد کنیم ، هرچند که می توانید یک پروژه ساده با پایتون ایجاد کنید و با import کردم scrapy از امکانات scrapy در آن استفاده کنید ولی پیشنهاد میکنم از دستور startproject برای ایجاد پروژه استفاده کنید:1scrapy startproject &lt;project_name&gt;اولین پروژه مان را با نام imdb ایجاد کردیم ، یک پوشه با نام پروژه تان به همراه چندین فایل برایتان ایجاد شد ، گام بعدی ایجاد اولین spider مان است ، هر پروژه scrapy می تواند شامل چندین اسپایدر باشد که هر کدام می تواند مسئول دریافت داده های بخش های متفاوت از یک وبسایت باشند.برای ایجاد اولین spider کافیست بعد از ورود به پوشه پروژه دستور زیر را اجرا کنید:12    cd imdb
    scrapy genspider topMovies https://www.imdb.com/chart/topداخل پوشه spiders یک فایل پایتون جدید با نام topMovies اضافه شده است ، فعلا فقط با این فایل کار خواهیم کرد ، پیشنهاد من بری ویرایش این فایل استفاده از visual studio code و یا ویرایشگر مخصوص پایتون PyCharms هست (گزینه دوم غیر رایگان هست). ? همانطور که مشاهده می کنید ، هر اسپایدر در واقع یک کلاس پایتون است که از scrapy.Spider ارث بری دارد.مقدار allowed_domains و start_urls به ترتیب دامنه هایی که خزنده مجاز به پیمایش هست و آدرس های آغازین هست که هر کدام میتواند چندین مقدار داشته باشند و به صورت پیش فرض آدرسی است که هنگام ایجاد اسپایدر وارد کرده بودیم.متد اصلی parse هست و بعد از دانلود هر یک از url های موجود در start_urls اجرا خواهد شد، همانطور که مشخص هست یکی از پارامتر های این متد response هست و همان response ای است که در shell به آن دسترسی داشتیم و میتوانیم از طریق آن و استفاده از انتخابگر ها به محتوای مورد نظرمان دست یابیم.دریافت لیست فیلم هامیتوانیم از همان انتخابگری که در محیط شل برای دریافت لیست فیلم ها استفاده کرده بودیم در درون کدمان استفاده کنیم (فعلا از دستور print برای نمایش خروجی استفاده کردیم)میتوانید خزنده ایجاد شده را با استفاده از دستور زیر اجرا کنید:1scrapy crawl topMoviesخروجی ? بهتر است به جای استفاده از print برای نمایش خروجی نتیجه دلخواه را به عنوان مقدار برگشتی متد parse برگردانیم ، برای مثال در کد زیر به جز عنوان ، تصویر ، لینک و امتیاز فیلم ها رو هم دریافت کردیم ، نکته جدید استفاده از1::attr(src)برای دریافت مشخصه src تگ img است.برای ذخیره خروجی تولید شده توسط خزنده تان میتوانید از نام فایل به همراه پارامتر o در دستور اجرای خزنده استفاده کنید:1scrapy crawl topMovies -o movies.jsonخروجی: ?خروجیلیستفیلمهایبرترimdbبصورتjson پسوند فایل هایی که توسط scrapy پشتیبانی می شوند عبارتند از :JSONJSON linesCSVXMLدریافت جزئیات فیلمبرای دریافت جزئیات فیلم ها نیاز هست که خزنده وارد لینک هر فیلم بشه و اطلاعات کامل هر فیلم رو از صفحه جزئیات بخونه ، کدمان رو به گونه ای تغییر میدیم که به فقط لیست لینک ها رو از صفحه اصلی بخونه و سایر فیلد ها رو از صفحه جزئیات.برای دریافت صفحه جدید و اجرای متد parse روی اون نیاز داریم که از scrapy.Request استفاده کنیم ، که پارامتر دوم اون متدی است که بعد از دریافت باید عملیات parse رو انجام بدهچون url ها بصورت relative ثبت شده اند از response.urljoin برای تصحیح لینک استفاده کردیم:1234567def parse(self, response):
    links = response.css(&amp;quot.lister-list tr a::attr(href)&amp;quot).extract()
    for link in links:
         link = response.urljoin(link)
         yield scrapy.Request(url=link, callback=self.parse_details)
def parse_details(self, response):
    #parse detailsبرای اینکه ساختار منسجم تری داشته باشیم میتوانیم کلاس مدل برای داده های برگشتی داشته باشیم ، فایل items در پروژه Scrapy برای این منظور در نظر گرفته شده و میتونید مدل رو توی این فایل تعریف کنید:برای دریافت فیلد ها میتوانید از روش قبلی (استفاده از انتخابگر css) استفاده کنید ولی اگر کمی در کد صفحه جزئیات فیلم در imdb دقت کنید متوجه خواهید شد که این توی این صفحه جزئیات کامل فیلم توی یک تگ اسکریپت بصورت json داره و با کمتر زحمت میتونید اطلاعات رو از اونجا دریافت کنید: ? برای دریافت محتوای اسکریپت میتونید به جای انتخابگر css از xpath استفاده کنید:1response.xpath(&amp;quot//script[@type=&#039;application/ld+json&#039;]/text()&amp;quot).extract_first()مقداری که بر میگرده بصورت رشته است و باید به json تبدیل بشه ، میتونید از json.loads استفاده کنید:1json.loads(response.xpath(&amp;quot//script[@type=&#039;application/ld+json&#039;]/text()&amp;quot).extract_first())کد نهایی :امیدوارم مطالبی که مطرح شد به دردتون بخوره ، البته مواردی هست که فرصت پرداختن بهشون در این مقاله پیش نیومد ، مثل صفحه بندی ، تنظیمات ، pipeline ها و ... که سایت scrapy مرجع کاملی برای یادگیری این موارد هست.کد پروژه رو میتونید از گیت هاب دریافت کنید.</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Wed, 24 Feb 2021 10:18:49 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت دستیار صوتی-قسمت دوم(دادن جواب مناسب به متن داده شده(عمل و عکس العمل!))</title>
                <link>https://virgool.io/Acpublication/assistant-pt2-xxmppcaicf5l</link>
                <description>خوب! به قسمت دوم ساخت دستیار صوتی در پایتون                                       خوش  آمدید! https://virgool.io/Acpublication/assistant-hlbfdoctpfxj این جلسه قراره که ببینیم چطور پاسخ مناسب بدیم به متن گرفته شده.خوب کد جلسه قبل چیزی شبیه این بود:import os from gtts import gTTSimport playsoundimport pyaudioimport speech_recognition as srdef speech(text):   tts=gTTS(text=text, lang=&quot;en&quot;, slow=false)   filename=tts.save(voice.mp3)  playsound.playsound(filename)speech(&quot;hello world!&quot;)خوب اون خط آخری رو پاک کنید تا چیزی شبیه این بمونه:import os from gtts import gTTSimport playsoundimport pyaudioimport speech_recognition as srdef speech(text):   tts=gTTS(text=text, lang=&quot;en&quot;, slow=false)   filename=tts.save(voice.mp3)  playsound.playsound(filename) خوب حالا یک حلقه بینهایت درست میکنیم:while TRUE:  get=input()  if &quot;hello&quot; in get:        speech(&quot;hi! How are you?&quot;)کد چیزی شبیه این میشه: import os from gtts import gTTSimport playsoundimport pyaudioimport speech_recognition as srdef speech(text):   tts=gTTS(text=text, lang=&quot;en&quot;, slow=false)   filename=tts.save(voice.mp3)  playsound.playsound(filename)while TRUE:  get=input()   if &quot;hello&quot; in get:        speech(&quot;hi! How are you?&quot;)حالا اگه کد رو کامپایل کنید، اولش از شما یک متن میگیره. اگه hello توی چیزی که بهش میدیم باشه، hi! how are you? رو بهتون میگه.می تونید همین حلقه رو دوباره کپی و پیست کنید، و به جای hello چیز های دیگه قرار بدین و به جای hi! how are you? هم اون پاسخی که میخوای بده رو بذارید، تا جوابتان رو بده??دیگه جلسه بعدی واقعا میدیم سروقت تشخیص صدا!?باز رسیدیم به آخر مقاله???? امیدوارم براتون مفید بوده باشه. تا مقاله بعدی خدانگهدار!??</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Wed, 17 Feb 2021 12:24:14 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت دستیار صوتی-قسمت اول( معرفی و نصب نرم افزار ها)</title>
                <link>https://virgool.io/Acpublication/assistant-hlbfdoctpfxj</link>
                <description>سلام! در چند پست آینده قراره که بهتون نشون بدم چطور بک دستیار صوتی بسازید.(با پایتون)یک نکته بگم که این دستیار صوتی روی ترمینال اجرا میشه و شما می تونید با کتابخانه هایی نظیر tkinter یا kiwi برای اون (UI(User interface بسازید.اول پایتون رو از سایت زیر دانلود و نصب کنید: https://www.python.org/downloads/ دقت کنید که در این پروژه ما به دلیل پشتیبانی بهتر از کتابخانه ها از ide خود پایتون (idle) استفاده خواهیم کرد.ابتدا با دستور زیر متن به گفتار رو نصب کنید.pip install gTTSبا دستور زیر گفتار به متن:pip install Speech_recognationو با دستور زیر کتابخانهplaysound:pip install playsoundو با دستور زیر کتابخانه پای آودیو:pip install pyaudioاگر در دستور ها اشتباه وجود داشت در سایت زیر دستور درست را میتوانید پیدا کنید: https://pypi.org/ خوب بریم کد بزنیم!اول با کد های زیر کتابخانه ها را ایمپورت کنید:import osimport speech_recognition as srfrom gtts import gTTSimport pyaudioimport playsoundخوب! حالا یک تابع میسازیم:def speech(text):     tts=gTTS(text=text, lang=&quot;en&quot;, slow=false)     filename=tts.save(voice.mp3)     playsound.playsound(filename)خوب! حتما گفتید که اون gtts چیه؟اون مخفف google text to speech هستش!خوب حالا با دستور زیر اونو فعال کنید.speech(&quot;hello world!&quot;)البته به جای hello world! هرچی که میخوای قرار بدید.همون طور که میبینید، اگر کد رو کامپایل کنید، بعد از چند ثانیه اون کلمه ای که گذاشته بودید رو میگه!و یک چیز دیگه! اگه به جایی که پروژه رو ذخیره کردید برید، یک فایل به نام voice.mp3 میبینید که اگه اونو باز کنید، شروع به گفتن همون متن میکنه!در نوشته بعدی بهتون توضیح میدم که چطور صدا رو تشخیص بدیم و با توجه به اون جواب مناسب ارائه بکنیم.خوب! رسیدیم به آخر مقاله? امیدوارم براتون مفید باشه? خداحافظ!لینک قسمت های بعدی: https://virgool.io/Acpublication/assistant-pt2-xxmppcaicf5l </description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Wed, 17 Feb 2021 11:37:32 +0330</pubDate>
            </item>
                    <item>
                <title>چطور یک موتور جستجو بسازیم؟</title>
                <link>https://virgool.io/@m_974892/how-to-build-a-search-engine-na6gznd51pci</link>
                <description> مفاهیم موتور جستجو و آموزش ساخت موتور جستجو با PHPموتور های جستجو چه هستند و چگونه کار میکنندموتورهای جستجوگر امروزه بخش جدا ناپذیر از اینترنت هستند . در این مقاله میخواهیم موتورهای جستجوگر و مفاهیم آنرا بصورت کامل پوشش دهیم .موتور های جستجوگر به ابزار بسیار کاربردی در زمینه اینترنت تبدیل شده اند  و این ابزارها برای برنامه نویسان ، توسعه دهندگان ، مدیر شرکت ها ، کسب و کارهای آنلاین و دیگر کاربران اینترنتی بسیار کمک کننده و مفید هستند .با استفاده از موتور جستجوگر ما میتوانیم اطلاعاتی درباره ی موضوع خاص را به راحتی بدست بیاوریم .ما در این مقاله قصد داریم علاوه بر بررسی تخصصی موتور جستجوگر و مفاهیم آن ، به شما آموزش بدیم چطور موتور جستجوی شخصی خودتان را با PHP و MySQL بسازید ! تعجب نکنید شما هم میتوانید گوگل اولش انقدر قدرتمند نبود طی سالهای درازی اینطوری شده و تبدیل شده به یک سیستم عالی !‌ولی شما هم میتوانید از یه سیستم ساده ی موتور جستجو شروع کنید و آنرا هر روز بهتر از دیروز بکنید .البته در این مقاله ما قصد نداریم چیزی به شما یاد بدهیم که جایگزینی برای گوگل یا یاهو بسازید چون طبیعتا این امر فعلا امکان پذیر نیست ولی شما با این آموزش به مفاهیم موتورهای جستجو و طرز عمل آنها مسلط میشوید و یاد میگیرید چطور با PHP یک موتور جستجو بسازید .موتور جستجو چیست ؟بصورت کلی موتور جستجو یک ابزاری در بستر اینترنت است که به کاربران کمک میکند اطلاعات مختلف را از بین میلیون ها سایت به راحتی پیدا کنند . موتور جستجوهای پرکاربرد در جهان عبارتند از Google, Yahoo!, MSN, Bing , Ask و غیره ...موتورهای جستجو مثل یک برنامه ی کامپیوتری هستند که در بین اسناد زیادی که دارید بین یک کلمه ی خاصی میگردند و آن اسناد را برای شما طبقه بندی میکنند .به هر حال بصورت عامیانه موتور جستجو چیزی است مثل Google , Bing , Yahoo و غیره ...موتورهای جستجوگر ابزار خودکاری مثل ربات ها و خزنده ها را دارند که به سرتاسر اینترنت میفرستند و آنها وقتی به یک سایتی وارد میشوند تمام آن سایت را تحلیل و بررسی میکنند بعد از جمع آوری اطلاعات وارد لینک های آنها میشوند و بعد از ورود به صفحه ی دیگر یا سایت دیگر دوباره آنرا بررسی میکنند و بعد روی لینک های روی آن صفحه کلیک میکنند و دوباره به مقصد بعدی کوچ میکنند . همینطور کل اینترنت را گشته و اطلاعات را جمع آوری میکنند و به پایگاه های داده موتور انتقال میدهند .سپس این اطلاعات جمع بندی و طبقه بندی میشود ،‌ به این کار index کردن سایت ها میگویند . وقتی کاربر کلمه ی گرگ را جستجو میکند موتور جستجو در پایگاه داده خود میگردد و بین سایت هایی که این کلمه را ربات ها و خزنده ها جمع آوری کرده اند براساس رتبه ی آنها لیست میکند و به کاربر نمایش میدهد .موتور های جستجو چطور کار میکنند ؟‌هر موتور جستجو یک الگوریتمی برای لیست کردن و نمایش اطلاعات طبقه بندی شده از سایت ها دارد.نتیجه ی جستجو در موتور های جستجو گر در یک لیستی به نام SERP که مخفف Search Engine Results Page است نمایش داده میشود .معمولا الگوریتم موتور های جستجوگر به دنبال کلمات کلیدی در بخش های مختلف سایت میگردد و آنها را مهم میداند مثلا عبارت هایی که در title صفحه یا درون محتوای یک صفحه یا کلمات کلیدی آن وجود دارد .سپس وب سایت ها در موتور جستجو Rank بندی یا رتبه بندی میشود که کدام سایت اول نمایش داده شود و سپس کدام سایت ها یعنی به ترتیب کیفیت و محتوای سایت ها بیشتر توجه میشود و  الگوریتم های موجود در موتورهای جستجوگر تقریبا همگی به کیفیت بالا اهمیت میدهند چون هر سایتی که کیفیت بالاتری داشته باشد بهتر است ابتدا دیده شود .البته هر موتور جستجوگر الگوریتم خاص خودش را دارد مثلا یک وب سایتی ممکن است در گوگل در رتبه ی 1 باشد ولی در موتور جستجوی یاهو در رتبه ی 10 باشد و این بستگی دارد به الگوریتمی که پشت آن موتور است .الگوریتم های استفاده شده در موتور های جستجوگر تقریبا در حالت مخفی و سرّی  و دائما هم در حال بروزرسانی و بهبود هستند بنابراین صاحبان وب سایت ها باید مرتبا روی سئو سایت خود کار کنند تا الگوریتم های جدید سایت ها را بهتر بشناسد .اگر راز الگوریتم موتور جستجو فاش شود شرکت ها سعی میکنند آنرا دور بزنند و با ایجاد رتبه ی جعلی به جاهای بالاتری بروند که این باعث میشود موتور جستجو نتایج خوبی بدست نیاورد . گاهی نحوه ی کار کردن الگوریتم ها کشف میشود و اینجاست که خیلی ها سعی میکنند تقلب کنند و دقیقا بعد از این اتفاق توسعه دهندگان آن موتور جستجو الگوریتم را بروزرسانی میکنند و یک برچسب spam به آن سایت های متقلب میزنند و رتبه ی آنها به شدت کاهش پیدا میکند .موتورهای جستجو گر به سورس یک وب سایت مراجعه میکنند یعنی چیزی که موتور جستجوگر از یک سایت میبینید با چیزی که یک انسان میبیند متفاوت است . موتور جستجو متن ها را میخواند و برایش تصاویر و انیمیشن ها بی مفهوم است .به همین علت هم بود که سریعا بساط سایت هایی که کلا با فلش طراحی میشدند جمع شد چون انیمیشن ها و گرافیک فلش برای موتور نامفهوم بود و رتبه ی سایت هایی که با HTML و CSS ساخته شده بودند بسیار بهتر بود .در هر صورت اگر شیوه ای را اتخاذ کنیم که متن خالی توسط موتور ها قابل رویت نباشد به احتمال زیاد رتبه ای هم در موتور های جستجو نخواهیم داشت .موتورهای جستجوی وبدر متن بالا که درباره ی موتورهای جستجو صحبت میکردیم اشاره ی کوتاهی هم به موتور جستجوی وب داشتیم . همانطور که بالا هم گفتیم این موتور ها یک خزنده به سمت سایت شما ارسال میکنند و این توانایی را دارد که محتوای وب سایت شما را به همراه کلمات کلیدی یک صفحه واکشی کند . یک برنامه ی دیگری به نام indexer وجود دارد اسنادی که خرنده آورده است را میخواند و دسته بندی میکند و به آنها رتبه میدهد .هر موتور جستجوگری بر اساس الگوریتم خاص خود این رتبه بندی را انجام میدهد .از آنجایی که سازندگان وب سایت ها میدانند که قرار است خزنده های موتور جستجو گر های مختلف به سایت آنها مراجعه کند پس شروع میکنند به بهینه کردن وضعیت سایت خود و آماده کردن آن برای خزنده های موتور جستجو که به این کار SEO یا بهینه سازی موتورهای جستجوگر گفته میشود .ویژگی موتورهای جستجوموتورهای جستجو بدون نظارت انسان کار میکنند . هر شخصی میتواند از آنها استفاده کند و برخی از موتورهای جستجو نیز دارای نقص های درونی هستند .اما اگر کسی بخواهد موتورهای جستجو و الگوریتم واقعی آن را دور بزند ممکن است موتور جستجو آنرا بعنوان spam بشناسد .موتورهای جستجو دارای انواع اطلاعات بصورت یکجا میباشد مانند : شماره تلفن ها ، جزوات و مقالات اموزشی ،‌ ویدیوها ، موسیقی ، روزنامه ها ، وضعیت آب و هوا و خیلی اطلاعات دیگر ...موتورهای جستجو این قابلیت را دارند که انواع نیاز های کاربران را فراهم کنند .نکاتی که هنگام استفاده از موتور جستجوها باید رعایت کنیدما بعنوان یک جستجوگر باید یاد بگیریم که چطور عبارت دلخواهمان را به موتور جستجو بگوییم تا بهترین نتیجه را برای ما بیاورد .اپراتورهای جستجو به دو دسته ی اصلی تقسیم بندی میشوند :‌اپراتورهای Booleanاپراتورهای غیر Booleanدر اینجا منظور ما از اپراتور یک کلمه یا یک سمبلی است که تایپ میکنیم .اپراتور کلمه یا نمادی است که تایپ می کنیم. این راهنما را به موتور جستجو راهنمایی می کند تا بداند چه چیزی را جستجو کند. با استفاده از این اپراتورها می توانیم جستجوی خود را محدود یا گسترده تر کنیم ، بنابراین به ما کمک می کنیم تا وب سایت هایی را که برای شما مفید است پیدا کنیم.اپراتورهای هر موتور جستجوگر ویژه ی خودش میباشد و باید نسبت به موتوری که استفاده میکنید اپراتور های انها را یاد بگیرید .تکنیک های جستجوی Booleanعبارت AND :این عبارت به موتور جستجو گر میگوید یک عبارت یا عبارت دیگر اگر در محتوا بود به من نمایش بده . این راه کار باعث محدود شدن وب سایت ها و بهتره پیدا شدن نتیجه ی مورد نظر میشود مثلا اگر بخواهیم به موتور بگوییم گل و قرمز را برای ما پیدا کن یا گل و قرمز و آبی را پیدا کن باید رشته های زیر را جستجو کنیم :‌گل AND قرمزگل AND  فرمز AND آبیعبارت OR :این عبارت به موتور جستجو میگوید هر چیزی که OR بین آنها قرار گرفت یکی از آنها را پیدا کن مثلا گل یا آسمان فرقی ندارد پس گل OR آسمان ممکن است در نتایج جستجو هم آسمان داشته باشد هم گل !این مورد باعث زیاد شدن نتایج جستجو و سخت تر شدن پیدا کردن هدف اصلی میشود ولی بازه ی جستجو را گسترده میکند که کاربرد های خاص خود را دارد .عبارت NOT :این عبارت باعث حذف شدن یک کلمه خاص از نتایج جستجو میشود مثلا اگر ما به دنبال گوشی موبایل هستیم ولی نمیخواهیم مدل LG را نمایش دهد به راحتی مینویسیم  موبایل -ال جی . توجه کنید که این عبارت در دستورات جستجوی گوگل با علامت منفی یا - انجام میگیرد.تکنیک های جستجوی Non-Boolean در موتور های جستجوگرعبارت + :‌ این درست مثل AND عمل میکند یعنی اگر در بین دو یا چند عبارت قرار گیرد همه ی آنها باید در نتیجه ی جستجو باشند مثلا گل + أبی + قرمزعبارت - :‌این عبارت هم دقیقا مثل NOT عمل میکند که البته در مثال بالا در گوگل ما فقط توانستیم از - استفاده کنیم چون دستور گوگل همین است .عبارت &quot;&quot; :هر چیزی که بین &quot; &quot; قرار بگیرد به موتور جستجو میگوید عینا همین را جستجو بکن و جستجوی شما را خاص میکند .آموزش ساخت موتور جستجوی شخصی با Php و Mysqlشاید خیلی هیجان انگیز باشه که یه موتور جستجو بسازید هر چند ساده !‌ کلی مفاهیم یاد میگیرید و کلا دستتون میاد که موتور های جستجو چطور کار میکنند .ما قصد نداریم موتور جستجو گر حرفه ای بسازیم که در اندازه ی Yahoo یا Google باشه ما داریم تمرین میکنیم و حداقل یک موتور جستجو در حد موتور جستجوهای بومی که میتونیم بسازیم باهاش تفریح کنیم .پس شروع میکنیم و  با استفاده از ابزارهای اوپن سورس مثل PHP و MySQL این کار را انجام میدیم .خب از آنجایی که ما در این آموزش از زبان برنامه نویسی PHP استفاده خواهیم کرد طبیعتا شما باید با مفاهیم این زبان برنامه نویسی آشنا باشید و اگر آشنا نیستید اشکالی ندارد ما قبلا یک دوره ی آموزشی برای این زبان برگزار کردیم که از لینک زیر میتوانید تهیه کنید .همچنین اگر قصد دارید در زبان PHP تسلط شما بیشتر شود ما دو دوره ی پیشرفته دیگری هم برگزار کردیم که مطمئنا باعث ارتقای دانش و تخصص PHP در شما میشود و در تمامی زمینه های ساخت وب سایت به درد شما میخوره .از لینک های زیر میتوانید این دوره های پیش رفته را ببینید و در صورت تمایل در انها شرکت کنید .همچنین به علت اینکه پایگاه داده مورد استفاده ی ما MySQL است بهتره کمی کار با این پایگاه داده و کوئری های sql آشنا باشید ( با یه سرچ ساده پیدا میکنید ) .خب با این فرضیات ما شروع میکنیم ابتدا یک فرم خالی HTML میسازیم که کاربران عبارت مورد جستجو را آنجا وارد کنند و سپس یک دکمه میزاریم برای جستجو که وقتی کلیک شد جستجو انجام بگیرد .آموزش ساخت بخش پایگاه داده موتور جستجوگر اینترنتیخب همانطور که بالا اشاره کردیم پایگاه داده ی ما MySQL است پس باید ابتدا این پایگاه داده را نصب و راه اندازی کنید اگر ویندوزی هستید بهتره یکی از برنامه های زیر را بگیرید که PHP و MySQL و دیگر مخلفات را داخل خودش دارن :‌XamppWamppEasyPHPتوجه کنید که یکی از موارد بالا را به انتخاب خودتان نصب و اجرا کنید و ما Xampp را پیشنهاد میکنیم .برای شروع یک پایگاه داده با هر اسمی که دوست دارید بسازید و سپس یک جدول درونش به نام SEARCH_ENGINE بسازید .کد sql زیر به شما کمک میکند یک جدول با نام SEARCH_ENGINE بسازید .CREATE TABLE SEARCH_ENGINE (
       `id` INT(11) NOT NULL AUTO_INCREMENT,
       `pageurl` VARCHAR(255) NOT NULL,
       `pagecontent` TEXT NOT NULL,
       PRIMARY KEY (`id`))آموزش ساخت فرم برای موتور جستجوگر اینترنتیخب ، بعد از اینکه پایگاه داده آماده شد و جدول مورد نظر را ساختیم الان نوبت اینه که یک فرم HTML بسازیم که کاربران نهایی ما وقتی موتور جستجوگر ما را باز میکنند آنرا ببینند و بتوانند عبارت مورد نظر خود را تایپ کنند و دکمه ی جستجو را بزنند .در ریشه ی اصلی سرور مجازی که نصب کردید یه فایل جدید به نام index.php بسازید و محتویات زیر را درونش کپی کنید  .&lt;html&gt;
       &lt;head&gt;
             &lt;title&gt; My search engine &lt;/title&gt;
       &lt;/head&gt;
       &lt;body&gt;
             &lt; form action = &#039;search.php&#039; method = &#039;GET&#039; &gt;
                    &lt; center &gt;
                           &lt;h1 &gt; My Search Engine &lt;/h1 &gt;
                           &lt; input type = &#039;text&#039; size=&#039;90&#039; name = &#039;search&#039; &gt;
                           &lt;/ br &gt;
                           &lt;/ br &gt;
                           &lt; input type = &#039;submit&#039; name = &#039;submit&#039; value = &#039;Search source code&#039; &gt;
                           &lt; option &gt; 10 &lt;/ option &gt;
                           &lt; option &gt; 20 &lt;/ option &gt;
                           &lt; option &gt; 50 &lt;/ option &gt;
                    &lt;/ center &gt;
             &lt;/ form &gt;
       &lt;/ body &gt;
&lt;/ html &gt;فرم ما اکنون تکمیل شده و آماده استفاده است. این فرم توسط کاربران نهایی برای ورود به جستجوگر استفاده می شود و در عین حال به کاربران این امکان را می دهد که شماری از نتایج را که باید نشان داده شوند محدود کنند.آموزش نوشتن الگوریتم موتور جستجوگر اینترنتیبرای این کار ابتدا یک فایل دیگر PHP به نام search.php بسازید و در کنار همان index.php که بالا ساختیم قرار دهید . این فایل از بخش های زیر تشکیل خواهد شد .اتصال به پایگاه دادهاز کد زیر برای اتصال به پایگاه داده استفاده کنیدmysql_connect ( &amp;quotlocalhost&amp;quot, &amp;quotUSER_NAME&amp;quot, &amp;quotPASSWORD&amp;quot ) ; 
mysql_select_db ( &amp;quotDB_NAME&amp;quot );خب حالا که اتصال به پایگاه داده برقرار شد بهتره که کوئری مناسب با کلمه یا عبارت مورد جستجو توسط کاربر را بنویسیم .نوشتن کوئری متناسب با عبارت جستجو شدهکوئری مناسب برای این کار بصورت خیلی ساده طبق کدهای زیر است .$search_exploded = explode ( &amp;quot &amp;quot, $search );
$x = 0; 
foreach( $search_exploded as $search_each ) {
 $x++;
 $construct = &amp;quot &quot;
 if( $x == 1 )
   $construct .= &amp;quotkeywords LIKE &#039;%$search_each%&#039; &quot;
 else
   $construct .= &amp;quotAND keywords LIKE &#039;%$search_each%&#039; &quot;
  }
$construct = &amp;quot SELECT * FROM SEARCH_ENGINE WHERE $construct &quot;
$run = mysql_query( $construct );کار بعدی ما واکشی اطلاعات از پایگاه داده و نمایش آن به کاربر است . اگر جستجو نتیجه ای دربرنداشت هم باید پیامی به کاربر ارسال کنیم .واکشی نتیجه از پایگاه داده و قرار دادن نتیجه در اختیار کاربر . طبق کدهای زیر باید انجام بگیرد .if ($foundnum == 0)
             echo &amp;quotSorry, there are no matching result for &lt;b&gt; $search &lt;/b&gt;.
             &lt;/ br &gt;
             &lt;/ br &gt; 1. Try more general words. for example: If you want to search &#039;how to create a website&#039; then use general keyword like &#039;create&#039; &#039;website&#039;
             &lt;/ br &gt; 2. Try different words with similar  meaning
             &lt;/ br &gt; 3. Please check your spelling&quot; 
                    else {
                           echo &amp;quot$foundnum results found !&lt;p&gt;&quot;
                           while ( $runrows = mysql_fetch_assoc($run) ) {
                                  $title = $runrows [&#039;title&#039;];
                                  $desc = $runrows [&#039;description&#039;];
                                  $url = $runrows [&#039;url&#039;];
                                  echo &amp;quot&lt;a href=&#039;$url&#039;&gt; &lt;b&gt; $title &lt;/b&gt; &lt;/a&gt; &lt;br&gt; $desc &lt;br&gt; &lt;a href=&#039;$url&#039;&gt; $url &lt;/a&gt; &lt;p&gt;&quot;
                    }
             }اکنون موتور جستجوی ساده ی ما آماده است .  در زیر کد کامل search.php را میبینید .&lt;?php
       $button = $_GET[ &#039;submit&#039; ];
       $search = $_GET[ &#039;search&#039; ]; 
 
       if( !$button )
             echo &amp;quotyou didn&#039;t submit a keyword&quot;
       else {
             if( strlen( $search ) &lt;= 1 )
                    echo &amp;quotSearch term too short&quot;
             else {
                    echo &amp;quotYou searched for &lt;b&gt; $search &lt;/b&gt; &lt;hr size=&#039;1&#039; &gt; &lt;/ br &gt; &quot;
                    mysql_connect( &amp;quotlocalhost&amp;quot,&amp;quotUSERNAME&amp;quot,&amp;quotPASSWORD&amp;quot) ; 
                    mysql_select_db(&amp;quotDBNAME&amp;quot);
 
                    $search_exploded = explode ( &amp;quot &amp;quot, $search );
                    $x = 0; 
                    foreach( $search_exploded as $search_each ) {
                           $x++;
                           $construct = &amp;quot&quot;
                           if( $x == 1 )
                                  $construct .=&amp;quotkeywords LIKE &#039;%$search_each%&#039;&quot;
                           else
                                  $construct .=&amp;quotAND keywords LIKE &#039;%$search_each%&#039;&quot;
                    }
 
                    $construct = &amp;quot SELECT * FROM SEARCH_ENGINE WHERE $construct &quot;
                    $run = mysql_query( $construct );
 
                    $foundnum = mysql_num_rows($run);
 
                    if ($foundnum == 0)
                           echo &amp;quotSorry, there are no matching result for &lt;b&gt; $search &lt;/b&gt;. &lt;/br&gt; &lt;/br&gt; 1. Try more general words. for example: If you want to search &#039;how to create a website&#039; then use general keyword like &#039;create&#039; &#039;website&#039; &lt;/br&gt; 2. Try different words with similar  meaning &lt;/br&gt; 3. Please check your spelling&quot; 
                    else {
                           echo &amp;quot$foundnum results found !&lt;p&gt;&quot;
 
                           while( $runrows = mysql_fetch_assoc( $run ) ) {
                                  $title = $runrows [&#039;title&#039;];
                                  $desc = $runrows [&#039;description&#039;];
                                  $url = $runrows [&#039;url&#039;];
 
                                  echo &amp;quot&lt;a href=&#039;$url&#039;&gt; &lt;b&gt; $title &lt;/b&gt; &lt;/a&gt; &lt;br&gt; $desc &lt;br&gt; &lt;a href=&#039;$url&#039;&gt; $url &lt;/a&gt; &lt;p&gt;&quot;
 
                           }
                    }
 
             }
       }
 ?&gt;ساختار موتور جستجوگر اینترنتی پیشرفته ترموتور های جستجوگر معمولا پیشرفته تر هستند یعنی شامل بخش ها و کدهای زیادی هستند که برای مثال یک عبارت خاص را از بین میلیون ها اسناد واکشی میکنند و نتایج را دسته بندی و مرتب سازی کرده و به کاربر نهایی نمایش میدهند .حالا این وسط ممکن است کاربر نهایی یکی از عبارت ها را اشتباه تایپ کرده باشد ولی موتور جستجوگر شما باید قادر باشد آنرا بفهمدیا مثلا کاربر کلمه ی دقیق یک چیزی را به یاد نمی آورد و با اشاره به کلمات مشابه آن میخواهد آنرا پیدا کند گوگل این قابلیت را دارد که به این شخص در پیدا کردن گمشده ی خود کمک کندپس موتور های جستجوگر بزرگ در اینترنت بسیار گسترده تر از حوصله ای این آموزش و گنجایش اینجاست . ما قصد داریم اساس و پایه را یاد بگیرید سپس میتوانید آنرا گسترش دهید و حداقل یک موتور جستجو متوسط برای ایران بسازید که بومی باشد و به درد بخور !!!بخش های اصلی یک موتور جستجوی اینترنتییک خزنده که اصطلاحا به آن crawler گفته میشود که وظیفه اش واکشی اطلاعات مربوط به سایت ها و اسناد و کلا جمع آوری هر آنچه در اینترنت است .یک بخش index برای نگهداری صفحات یا اسناد ذخیره شده که بصورت ساختاری در آنجا قرار گرفته اندو یک مخزن اسناد برای نگهداری اطلاعات مربوط به کل اسناد موجودخزنده یا crawler موتور های جستجو چطور کار میکنندهمانگونه که بالا هم گفتیم خزنده ها یا crawler ها در سرتاسر اینترنت میچرخند و اطلاعات سایت ها را جمع آوری میکنند اما خزنده ها باید لیستی از URL های اینترنتی داشته باشند که به آنها رجوع کنند . برای این کار چند روش کلی وجود دارد که در زیر به آنها پرداخته ایم .متداول ترین روش این است که URL ها را بعنوان یک لیست و feed به خزنده بدهیم . سپس خزنده یک به یک به آنها رفته و عمل crawle را انجام دهد .روش دیگر دانلود کردن لیستی از URL ها و استفاده از آنهاست .ابتدا یک تجزیه کننده ی لینک ها مینویسیم تا لینک های واقعی را بشناسیم . کدهای زیر را ببینید .$file_handle = fopen&#40; &amp;quot Quantcast-Top-Million.txt &amp;quot, &amp;quotr&amp;quot &#41;;
 
       while ( !feof ( $file_handle ) ) {
             $line = fgets( $file_handle );
             if( preg_match( &#039;/^\d+/&#039;,$line ) ) { # if it starts with some amount of digits
                    $tmp = explode( &amp;quot\t&amp;quot,$line );
                    $rank = trim( $tmp[0] );
                    $url = trim( $tmp[1] );
                    if( $url != &#039;Hidden profile&#039; ) { # Hidden profile appears sometimes just ignore then
                           echo $	
			}
		}
	}
	fclose( $file_handle );سپس کد خزنده را برای دریافت محتوای یک URL مینویسیم که دانلود کردن دااده های سایت های در لیست ممکن است کمی زمان ببرد .$file_handle = fopen&#40;&amp;quoturllist.txt&amp;quot, &amp;quotr&amp;quot&#41;;
         while (!feof($file_handle)) {
                 $url = trim(fgets($file_handle));
                 $content = file_get_contents&#40;$url&#41;;
                 $document = array($url,$content);
                 $serialized = serialize($document);
                 $fp = fopen&#40;&#039;./documents/&#039;.md5($url&#41;, &#039;w&#039;);
                 fwrite($fp, $serialized);
                 fclose($fp);
         }
         fclose($file_handle);خزنده ی بالا یک خزنده ساده ی تک رشته ای است که داخل حلقه ای تمامی URL ها را واکشی میکند اطلاعات آنها را دریافت و در دیسک ذخیره سازی میکند  .نکته ای که وجود دارد این است که URL به همراه محتوای آن هم در یک فایل ذخیره میکنیم و این URL به رتبه بندی لیست و همچنین برای اینکه متوجه شویم منبع این محتوا کجاست به درد میخورد .بخش INDEXاین بخش باید مسئولیت هایی را برعهده ی خود داشته باشد :‌نیاز است که محتویات را در دیسک ذخیره کند و آنها را واکشی کندوقتی میخواهیم همه چیز را دوباره تولید کنیم باید قادر باشد خودش را پاکسازی کندباید اسنادی که ذخیره میکند را اعتبار سنجی کندبا تعاریف بالا باید interface خود را به شکل زیر داشته باشیمinterface iindex {
                 public function storeDocuments($name,array $documents);
                 public function getDocuments($name);
                 public function clearIndex();
                 public function validateDocument(array $document);
         }هر چند پیاده سازی یک موتور جستجو کار ساده ای نیست ولی ما سعی کردیم کلیت موضوع را در این مقاله برای شما آشکار کنیم . چیزی که شما نیاز دارید این است که الان بدون ترس وارد کدها شوید و تمرین و تست کنید برای هر بخشی کی راه کاری مطمئنا وجود دارد .به اتمام مقاله رسیدیم و منتظر نظرات و پیشنهادات شما برای تکمیل این مقاله هستیم.منبع: https://avasam.ir/post/144/%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85%20%D9%85%D9%88%D8%AA%D9%88%D8%B1%20%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%20%D9%88%20%D8%A2%D9%85%D9%88%D8%B2%D8%B4%20%D8%B3%D8%A7%D8%AE%D8%AA%20%D9%85%D9%88%D8%AA%D9%88%D8%B1%20%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%20%D8%A8%D8%A7%20PHP </description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Tue, 16 Feb 2021 09:54:59 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت توزیع لینوکس</title>
                <link>https://virgool.io/@m_974892/linux-v1glb7yrep9o</link>
                <description>سلام دوستان؛ من میخواستم یک توزیع لینوکس بسازم. ولی چند مشکل داشتم.اول اینکه کلا چطور میشه توزیع لینوکس ساخت؟دوما اینکه تو آموزش هایی که در گوگل پیدا کردم, باید لینوکس رو تو سیستم خودت بوت کنی و...آیا باید روی سیستم بوت کرد یا میتوان به صورت مجازی تولید کرد؟و اینکه بعد از بوت کردن چطور میتونم دوباره ویندوز رو نصب کنمو اینکه چطور میتونم برنامه بسازم برای توزیع؟لطفا راهنمایی کنید.اگر سایتی میشناسید,(چه فارسی چه زبان اصلی)لطفا بدیدلللللطططططففففففاااا</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Sat, 30 Jan 2021 20:46:20 +0330</pubDate>
            </item>
                    <item>
                <title>چطور به پایتون بگم که مثلاً از کلمه print() کاربر بگذر و اون چیزی که درون پرانتز هست رو چاپ کن؟</title>
                <link>https://virgool.io/@m_974892/%DA%86%D8%B7%D9%88%D8%B1-%D8%A8%D9%87-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%A8%DA%AF%D9%85-%DA%A9%D9%87-%D9%85%D8%AB%D9%84%D8%A7%D9%8B-%D8%A7%D8%B2-%DA%A9%D9%84%D9%85%D9%87-print-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1-%D8%A8%DA%AF%D8%B0%D8%B1-%D9%88-%D8%A7%D9%88%D9%86-%DA%86%DB%8C%D8%B2%DB%8C-%DA%A9%D9%87-%D8%AF%D8%B1%D9%88%D9%86-%D9%BE%D8%B1%D8%A7%D9%86%D8%AA%D8%B2-%D9%87%D8%B3%D8%AA-%D8%B1%D9%88-%DA%86%D8%A7%D9%BE-%DA%A9%D9%86-egh4mrlypzh4</link>
                <description>سلام دوستان.من به فکر ساخت یک زبان برنامه نویسی افتاده ام.میخواهم نسخه اولیه اش با پایتون باشه.ولی یک چند تا مشکل داشتم؛لطفا میتونین در مورد ساخت لکسر راهنمایی کنید؟و اینکه مثلا(همون طور که در عنوان گفتم) چطور مثلا بگم وقتی name=value توسط کاربر تایپ شد، اولی رو به عنوان نام متغیر  ست کنه از مساوی بپره و دومی رو به عنوان مقدار ضبط کنه؟و در حالت کلی چطور میتونم تو پایتون از یک چیزی که توسط کاربر تایپ شده بگذرم؟لطفا راهنمایی کنید.</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Tue, 05 Jan 2021 12:39:19 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت دستیار صوتی</title>
                <link>https://virgool.io/@m_974892/voiceassistant-o0wmqfgfics5</link>
                <description>سلام دوستان.من میخواستم یک دستیار صوتی مانند گوگل آسیستنت یا سیری یا الکسا بسازم.(البته خیلی ساده تر).تو گوگل حدودا یک هفته جستجو کردم ولی نتیجه مطلوب نداشت.تنها راهی که پیدا کردم استفاده از سرویس های آماده مانند گوگل هست.و توی یکی از مقالات ویرگول که توسط آقای حسن کاشی نوشته شده بود ایشون مباحث اولیه را توضیح دادند و بقیه را گفتند برای پست بعد ولی هر چه قدر گشتم پست به ایشان رو پیدا نکردم.البته من نمی گم آقای کاشی کاری کردند یا ایشون رو مسخره کنم.(البته من خودم اونو نمیدونم که ایشون میدونه!)(من کدوم نفری باشم که مخترع زبان هاسکال رو مسخره کنم؟!؟)لطفا راهنمایی کنید.</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Tue, 29 Dec 2020 09:02:17 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه میتونم تو سی پلاس پلاس به کامپایلر بگم که مثلا اگه فلان چیز توسط کاربر تایپ شد فلان کار رو بکن؟</title>
                <link>https://virgool.io/@m_974892/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%85%DB%8C%D8%AA%D9%88%D9%86%D9%85-%D8%AA%D9%88-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3-%D8%A8%D9%87-%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1-%D8%A8%DA%AF%D9%85-%DA%A9%D9%87-%D9%85%D8%AB%D9%84%D8%A7-%D8%A7%DA%AF%D9%87-%D9%81%D9%84%D8%A7%D9%86-%DA%86%DB%8C%D8%B2-%D8%AA%D9%88%D8%B3%D8%B7-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1-%D8%AA%D8%A7%DB%8C%D9%BE-%D8%B4%D8%AF-%D9%81%D9%84%D8%A7%D9%86-%DA%A9%D8%A7%D8%B1-%D8%B1%D9%88-%D8%A8%DA%A9%D9%86-lrx2yrrqmr3w</link>
                <description>شاید الان بگین که چرخ رو که دوباره نمیسازن?ولی شما چرا ۲۰۰ سال پیش و چرخ امروز رو در نظر بگیرین.کدوم بهتره؟قطعا چرخ امروزیدوستان یکی از مشکلاتی که داشتم رو تو عنوان گفتم و یکی دیگر از مشکلاتی اینه که مثلا چطور میتونم تمام فایل کد هایی که تو یک پوشه قرار داره رو تو یک فایل کامپایل کنم و نتایج همشون یکجا باشه؟و اگه انتخابم تو زبان برنامه نویسی برای ساختش(سی پلاس پلاس) انتخاب مناسبی نیست لطفا بگید.لطفا راهنمایی کنیدممنون</description>
                <category>ابوالفضل ملک پور</category>
                <author>ابوالفضل ملک پور</author>
                <pubDate>Thu, 17 Dec 2020 11:58:29 +0330</pubDate>
            </item>
            </channel>
</rss>