تا به اینجا با کتابخانه های urllib.request و bs4 برای وب اسکرپینگ و استخراج داده های وب در پایتون آشنا شده اید. در این مطلب می خواهیم ماژول دیگری به نام Mechanize را به منظور فرستادن داده به فرم های اچ تی ام ال و سپس دریافت پاسخ و نمایش آن آموزش دهیم. ماژول Mechanize داری ویژگی های بسیاری برای پیمایش و مرور کردن (Browsing) در اینترنت است. در این مطلب و با کمک کتابخانه Mechanize می خواهیم اطلاعاتی در مورد آدرس IP دلخواه بدست آوریم. برای این منظور آدرس IP باید به فرم سایت https://www.iplocation.net بفرستیم. برای نصب آن در محیط مجازی پایتون دستور زیر را اجرا کنید.

در شکل زیر که صفحه خانگی سایت را نشان می دهد، دو فرم اچ تی ام ال وجود دارند ولی ما تنها یکی از آن دو فرم را می خواهیم که مطابق شکل زیر مقدار خصوصیت name آن فرم lookup است. همچنین می بینید که خود فرم دارای دو تگ input از نوع text و submit است. در ادامه از مقدار خصوصیت name این دو تگ برای فرستادن داده به فرم استفاده می کنیم.

در کنار آموزش ماژول Mechanize می خواهیم ماژول دیگری به نام ipaddress را آموزش دهیم که بوسیله آن می توانیم بررسی کنیم که آیا یک ip در رسته ip های عمومی (Public) است یا در رسته ip های خصوصی (Private). شاید لازم باشید تنها آدرس های عمومی که بر روی اینترنت قابل استفاده هستند را به فرم اچ تی ام ال بفرستیم. برای نصب ماژول ipaddress دستور زیر را اجرا کنید.

در کد شکل زیر نخست تمامی ماژول های لازم به درون برنامه ضمیمه می شوند. همانطور که می بینید کلاس Browser از ماژول Mechanize به همراه کلاس BeatifulSoup از bs4 ضمیمه شده اند. دو متغیر به نام های url و ip به ترتیب آدرس سایت https://www.iplocation.net و آدرس ip دلخواه ما برای فرستادن به فرم اچ تی ام ال را در خود نگه می دارند. سپس بوسیله ()ip_address از ماژول یک متغیر به نام ip_object ایجاد می کنیم.

ورودی ()ip_address همان متغیر ip است که آدرس ip دلخواه ما را نگه می دارد. در ادامه برای بررسی خصوصی یا عمومی بودن آدرس، در شرط if از خصوصیت is_private استفاده شده تا بررسی کنیم که آیا آدزس ip خصوصی است یا نه؟ اگر خصوصی باشد، پس مقدار True برگشت داده می شود و چون عملگر not پیش از آن آمده است، پس شرط if نقض شده و پیغام درون else نشان داده می شود. اگر مقدار Flase برگشت داده شود، پس آدرس عمومی است و چون پیش از آن عملگر not آمده به True تبدیل شده و شرط if برقرار و درگام نخست یک شی از کلاس Browser ایجاد می شود.

پس از ایجاد یک نمونه از کلاس Browser به نام br متد ()set_handle_robots را با مقدار False فراخوانی می کنیم تا از روبات ها صرف نظر شود. سپس توسط متد ()open آدرس درون متغیر url باز می شود. حال در اینجا به محتوای صفحه که شامل فرم اچ تی ام است دسترسی داریم. برای انتخاب فرم مورد نظرمان باید متد ()select_form را با پارامتر name فراخوانی کنیم. توجه کنید که پارامتر name در این مطلب برابر با lookup است زیرا مقدار خصوصیت name تگ form برابر با lookup است.

سپس و به صورت اندیس گذاری دیشکنری، کلید query را مقدار دهی می کنیم. در این مطلب کلید query همنام با مقدار خصوصیت تگ input از نوع text در شکل نخست مطلب است. همچنین می بینید که مقدار انتسابی به کلید query همان آدرس ip دلخواه ما است. سپس برای واگذاری داده به فرم باید متد ()submit را همراه با پارامتر name فراخوانی کنیم. در این مورد نیز مقدار پارامتر name همنام خصوصیت name در تگ input از نوع submit در این مطلب است. خروجی متد ()submit درون متغیر result ذخیره می شود که در پایان و برای دسترسی به محتوای تازه پس از واگذاری فرم، مجدد باید متد ()read فراخوانی شده تا متغیر تازه ای به نام content ایجاد شد. در سایت https://www.iplocation.net/ پس از واگذاری فرم، محتوای سایت همانند شکل زیر است.

در شکل بالا چندین جدول به عنوان پاسخ هایی در مورد آدرس ip برگشت داده می شوند ولی ما تنها جدول نخست را لازم داریم. بنابراین باید از ماژول bs4 برای دسترسی به جدول با class=table_dark_gree استفاده کنیم. شکل زیر محتوای متغیر content را نشان می دهد که شامل محتوای پس از دریافت پاسخ از فرم اچ تی ام ال است. در گام های پیش رو محتوای این متغیر توسط bs4 خوانده و پردازش می شود.

در شکل زیر نخست یک نمونه از کلاس BeautfulSoup ایجاد می کنیم و سپس بوسیله متد ()find به دنبال تگ table با کلاس class=table_dark_green می گردیم. در خروجی ما تنها به دنبال نام کشور، استان و شهر مربوط به موقیعیت آدرس ip هستیم. پس در خروجی متد ()find به دنبال نخستین تگ tbody (مطابق شکل زیر) خواهیم بود. خروجی متد ()find در شکل زیر در متغیر table_ip_info ذخیره می شود.

در شکل زیر نخست بوسیله متد ()find و بوسیله متغیر table_ip_info، به نخستین تگ tbody دسترسی پیدا می کنیم. سپس یک بست به نام ip_info ایجاد و درون یک حلقه for و تا زمانی که تگ td درون تگ tbody وجود داشته باشد، متن تمامی تگ های td به درون لیست ip_info الحاق می شود. در پایان لیست دارای آدرس ip، نام کشور، نام استان و نام شهر خواهد بود.

دانلود سورس کد این مطلب Mechanize Python