در این مطلب می خواهیم در مورد ماژول urllib.request برای بازکردن صفحه وب صحبت کنیم. ماژول urllib.request در هر دو نسخه پایتون ۲ و ۳ قابل استفاده است. البته ماژول دیگری به نام request وجود دارد که کاربردی شبیه به urllib.request دارد. ولی در این دوره، urllib.request نیاز ما را برای انجام وب اسکرپینگ بر طرف می کند.

باز کردن صفحه وب با تابع ()open

همانطور که توضیح دادیم اولین گام در انجام وب اسکرپینگ، باز کردن صفحه ای است که می خواهیم به تگ های HTML آن دسترسی داشته باشیم. برای این کار می توانیم از تابع ()urlopen از ماژول urllib.request استفاده کنیم. فرمت کلی این تابع به صورت زیر است.

تابع ()urlopen تنها نیاز دارد که یک رشته به عنوان url را به آرگومان دوم آن ارسال کنیم و بقیه آرگومان ها اختیاری هستند. همچنین می توان شی از نوع کلاس Request را به عنوان آرگومان اول ارسال کنیم. در ضورتی که تابع با موفقیت اجرا شود، یک شی را برگشت می دهد که به متدهای زیر دسترسی خواهد داشت.

۱ – متد ()geturl نام url که به تابع ارسال کردیم را برگشت می دهد.

۲ – متد ()info اطلاعاتی در مورد وب سرور صفحه هدف را برگشت می دهد.

در واقع برای پروتکل های HTTP و HTTPS تابع ()urlopen شی از نوع کلاس http.client.HTTPResponse را بر می گرداند. البته توجه کنید که HTTP و HTTPS تنها دو مورد از پروتکل هایی هستند که اصطلاحا منابع وب (Web Resource) را در دسترس عموم قرار می دهند. همچنین توجه کنید منابع وب از طریق یک آدرس منحصر به فرد قابل دسترسی هستند. به طور مثال یک ویدیو در سایت آپارات یک منبع وب است که دارای یک آدرس منحصر به فرد است.

در کدهای بالا ابتدا ماژول urllib.request را به درون فایل برنامه ضمیمه کرده ایم. سپس یک متغیر به نام response از اجرای تابع ()urlopen ایجاد شده است. در خطوط بعدی متدهایی که شی response به آنها دسترسی دارد را استفاده کرده ایم.

توجه کنید پروتکل های HTTP و HTPPS مبتنی بر ارسال درخواست (request) از کلاینت به وب سرور و ارسال پاسخ (response) از وب سرور به کلاینت هستند. در واقع توسط تابع ()urlopen درخواستی را به وب سرور داده ایم مبنی بر محتوای یک صفحه و سپس وب سرور پاسخ را به کلاینت (در اینجا برنامه پایتون) ارسال کرده است که این پاسخ و جزییات آن درون شی به نام response ذخیره شده است.

دسترسی به محتوای سایت

همانطور که توضیح دادیم، هدف از بازکردن و خواندن یک سایت، دسترسی به محتوا و به عبارت دیگر دسترسی به تگ های HTML درون صفحه وب است. برای این کار باید از متد ()read استفاده کنیم. در واقع هر شی ایجاد شده توسط تابع ()openurl دارای متد ()read است که محتوای صفحه وب را در اختیار دارد.

در خروجی شکل بالا می توانید ببینید که توانستیم توسط متد ()read محتوای صفحه وب، یعنی تگ های سازنده صفحه وب را بدست آوریم که همان چیزی است که برای وب اسکرپینگ (Web Scraping) نیاز داریم. حال می خواهیم محتوای سایت را درون یک فایل با پسوند html ذخیره کنیم. شکل زیر این مورد را به شما نشان می دهد.

python_web_scraping_first_step_urllib_request_and_response.ipynb

بنابراین می توانیم از طریق ()response.read به محتوا و تگ های درون صفحه وب برای استفاده در ماژول bs4 (یا beautifulSoup) دسترسی داشته باشیم. در مطلب های بعدی نشان داده ایم که ()response.read را به تابع سازنده کلاس BeautifulSoup می فرستیم تا از آن پس بتوانیم از طریق ویژگی های ماژول bs4 به آنها دسترسی داشته باشیم.