داده‌های موجود در وب یکی از مهم‌ترین منابع به منظور انجام تحلیل‌های داده (Data Analysis) و داده‌کاوی (Data Mining) هستند. چنین تحلیل‌هایی با اهداف گوناگون انجام می‌شوند که از جمله آن‌ها می‌توان به عقیده‌کاوی و تحلیل احساسات اشاره کرد. مساله شایان توجه در این تحلیل‌ها گردآوری داده‌های موجود در وب است که با عنوان «وب اسکرپینگ» (Web Scraping) شناخته شده و امکان انجام آن با بهره‌گیری از ابزارها و زبان‌های برنامه‌نویسی گوناگون وجود دارد. از جمله زبان‌های برنامه‌نویسی قابل استفاده برای وب اسکرپینگ، زبان قدرتمند پایتون است که با استفاده از کتابخانه Beautiful Soup این کار را انجام می‌دهد. در این راهنما به چگونگی انجام وب اسکرپینگ با استفاده از پایتون و کتابخانه Beautiful Soup پرداخته و مباحث زیر مورد بررسی قرار می‌گیرند:

  • وب اسکرپینگ (Web Scraping) چیست؟
  • چرا نیاز به وب اسکرپینگ است؟
  • چگونه می‌توان با استفاده از زبان برنامه‌نویسی پایتون و کتابخانه Beautiful Soup وب اسکرپینگ انجام داد؟

مقدمه

هنگام انجام یک پروژه علم داده، استفاده از داده‌های موجود در اینترنت امری بسیار متداول است. افراد اغلب قادر به دسترسی به این داده‌ها در فرمت CSV یا با استفاده از رابط برنامه‌نویسی کاربردی (Application Programming Interface | API) هستند. اگرچه، اوقاتی نیز وجود دارد که داده مورد نیاز تحلیلگر صرفا به عنوان بخشی از یک صفحه وب در دسترس است. در شرایطی مانند این‌ها، تحلیلگر می‌تواند از روشی با عنوان «وب اسکرپینگ» (web scraping) به منظور دریافت داده‌ها از صفحه وب به فرمتی که در تحلیل‌های خود با آن‌ها کار می‌کند بهره ببرد. در این مطلب، چگونگی انجام این کار با بهره‌گیری از پایتون 3 (Python3) و کتابخانه Beautiful Soup آموزش داده شده است.

وب اسکرپینگ با پایتون

در ادامه و پیش از آنکه به موضوع اصلی پرداخته شود، برخی از مولفه‌های اساسی یک صفحه وب تشریح می‌شوند. هنگام بازدید از یک وب‌سایت یا یک صفحه وب، «مرورگر وب» (web browser) درخواست دریافت اطلاعات را به «وب سرور» (Web Server) می‌دهد. به این درخواست «GET request» گفته می‌شود، زیرا مرورگر فایل‌ها را از سرور دریافت می‌کند. سسپس، سرور فایل‌هایی را ارسال می‌کند که به مرورگر وب می‌گویند چگونه یک صفحه وب را برای کاربر رِندِر (render) کند. فایل‌های یک صفحه وب شامل انواع فایل‌های بیان شده در زیر هستند.

  • HTML: دربرگیرنده محتوای اصلی صفحه است.
  • CSS: به منظور بهبود ظاهر صفحه هنگام ارائه به کاربر، استایلی را به صفحه وب می‌افزاید.
  • JS: فایل‌های جاوا اسکریپت، تعامل‌پذیری را به صفحات وب می‌افزایند.
  • تصاویر: تصاویر در فرمت‌های گوناگون شامل JPG و PNG به یک صفحه وب این امکان را می‌دهند که به ارائه تصاویر بپردازد.

پس از آنکه مرورگر همه فایل‌ها را دریافت کرد، صفحه وب را رندر کرده و آن را به کاربر نمایش می‌دهد. اتفاقات زیادی در پشت صفحه می‌افتد تا یک صفحه وب به خوبی رندر شود، اما هنگام انجام وب اسکرپینگ نیازی به آگاهی از همه این وقایع نیست. در حین انجام وب اسکرپینگ، پژوهشگر به محتوای اصلی صفحه وب نیاز دارد، بنابراین در ادامه به HTML که در بردارنده محتوای اصلی صفحه وب است پرداخته می‌شود.

HTML

HTML سرنامی برای عبارت «Hyper Text Markup Language» یا «زبان نشانه‌گذاری ابرمتنی» است. برخی از نکات پیرامون HTML عبارتند از:

  • HTML ساختار یک صفحه وب را با استفاده از نشانه‌گذاری‌ها توصیف می‌کند.
  • مولفه‌های HTML بلوک‌های یک صفحه HTML را می‌سازند.
  • مولفه‌های HTML با استفاده از تگ‌ها نمایش داده می‌شوند.
  • تگ‌های HTML بخشی از محتوا مانند «سرآیند» (heading | هِدِر)، «پاراگراف»، «جدول» و دیگر موارد را برچسب‌زنی می‌کنند.
  • مرورگرها تگ‌های HTML را نمایش نمی‌دهند، بلکه از آن‌ها برای رندر کردن محتوای یک صفحه استفاده می‌کنند.

یک سند HTML ساده

شرح مثال

  • اعلان <!DOCTYPE html> مشخص می‌کند که سند پیش رو HTML5 است.
  • عنصر <html>، مولفه ریشه‌ای یک صفحه HTML است.
  • عنصر <head> شامل اطلاعات متا (meta information) پیرامون سند است.
  • عنصر <title>، عنوان سند را تعیین می کند.
  • عنصر <h1> یک سرآیند (heading) بزرگ را تعریف می‌کند.
  • عنصر <p> یک پاراگراف را تعیین می‌کند.

وب اسکرپینگ چیست؟

وب اسکرپینگ، وب هاروستینگ (هرس کردن وب | web harvesting) یا «استخراج داده‌های وب» (web data extraction) نوعی «دیتا اسکرپینگ» (data scraping) است که برای استخراج داده‌ها از وب‌سایت‌ها مورد استفاده قرار می‌گیرد. نرم‌افزارهای وب اسکرپینگ ممکن است به داده‌های «وب جهان گستر» (World Wide Web) با استفاده از «پروتکل انتقال ابرمتن» (Hypertext Transfer Protocol) به طور مستقیم یا از طریق یک مرورگر وب دسترسی داشته باشند.

با وجود آنکه وب اسکرپینگ می‌تواند به صورت دستی توسط کاربر نرم‌افزار انجام شود، این عبارت معمولا به فرآیند خودکاری مربوط می‌شود که با استفاده از یک «بات» (bot) یا «خزنده وب» انجام می‌شود. این کار در واقع نوعی از کپی کردن است که در آن داده‌های مشخصی از وب گردآوری و کپی می‌شوند. این داده‌ها به منظور انجام بازیابی یا تحلیل‌های آتی، به طور معمول در یک پایگاه‌داده محلی مرکزی یا «صفحه گسترده» (Spreadsheet) کپی می‌شوند.

وب اسکرپینگ

چرا تحلیلگران به وب اسکرپینگ نیاز دارند؟

یک سازمان بزرگ نیاز دارد تا خود را با تغییرات اطلاعاتی که در تعداد زیادی از وب‌سایت‌ها به وقوع می‌پیوندد به روز نگه دارد. یک وب اسکرپر هوشمند (intelligent web scraper) وب‌سایت‌های جدیدی که باید داده‌ها را از آن‌ها اسکرپ کند می‌یابد. رویکردهای هوشمند، داده‌های تغییر یافته را تعیین کرده و آن‌ها را بدون بیرون آوردن لینک‌های غیر لازم موجود در محتوا، استخراج کرده و به منظور نظارت و استخراج اطلاعات زمان واقعی به طور موثر و کارآمدی در صفحه وب خزش می‌کنند. پژوهشگر می‌تواند به سادگی بر چندین وب‌سایت به طور همزمان نظارت کند، در حالیکه با فرکانس تکرارها نیز به روز است.

وب اسکرپینگ و تحلیل داده

تحلیلگر می‌تواند شاهد تغییرات دائما در حال وقوع در وب باشد. اما اگر تغییرات کلیدی توسط یک سازمان به وقوع پیوست، چگونه می‌توان متوجه آن‌ها شد؟ فرض می‌شود که تغییری در کارکنان یک سازمان به وقوع پیوسته، چگونه می‌توان از آن مطلع شد؟ پاسخگویی به این پرسش‌ها همان نقطه‌ای است که وب اسکرپینگ و ویژگی‌های آن برجسته می‌شوند. روش‌های وب اسکرپینگ هوشمند کاربران را از آخرین تغییرات به وقوع پیوسته در یک وب‌سایت مشخص آگاه و بنابراین به آن‌ها در تحت نظر داشتن چالش‌ها و فرصت‌ها کمک می‌کنند.

وب اسکرپینگ با استفاده از پایتون و Beautiful Soup

در ابتدا، کار با یک صفحه وب دارای HTML خیلی پایه‌ای آغاز می‌شود. سپس، چگونگی انجام وب اسکرپینگ روی صفحات وب جهان واقعی نشان داده خواهد شد. اولین چیزی که برای اسکرپ کردن در یک صفحه وب مورد نیاز است، دانلود کردن آن صفحه است. می‌توان این کار را با استفاده از کتابخانه پایتون Requests (+) انجام داد.

کتابخانه Requests یک درخواست Get به وب سرور ارسال می‌کند که محتوای HTML صفحه وب مورد نظر را برای کاربر دانلود می‌کند. انواع گوناگونی از درخواست‌ها وجود دارد که می توان با استفاده از کتابخانه Requests انجام داد و GET تنها یکی از آن‌ها است. اکنون تلاش می‌شود تا یک صفحه وب‌سایت ساده از این آدرس با روش بیان شده دانلود شود. ابتدا، این صفحه با متد requests.get دانلود می‌شود.

متد GET در کتابخانه Requests پایتون

پس از اجرای درخواست، شی Response (+) دریافت می‌شود. این شی دارای ویژگی status_code است که در صورت دانلود موفقیت‌آمیز یک صفحه وب، این مساله را به کاربر اطلاع می‌دهد. می‌توان محتوای HTML یک صفحه را با استفاده از ویژگی content پرینت کرد.

متد GET در کتابخانه Requests پایتون

Beautiful Soup

می‌توان از کتابخانه Beautiful Soup برای «تجزیه کردن» (parse) این سند و استخراج متن از تگ P استفاده کرد. در این راستا، ابتدا باید کتابخانه مذکور را ایمپورت کرد و یک نمونه از کلاس Beautiful Soup را برای تجزیه سند مورد نظر ساخت.

کتابخانه BeautifulSoup در پایتون برای تجزیه سند

اکنون می‌توان محتوای HTML را که با استفاده از متد prettify در شی BeautifulSoup به خوبی قالب‌بندی شده از صفحه پرینت کرد.

کتابخانه BeautifulSoup در پایتون برای Parse اسناد

از آنجا که همه تگ‌ها تو در تو هستند، می‌توان هر بار یک سطح از طریق ساختار حرکت کرد. ابتدا همه عناصر در سطح بالای صفحه با استفاده از ویژگی children از soup انتخاب می‌شوند. توجه به این نکته لازم است که children یک «تولیدکننده لیست» (list generator) باز می‌گرداند، بنابراین نیاز به فراخوانی تابع list در آن است.

کتابخانه BeautifulSoup در پایتون

کتابخانه BeautifulSoup در پایتون

همانطور که در بالا مشهود است، دو تگ head و body در اینجا وجود دارند. هدف آن است که متن موجود در تگ p استخراج شود، بنابراین باید مستقیما به سراغ body رفت (مراجعه به بالا، زیر html.children). اکنون می‌توان تگ p را با یافتن children تگ body دریافت کرد.

کتابخانه BeautifulSoup در پایتون

می‌توان از متد get_text برای استخراج همه متن درون تگ استفاده کرد.

یافتن همه نمونه‌های یک تگ به صورت یکباره

آنچه در بالا انجام شد برای درک اینکه چگونه باید در یک صفحه وب حرکت کرد مفید بود، اما از دستورات زیادی برای انجام یک کار نسبتا ساده استفاده شد. این در حالی است که اگر هدف استخراج یک تگ تنها باشد، می‌توان از متد find_all استفاده کرد که همه نمونه‌های یک تگ را در یک صفحه پیدا می‌کند. اگر تمایل بر این باشد که اولین نمونه از تگ یافت شود، می‌توان از متد find استفاده کرد که یک شی Beautiful Soup تنها را باز می‌گرداند.

متد find در کتابخانه BeautifulSoup پایتون

برای فورک کردن این نوت‌بوک باید به راهنمای وب اسکرپینگ (+) مراجعه کرد.

اکنون، چگونگی انجام وب اسکرپینگ با استفاده از پایتون 3 و کتابخانه Beautiful Soup تشریح خواهد شد. در برررسی موردی که به عنوان مثال ارائه خواهد شد، داده‌های مربوط به پیش‌بینی‌های آب و هوا در «National Weather Service» اسکرپ خواهد شد و سپس داده‌های حاصل با استفاده از کتابخانه Pandas تحلیل می‌شوند. برای مطالعه بیشتر پیرامون چگونگی تحلیل داده در پایتون، مطالعه مطلب «یادگیری علم داده (Data Science) با پایتون — از صفر تا صد» توصیه می‌شود.

داده‌های پیش‌بینی آب و هوا

اکنون که مقدمات لازم برای وب اسکرپینگ تشریح شد، کار استخراج اطلاعات پیرامون آب‌و‌هوای محلی از «National Weather Service website» انجام خواهد شد. اولین گام یافتن صفحه‌ای است که باید اسکرپ شود. در اینجا به عنوان مثال اطلاعات آب‌و‌هوا از «ناحیه مرکزی سان‌فرانسیسکو» (downtown San Francisco) از این صفحه اسکرپ خواهد شد.

داده‌های پیش‌بینی آب‌و‌هوا

پس از باز کردن این صفحه، باید از کلیدهای ترکیبی CRTL+SHIFT+I برای بازرسی عناصر (inspect the element) استفاده شود، البته در این صفحه آنچه حائز اهمیت محسوب می‌شود ستون «San Francisco CA» است. بنابراین، با کلیک راست کردن روی صفحه نزدیک جایی که عبارت «Extended Forecast» نوشته شده، و سپس کلیک روی «Inspect»، باید تگی که شامل متن «Extended Forecast» در پنل عناصر است را باز کرد.

بررسی عناصر صفحه وب

سپس، می‌توان در پنل عناصر جا‌به‌جا شد تا عنصر «outermost» را که شامل همه متن‌هایی است که مربوط به پیش‌بینی‌های آب و هوا هستند پیدا کرد. در این مورد، یک تگ div با شناسه seven-day-forecast وجود دارد. با کاوش در div، می‌توان هر آیتم پیش‌بینی را پیدا کرد (برای مثال «Thursday» ،«Tonight» و «Thursday Night») که با کلاس tombstone-container در div وجود دارند. اکنون، به اندازه کافی اطلاعات برای دانلود صفحه وب و آغاز تجزیه آن وجود دارد. در کدی که در ادامه آمده، کارهای زیر انجام می‌شود:

  • صفحه وب که شامل پیش‌بینی‌ها است دانلود می‌شود.
  • کلاس Beautiful Soup برای تجزیه صفحه وب ساخته می‌شود.
  • div با شناسه seven-day-forecast یافت شده و به seven_day تخصیص پیدا می‌کند.
  • درون seven_day، هر آیتم پیش‌بینی مجزا یافت می‌شود.
  • اولین آیتم پیش‌بینی استخراج و چاپ می‌شود.

اسکرپ کردن داده‌های پیش‌بینی آب‌و‌هوا

استخراج کردن و پرینت اولین آیتم پیش‌بینی

استخراج داده‌های وب در پایتون

همانطور که از خروجی کد به نظر می‌رسد، آیتم پیش‌بینی tonight دربرگیرنده کلیه اطلاعاتی محسوب می‌شود که در اینجا مورد نیاز است. 4 تکه از اطلاعات را می‌توان استخراج کرد:

  • نام آیتم پیش‌بینی که در این مورد Today است.
  • توصیف شرایط که در ویژگی title از img ذخیره شده است.
  • یک توصیف کوتاهه از شرایط که در این مورد Sunny است.
  • دمای پایین که در این مورد °69 فارنهایت (°69 F) است.

استخراج داده‌های وب با استفاده از پایتون

اکنون که چگونگی استخراج هر بخش مجزا از اطلاعات مشخص شد، می‌توان دانش موجود را با انتخاب‌گرهای CSS نیز ترکیب کرد و «خلاصه لیست» (list comprehensions) را برای استخراج همه چیز به صورت یکباره، مورد استفاده قرار داد. در کد زیر همه آیتم‌های با کلاس period-name درون یک آیتم با کلاس tombstone-container در seven_day انتخاب می‌شوند. از «خلاصه لیست» (list comprehension) برای فراخوانی متد get_text در هر شی Beautiful Soup استفاده می‌شود.

خلاصه لیست در پایتون

ترکیب کردن داده‌ها در دیتافریم Pandas

کتابخانه Pandas پایتون برای تحلیل داده

می‌توان از عبارت باقاعده و متد Series.str.extract برای کشیدن مقادیر دمای عددی استفاده کرد.

سری‌ها در پایتون

سری‌ها در پایتون

برای فورک کردن این نوت بوک باید به صفحه وب اسکرپینگ (+) و گیت‌هاب (+) مراجعه کرد. امید می‌رود که با بهره‌گیری از این مطلب، شناخت خوبی از چگونگی اسکرپ کردن داده‌ها از صفحات وب برای علاقمندان حاصل شده باشد.

اگر مطلب بالا برای شما مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شود:

^^

آیا این مطلب برای شما مفید بود؟

3 نظر در “وب اسکرپینگ (Web Scraping) با پایتون و کتابخانه Beautiful Soup — راهنمای جامع

  1. مقاله خوبی بود اما مشکل جدی کیفیت پایین عکس ها بود که باید عکس ها قابلیت بزرگ نمایی داشته باشند تا بتوان جزئیات کد استفاده شده رو مشاهده کرد

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *