<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محسن پورعینی</title>
        <link>https://virgool.io/feed/@mopoy</link>
        <description>اینجا درمورد هرچیزی که احساس میکنم مفید هست صحبت میکنم.</description>
        <language>fa</language>
        <pubDate>2026-04-15 00:36:12</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1125454/avatar/Pyj2mX.png?height=120&amp;width=120</url>
            <title>محسن پورعینی</title>
            <link>https://virgool.io/@mopoy</link>
        </image>

                    <item>
                <title>هوش مصنوعی راه حل است؛ اما مسئله چیست؟</title>
                <link>https://virgool.io/@mopoy/%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%B1%D8%A7%D9%87-%D8%AD%D9%84-%D8%A7%D8%B3%D8%AA-%D8%A7%D9%85%D8%A7-%D9%85%D8%B3%D8%A6%D9%84%D9%87-%DA%86%DB%8C%D8%B3%D8%AA-tev98uxo7qwj</link>
                <description>هوش مصنوعی راه حل است؛ اما مسئله چیست؟وقتی صحبت از آینده نیروی کار، گسترش هوش مصنوعی در صنایع مختلف و به خطر افتادن مشاغل می‌شود، معمولاً این نتیجه‌گیری مطرح می‌شود که مهارت‌های آینده دیگر نه برنامه‌نویسی، طراحی و موارد مشابه بلکه «کار کردن با هوش مصنوعی» مهم‌ترین توانایی خواهد بود.با این حال، به نظر می‌رسد این طرز فکر بیش از آنکه تصویری واقعی از آینده باشد، بازتابی از محدودیت‌های فعلی هوش مصنوعی است. با رشد سریع این سیستم‌ها و رقابت میان آن‌ها برای ارائه بهترین خروجی با ساده‌ترین تعامل کاربر، احتمالاً مهارت استفاده از هوش مصنوعی نیز به سطحی عمومی و همگانی می‌رسد؛ چیزی شبیه مهارت خواندن و نوشتن که امروز برای اغلب افراد بدیهی است.اگر چالش آینده نه صرفاً مهارت‌های فنی باشد و نه حتی توانایی کار با هوش مصنوعی، پس پرسش اصلی این است: آینده بر چه مهارتی بنا خواهد شد؟پاسخ دقیق به این سؤال ساده نیست. سرعت تغییرات جهان از توان تحلیل ما پیشی گرفته و پیچیدگی عوامل اثرگذار آن‌قدر زیاد است که نمی‌توان همه متغیرها را هم‌زمان در نظر گرفت. به همین دلیل، دیدگاه ما نسبت به این موضوع نیز احتمالاً در طول زمان تغییر خواهد کرد.با این حال، شاید مهم‌ترین مهارت آینده نه «حل مسئله»، بلکه «تشخیص مسئله‌ای باشد که ارزش حل کردن دارد». در دنیایی که ارائه راهکارهای فنی، اجرا و حتی یافتن پاسخ‌ها سریع‌تر، ارزان‌تر و در دسترس‌تر می‌شود، پرسش تعیین‌کننده این خواهد بود که کدام مسئله واقعاً اهمیت دارد؛کدام چالش ارزش بیشتری خلق می‌کند و مسئله بزرگ‌تری را برای جامعه‌ای گسترده‌تر حل می‌کند و می‌تواند اثری ماندگارتر بر زندگی انسان‌ها بگذارد.این تاپیک رو ادامه بدیم؟</description>
                <category>محسن پورعینی</category>
                <author>محسن پورعینی</author>
                <pubDate>Mon, 16 Feb 2026 03:02:47 +0330</pubDate>
            </item>
                    <item>
                <title>در اعماق وب سوکت چه میگذرد؟</title>
                <link>https://virgool.io/@mopoy/%D8%AF%D8%B1-%D8%A7%D8%B9%D9%85%D8%A7%D9%82-%D9%88%D8%A8-%D8%B3%D9%88%DA%A9%D8%AA-%DA%86%D9%87-%D9%85%DB%8C%DA%AF%D8%B0%D8%B1%D8%AF-dhww4vejjh8t</link>
                <description>WebSocket پروتکل برقراری ارتباط دوطرفه و Real-Timeمعمولا هرجا صحبت از Real-Time بودن و چت یا گیمینگ و ... کلا هر نوع از ارتباطی که مداوم و در لحظه باشه معمولا رد پای WebSocket دیده میشه، حالا یا خودش یا پسر خوندش (کتاب خونه Socket.IO)همیشه بهمون میگن پروتکل WebSocket یک پروتکل دوطرفه است و اصطلاحاتی مثل Full Duplex و Bidirectional  رو همراه وب سکوت دیدیم.احتمالا شما که دارید این مقاله رو میخونید قبلا حداقل یک بار از وب سکوت استفاده کردید یا حداقل تو پروژه دیدید.میخواییم بدونیم اصلا یک Connection وب سکوت چطور برقرار میشه، چطور پایدار میمونه، چطور بسته های حجیم رو جا به جا میکنه بدون اینکه کسی رو اذیت کنه و در آخر درمورد ارور هندلینگ ها و مزایا و معایب و یکم هم درمورد جایگزین هاش صحبت میکنیم.1. چگونه به تفاهم رسیدیم؟در ب بسم الله یک کانکشن وب سکوت از یک ریکوئست HTTP شروع میشه. در واقع یک ریکوئست  HTTP با هدر Upgrade: websocket از طرف کلاینت به سرور فرستاده میشه. درصورتی که سرور از وب سوکت پشتیبانی کنه به اون ریکوئست جواب بله رو میده ( حالا با مثال میبینیم مراحل رو)اول یک نگاه بندازیم به این ریکوئست HTTP که قدم اول Handshake وب سکوت ما و سرور هست:GET /chat HTTP/1.1
Host: api.mopoy.ir
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: 1Tzi+sYL+4QtM0lQUzu5Zw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://mopoy.irهدر Connection به سرور میگه که کلاینت میخواد درمورد نوع ارتباطی تصمیمات جدیدی بگیره(میخواد با سرور مذاکره کنه)، که اینجا میگه میخواد آپدیت کنه نوع ارتباط رو.این ریکوئست برای سوییچ کردن پروتکل به وب سکوت از طرح کلاینت ارسال میشه، مشخصا اگه سرور از وب سکوت پشتیبانی کنه باید به این ریکوئست جواب بده، تا اینجا اوکیه. سه تا هدر جدید هم به چشم میخوره تو این ریکوئست:Sec-WebSocket-Key:کلاینت برای اینکه بفهمه سرور دقیقا حرفشو میفهمه نیاز به یک تضمین داره! و اون تضمین یک nounce  16 بیتی رندوم هست که سمت کلاینت ساخته میشه و base64 encode میشه و با این هدر میفرسته سمت سرور. سرور هم باید یک GUID تولید کنه و بچسبونه به این کلید و با SHA-1 هش کنه و بفرسته سمت کلاینتSec-WebSocket-Protocol:کلاینت باید ساب پروتکل هایی که میتونه باهاش کار کنه رو به سرور بفرسته و سرور یکی از اینا رو انتخاب میکنه و در Response بهش برمیگردونه. بعدا بیشتر درموردش صحبت میکنم...آخری هم که ورژن هست که فقط همون 13 مورد قبوله (تاجایی که من میدونم).خب، حالا این ریکوئست ارسال شد سرور باید چی برگردونه؟ یه نمونه ببینیم:HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: Jsbx+rL41g/L+BDIlMTM6zH4QbKs1w==
Sec-WebSocket-Protocol: chatمشخصا اگه جواب بله بود با یک Http Response 101 که به معنی تغییر پروتکل هست طرفیم.Sec-WebSocket-Accept جواب هش شده و base64 همون Sec-WebSocket-Key هست که کلاینت فرستاده بود.Sec-WebSocket-Protocol هم ساب پروتوکل انتخابی سرور هستانتخاب ساب پروتکل توسط سرور به این شکل هست که کلاینت لیست ساب پروتکل های که میتونه و میخواد استفاده کنه رو به ترتیب الویت (اولی بالاترین الویت) برای سرور میفرسته و سرور نگاه میکنه اولین پروتکلی که براش قابل استفاده هست رو انتخاب میکنه و برای کلاینت بر میگردونه.درمورد ساب پروتکل ها بعدا بیشتر صحبت میکنیم.پس تا اینجا سرور و کلاینت به تفاهم رسیدن و کانکشن وب سکوت بینشون برقراره.پ.ن: اصولا وقتی دارید از یک کتابخونه برای وب سکوت استفاده میکنید یا اگه تو وب هستید، آبجکت WebSocket مرورگر رو صدا میزنید، همه این کار ها ( Handshake و...) اتوماتیک انجام میشه و نیاز نیز باهاش درگیر بشید.2. ساختار پیام:WS Frame Struct (RFC 6455)طبق این نمودار که RFC وب سکوت ارائه داده، ساختار یک فریم پیام وب سکوت به این صورت هست. بیایید بخش های مختلف این نمودار و اجزای یک فریم وب سکوت رو با مثال بررسی کنیم.بعد از اینکه Handshake میان کلاینت و سرور اتفاق افتاد تبادل دیتا بین کلاینت و سرور شروع میشهمثلا این یک نمونه دیتایی هست که میتونه از کلاینت به سرور ارسال بشه:0x81 0x05 0x48 0x65 0x6c 0x6c 0x6f 
یا بصورت
0x81\0x05\Helloاین یک نمونه ساده Frame وب سوکت هست حاوی پیام Hello (فریم Unmasked)بیایید از اولین بخش این پیام شروع کنیم، اولین عدد Hex این پیام (که اینجا 0x81 هستش) به ما چند تا چیز رو نشون میده، FIN, opcode, frame type و اکستنشن ها (درصورت استفاده)بیایید دونه دونه این هارو بررسی کنیم ببنیم چی هستن.0x81اول از همه این عدد رو اگه به باینری تبدیل کنیم میرسیم به -&gt;Byte2 : 1000 0001از سمت چپ اولین عدد &quot;1&quot; میشه همون FIN، این وقتی برای پیام های Fragment یا همون تکه تکه شده کاربرد داره که تو بخش بعدی مفصل بررسی میکنیمش. درحالت کلی این بیت FIN اگه صفر باشه یعنی پیام تکه تکه شده و هنوز ادامه داره ولی اگه یک باشه یعنی آخرین بخش پیامه (یا اینکه پیام تکه تکه نشده و کلا همین یدونه هست)سه تا بیت بعدی از همین بایت بیت های رزرو هستن برای اکستنشن ها، هرکدوم از اینا اگر یک باشن اکستنشن مربوطه (اگر سرور پشتبیانی کنه) استفاده میشه. درمورد اکستنشن ها تو بخش خودش صحبت میکنیم اصلا چی  هستن و برای چه کاری میان فعلا تا همینجا کافیه.چهار بیت بعدی ،که میشه بایت دوم، opcode هست، اونایی که قبلا شبکه کار کردن و با پروتکل ها آشنایی دارن میدون opcode چیه، اینجا یه مختصری بهش اشاره میکنیم. درحالت کلی آپ کد نوع پیام یا نوع کاری که پیام قراره انجام بده رو معمولا مشخص میکنه اینجا تو وب سکوت از 0 تا 15 (0 تا F) که میشه 0000 تا 1111 داخل بایت، آپ کد داریم که دونه دونه بررسیشون میکنیم0: آپ کد صفر یعنی اینکه این فریم ادامه فریم های قبلیه (پیام فرگمنت شده) و از قبلی ها تبعیت میکنه1: آپ کد یک میگه محتوای پیام یک text UTF-8 معمولیه 2: آپ کد دو میگه محتوای پیام یه باینریه ( هرچیزی عملا میتونه باشه، یه جاهایی کاربرد جالب داره بعدا اگه شد نگاه میکنیم بهش)3-7: آپ کد های سه تا هفت هم رزرو هستن برای دیتا فریم های سفارشی8: آپ کد 8 کانکشن رو terminate میکنه (میبنده)9-10: آپ کد 9 و 10 برای پینگ هست، وقتی یک کانکشن وب سکوت درجریان هرزگاهی کلاینت یه مسیج پینگ برای سرور میفرسته تا مطمعن بشه هنوز کانکشن برقراره، در جواب باید مسیج با آپ کد 10 از سرور بگیره11-15: آپ کد های یازده تا پانزده هم رزرو هستن برای کنترل فریم های سفارشیبعد از این میرسیم به بخش دوم پیام یعنی 0x05اگه اینو به باینری تبدیل کنیم میشه 01013. پیام تکه تکه شده:3. من هنوز یک کانکشن پایدار هستم! :یک کانکشن وب سوکت ذاتا یک کانکشن مداوم و پایدار هست، یعنی تا زمانی که لازم داریم میتونیم ارتباط رو باز نگه داریم و مکاتبه کنیم. از نظر تئوری برای همیشه میتونه این ارتباط باز باشه ولی میدونیم که در عملا همچین چیزی نیست، مشکلات شبکه،packet loss و issue های سمت سرور و کلاینت و صد ها عامل دیگه ممکنه این کانکشن رو به خطر بندازه و هر آن قطع بشه.چند تا مسئله رو بیایید بررسی کنیم:اول اینکه چی باعث میشه یک کانکشن وب سکوت پایدار باشه. و چه عواملی میتونه باعث از دست دادن این ارتباط بشه. کلاینت و سرور چطور میفهمن که هنوز کانکشن پایداره و اون سمت مشکلی نیست؟و در نهایت اگه مشکلی پیش اومد یا packet loss اتفاق افتاد چی پیش میاد؟قبل از اینکه بخواییم به اینا بپردازیم بیایید ببینیم اصلا وب سکوت چطور با کمترین میزان Overhead  برای سرور و شبکه، دیتا های حجیم و Bulk رو Transmitمیکنه.درحال نوشتن...</description>
                <category>محسن پورعینی</category>
                <author>محسن پورعینی</author>
                <pubDate>Mon, 26 Aug 2024 04:30:36 +0330</pubDate>
            </item>
                    <item>
                <title>پارادایم های برنامه نویسی و زبان های مولتی پارادایم</title>
                <link>https://virgool.io/@mopoy/%D9%BE%D8%A7%D8%B1%D8%A7%D8%AF%D8%A7%DB%8C%D9%85-%D9%87%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%88-%D8%B2%D8%A8%D8%A7%D9%86-%D9%87%D8%A7%DB%8C-%D9%85%D9%88%D9%84%D8%AA%DB%8C-%D9%BE%D8%A7%D8%B1%D8%A7%D8%AF%D8%A7%DB%8C%D9%85-o6sudawu32bp</link>
                <description>پارادایم های برنامه نویسی هر کسی که حداقل یه بار توی حوزه برنامه نویسی مطالعه کرده باشه قطعا درمورد برنامه نویسی شی گرا یا فانکشنال شنیده! بعضی ها فکر میکنن شی گرا بهتر از فانشکنال هست که باید بگم کاملا اشتباه میکنن و نمیشه گفت کدوم بهتره چون هرکدوم مزیت ها و ویژگی های خوب خودشون رو دارن. تو این مثاله میخواییم برسی کنیم این اسم هایی که نسبت میدن به زبان های برنامه نویسی چین و چند مورد از اونارو برسی کنیم.پارادایم های برنامه نویسی:عموما پارادایم های برنامه نویسی برای دسته بندی کردن زبان های برنامه نویسی بر اساس ویژگی های عملکردیشون هست. دلیل اصلی وجود خیلی از پارادایم های برنامه نویسی و هدفشون مدیریت روند برنامه ، مدیریت منابع ، مدیریت و کنترل ساید افکت ها و توسعه پذیری برنامه هستشبرنامه نویسی شی گرا:شی گرا یه اسم خیلی اشنا توی برنامه نویسی هستش ، تو این پارادایم برنامه نویسی محور اصلی برنامه روی چیزی به اسم شی برقرار هست و اصطلاحا برنامه نویسی به شی گرایش داره، توابع و داده هایی( در هر نوعی که باشند) که تو یک موجودیت مفهومی قرار دارند در قالب یک شی کنار هم قرار میگیرن و دسته بندی میشن.توی شی گرایی مفاهیم زیادی مثل وراثت و کپسوله سازی و پولی مورفیسم و کلاس و ... وجود داره که نمیخوام تو این مقاله درموردش صحبت کنم.برنامه‌نویسی تابعی:برنامه نویسی فانکشنال یا تابعی یک پارادایم برنامه نویس هستش که برنامه از  ترکیب و فراخوانی توابع تشکیل میشه ، یعنی به جای توالی یه سری دستورات اعلانی صرفا درختی از فراخوانی توابع رو داریم که صرفا مقداری رو برمیگردونن.تو برنامه‌نویسی تابعی، توابع به عنوان شهروندان درجه یک تلقی می‌شوند،یعنی توابع رو میتونیم به عنوان آرگومان ارسال کنیم و یا از توابع دیگر برگردونده شن. دقیقا مثل بقیه نوع داده ها.برنامه نویسی دستوری VS برنامه نویسی اعلانی:برنامه نویسی دستوری هم یکی از پارادایم های برنامه نویسی هستش که برنامه نویس همه کار هایی که میخواد انجام بشه رو دستور به دستور باید اشاره کنه بهش. این پارادایم دقیقا نقطه مقابل برنامه نویسی اعلانی هستشبرای مثال شما توی زبان دستوری اگه میخوایین یک لیوان آب بریزین باید مرحله به مرحله توضیح بدین مثلا = پاشو - پارچ آب رو بردار - لیوان رو بردار - پارچ رو خم کن روی لیوان و منتظر شو تا وقتی که لیوان میخواد سرریز شه!!! ولی توی زبان های اعلانی شما فقط میگین یه لیوان آب بریز ، یعنی فقط نتیجه کار هارو شما اعلان میکنین نه اینکه مراحل رو توضیح بدینپاردایم های برنامه نویسی خیلی خیلی زیادن (مثل برنامه نویسی ری اکتیو و پردازش موازی و پردازش همروندی و مبتنی بر کلاس ، مبتنی بر بازیگر ، پروسه ای ، منطقی و ...) و من خواستم فقط به پند تاشون که پر استفادن اشاره کنم.حالا زبان های مولتی پارادایم:زبان هایی مثل جاوااسکریپت ویژگی های جالب زیادی دارن مثل مولتی پاردایم بودن ، مثلا شما میتونین تو جاوا اسکریپت هم فانکشنال کار کنین هم شی گرا هم خیلی از پارادایم های دیگه. که البته یسری ابزار ها هستن که مولتی پارادایم بودن رو برای ما تو هر زبان برنامه نویسی میسر میکنن.</description>
                <category>محسن پورعینی</category>
                <author>محسن پورعینی</author>
                <pubDate>Fri, 10 Sep 2021 16:31:52 +0430</pubDate>
            </item>
                    <item>
                <title>دقایقی با فلیپ فلاپ ها (Flip Flop)</title>
                <link>https://virgool.io/@mopoy/%D8%AF%D9%82%D8%A7%DB%8C%D9%82%DB%8C-%D8%A8%D8%A7-%D9%81%D9%84%DB%8C%D9%BE-%D9%81%D9%84%D8%A7%D9%BE-%D9%87%D8%A7-flip-flop-vnpdulovdjso</link>
                <description>وقتی صحبت از مدار های ترتیبی میشود ، دو دسته سنکرون ها و آسنکرون ها به میان می آید. در این مدار ها خروجی مدار در هر لحظه وابسته به متغیر های ورودی و وضعیت کنونی عناصر حافظه است که خوده وضعیت عناصر حافظه بصورت بازگشتی وابسته ورودی های پیشین مدار است.حافظه ای که درمدار های ترتیبی وجود دارد فلیپ فلاپ نامید میشود. فلیپ فلاپ ها انواع مختلفی دارند که من در این مقاله درمورد دو فلیپ فلاپ SR و D  میخوام صحبت کنم.فلیپ فلاپ SR:فلیپ فلاپ های SR  دارای سه ورودی S , R و C  هستند ، که ورودی S جهت یک کردن فلیپ فلاپ ، ورودی R  جهت صفر کردن فلیپ فلاپ (که بیشتر توضیح میدم منظور چی هست) و C که پالس کلاک ، جهت سنکرون کردن مدار هست (درمورد کاربرد این هم صحبت خواهیم کرد در ادامه).فرم سمبولیک و جدول مشخصات فلیپ فلاپ SRدر این فلیپ فلاپ اگر پالس کلاک وجود نداشته باشه خروجی مدار تغییر نمیکنه و عملا  S  و  R هیچ تاثیری روی وضعیت عناصر ندارند، فقط موقعیکه پالس ساعت از 0 به 1 تغییر میکنه خروجی متناسب با R , S  تغییر میکنه و همونطور بکه تو تصویر مشخصه اگر S=0 , R=1 اشه خروجی Q برابر 0 و اگر S =1 , R =0 خروجی Q برابر 1 و اگر هر هر دوی S , R صف باشند خروجی تغییر نمیکنه یعنی همون Q(t) (وضعیت قبلی) هست و اگر هر دو 1 باشند خروجی نا مشخص هستش که هم ممکنه 1  هم ممکنه 0 باشه (اینم بستگی به تاخیر مدار های داخلی فلیپ فلاپ داره).فلیپ فلاپ D:اگر در فلیپ فلاپ SR  بین ورودی های  S , R  معکوس کننده بزاریم فلیپ فلاپ D  بدست میاد ، فلیپ فلاپ D یه ورودی D داره که زمانی که مقدار پالس کلاک از 0 به 1 میره ، مقدارش 1 باشه  خروجی 1 و وقتی 0 باشه خروجی 0 خواهد بود.شکل سمبولیک فلیپ فلاپ Dخب تو این مقاله خواستم یه آشنایی کلی با فلیپ فلاپ ها داشته باشیم تو مقاله بعد درمورد پالس کلاک و تاثیرش روی انواع فلیپ فلاپ ها و همچنین دو نوع فلیپ فلاپ JK, T  صحبت خواهم کرد.</description>
                <category>محسن پورعینی</category>
                <author>محسن پورعینی</author>
                <pubDate>Wed, 08 Sep 2021 14:55:41 +0430</pubDate>
            </item>
                    <item>
                <title>شروع کار با Selenium در پایتون</title>
                <link>https://virgool.io/Whitenoise/%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-selenium-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-cyfkbikplm2w</link>
                <description>سال 99 برای بک اند وب سرویس های تیم MSYTC داشتم ربات های خزنده وب طراحی میکردم. سناریوی گرفتن اطلاعات نماد های بورس از www.tsetmc.com اولش بنظرم ساده بود تا اینکه به یسری مشکل اساسی برخوردم. وقتی داشتم از کتابخونه request و beautifulsoup برای ارسال درخواست و تجزیه template های هر صفحه میکردم با صفحات خالی مواجه میشدم ، دلیلش هم این بود که ریسپانسی که این سایت در لحظه اول از سرور میفرسته شامل اطلاعات نماد و قیمت و... اینا نیست و پس از رندر شدن صفحه بصورت ajax اطلاعات لود میشن ! خب من نمیخواستم timeout بزارم تا اطلاعات لود بشه چون زمان برامون خیلی مهم بود و حتی امکان پذیر هم نبود چون جاوا اسکریپت رو مرورگر میتونه اجرا میکنه و من فقط سورس رو دریافت میکردم. به همین دلیل تصمیم بر این شد با سلنیوم (selenium) این کار رو انجام بدیم. سلنیوم یه ابزار قدرتمندی هست برای اجرای صفحات وب و گرفتن اطلاعات از صفحات که با استفاده از وب درایور مرورگر هایی که خودش داره و تو خیلی از زبان ها ساپورت میشه امکان web scraping رو برامون خیلی راحت میکنه.  کتابخونه سلنیوم و وابستگی هاش باید نصب بشه که با دستور: pip install selenium  میتونیم این کارو به سادگی انجام بدیم.با این دستور تو پایتون webdriver رو ایمپورت میکنیم داخل ماژولمون:from selenium import webdriverدستور زیر از روی وب درایور مروگری که انتخاب میکنیم برامون یک نسخه وب درایو میسازه:وب درایور هر مروگر رو نسبت به ورژنی که انتخاب میکنین تو اینترنت میتونین پیدا کنین برای مثال لینک وب درایور های کرومdriver = webdriver.Chrome()درایور رو دانلود کنین و بزارین کنار ماژولی که ساختین ، اگه درایور تو مسیر دیگه ایی باشه میتونین به عنوان پارامتر به Chrome بدین:
driver = webdriver.Chrome(&amp;quot// path //&amp;quot)دستور get داخل درایور برامون یه نمونه از مروگر رو باز میکنه و میره به لینکی که به عنوان پارامتر بهش دادیم:driver.get(&amp;quothttp://www.python.org&amp;quot)تو این مرحله اگه لینک اشتباه باشه ارور میده .نکته دیگه ای که درمورد سلنیوم هست اینه که بالاتر هم اشاره کردم از روی وب درایوری که دانلود کردین  یه نمونه از مرورگر برامون باز میشه ، منظور اینه که همه ی کوکی ها و سشن ها و هیستوری هایی که رو مرورگر خودتون دارین روی وب درایور سلنیوم نیست و حتی اگه رو وب درایور هم لاگین کنین و دوباره وب درایور رو باز کنین دیگه کوکی های دردایور قبلی رو ندارین!برای مدیریت این کار باید کوکی هارو با استفاده از کتابخونه هایی مثل pickleسیو کنین و تو استارت بعدی ریلود کنین که تو مقاله هایی بعدی درموردش بیشتر صحبت میکنم.سلکتور های زیادی تو سلنیوم هست که من تو این مقاله قصد دارم به کاربردی ترین هاش اشاره کنماولین سلکتور پیدا کردن المنت با آی دی اون المنت هست که یه تابع داخل درایوری که ساختیم برای این کار هست:driver.find_element_by_id(&amp;quotid&amp;quot)برای فهم بهتر این رو مثل همون shadow do داخل جاوا اسکرپیت در نظر بگیرین که برامون نود های html  میداد (هرچند ربطی بهش نداره ولی برای درک بهتر گفتم)مشابه همون جاوا اسکریپت اکه یه متنی داخل این تگ باشه میتونیم با پروپرتی text بهش دسترسی داشته باشیم به این شکل:inner_text = driver.find_element_by_id(&amp;quotid&amp;quot).textسلکتور بعدی پیدا کردن المنت (ها) با اسم تگشون هست که به این شکل استفاده میشه:driver.find_element_by_name(&amp;quotp&amp;quot)این تابع اولین تگ p رو برامون انتخاب میکنه و اگه بخواییم لیستی از همه تگ های p رو بگیریم با این متد پیش میریم:driver.find_elements_by_name(&amp;quotp&amp;quot)یه سلکتور دیگه هم انتخاب کردن المنت (ها) با استفاده از نام کلاسشون هست که به همین ترتیب:driver.find_elements_by_class_name(&amp;quotclass&amp;quot)در کل تمام توابعی که بجای element نوشته باشه elements یه لیست از المنت های مچ شده رو بهمون میده که میتونیم روش حلقه بزنیم.خب تو این مثاله میخواستم یه دید کلی از سلنیوم و کلا فضای خزنده های وب بدم چون خیلی عمیقه و ریزه کاری زیاد دارهسلکتور مهم xpath موند که میخوام تو یه مقاله مفصل راجبش حرف بزنم.مطالعه بیشتر</description>
                <category>محسن پورعینی</category>
                <author>محسن پورعینی</author>
                <pubDate>Sun, 05 Sep 2021 18:45:24 +0430</pubDate>
            </item>
            </channel>
</rss>