وب اسکرپینگ چیست ؟ به مراحل جمعآوری دادههای خام یا داده کاوی از وب به صورت خورکار ، وب اسکرپینگ چیست ؟ گفته می شود . Python ابزارهای بسیار قدرتمندی رو برای جمع آوری اطلاعات از وب ارائه کرده است. اینترنت بزرگترین منبع اطلاعات روی کره زمین رو میزبانی میکنه. بسیاری از رشته ها، مانند علم داده، هوش تجاری، و گزارش تحقیقی، می توانند از جمع آوری و تجزیه و تحلیل داده ها از وب سایت ها سود فراوانی ببرند.
وب اسکرپینگ چیست ؟
گرد آوری دادهها از وبسایتها با استفاده از یک فرآیند خودکار به عنوان وب اسکرپینگ شناخته میشود. برخی از وب سایت ها به آسانی کاربران رو از بیرون کشیدن داده های خودشون با ابزارهای خودکار منع می کنند.
این سایت ها دلیل خوبی برای محافظت از داده های خودشون دارند. به عنوان مثال، Google Maps به شما اجازه نمی دهد. که نتایج و اطلاعات خیلی زیادی رو خیلی سریع درخواست کنید. درخواستهای مکرر زیاد به سرور یک وب سایت ممکنه پهنای باند رو مصرف کنه، سرعت وبسایت رو برای سایر کاربران کند کنه. و احتمالاً سرور رو بیش از حد مجاز بارگذاری کنه. به طوری که وبسایت به طور کامل پاسخ ندهد.
مهم: قبل از استفاده از مهارتهای پایتون برای وب اسکرپینگ، همیشه باید خطمشی و قوانین وبسایت مورد نظر خود را بررسی کنید. تا ببینید آیا دسترسی به وبسایت با ابزارهای خودکار نقض شرایط استفاده از آن است یا خیر. از نظر قانونی، خراش دادن وب بر خلاف میل یک وب سایت، کاملا ممنوع و غیر مجاز است .
یک کتابخانه ی مفید برای اسکرپینگ وب که می تونید توی پایتون پیدا کنید، urllib است. که حاوی ابزارهایی برای کار با URL هاست. به طور خاص، ماژول urllib.request حاوی تابعی به نام ()urlopen است. که می تواند برای باز کردن URL در یک برنامه استفاده شود.
برای مثال در پنجره تعاملی IDLE، بنویسید :
>>> from urllib.request import urlopen
سپس یک صفحه وب (url) باز خواهیم کرد :
>>> url = ” آدرس مورد نظر شما “
برای باز کردن صفحه وب، url را به urlopen() میدیم:
>>> page = urlopen(url)
برای استخراج HTML از صفحه، ابتدا از روش HTTP Response .read() استفاده کنید. که دنباله ای از بایت ها را برمی گرداند.
سپس از decode() برای رمزگشایی بایت ها به یک رشته با استفاده از UTF-8 استفاده کنید:
>>> html_bytes=page.read()
>>> html=html_bytes.decode("utf-8")
اکنون می توانید HTML را برای مشاهده محتویات صفحه وب چاپ کنید:
>>> print(html)
Name: Aphrodite write animal: Dove Favorite color: Red
هنگامی که متن HTML رو داشته باشید، می تونید اطلاعات رو به چند روش مختلف از اون استخراج کنید.
استخراج متن از HTML با روش های رشته ای
یکی از راه های استخراج اطلاعات از HTML صفحه وب ، استفاده از روش های رشته ای است. به عنوان مثال شما می تونید از .find() برای جستجو در متن HTML برای تگ های مورد نظر و استخراج اون ها استفاده کنید.
بیایید عنوان صفحه وب را که در مثال قبلی درخواست کردید استخراج کنیم. اگر نمایه اولین کاراکتر عنوان و اولین کاراکتر تگ بسته شدن </title> را می دانید می توانید از یک قطعه رشته برای استخراج عنوان استفاده کنید.
از آنجایی که find() ایندکس اولین رخداد یک زیررشته را برمی گرداند، می توانید با ارسال رشته “<title>” به find() ایندکس تگ <title> را دریافت کنید.
>>> title_index=html.find("<title>")
hello world!
از یک تجزیه کننده HTML برای وب اسکریپینگ در پایتون استفاده کنید
گاهی اوقات استفاده از تجزیه کننده HTML که به صراحت برای تجزیه صفحات HTML طراحی شده است آسان تر است. ابزارهای پایتون زیادی برای این منظور نوشته شده است. اما کتابخانه Beautiful Soup ابزار خوبی برای شروع است.
Beautiful soap را نصب کنید
برای نصب Beautiful Soup می تونید دستورات زیر رو در ترمینال ویندوز وارد کنید:
$ python3 -m pip install beautifulsoup4
یک آبجکت BeautifulSoup ایجاد کنید
دستورات زیر را در یک پنجره ویرایشگر جدید تایپ کنید:
url="آدرس مورد نظر" page=urlopen(url) html=page.read().decode("utf-8") soup=BeautifulSoup(html,"html.parser")
این برنامه سه کار را انجام می دهد:
URL را با استفاده از urlopen() از ماژول urllib.request باز می کند.
HTML را از صفحه به عنوان یک رشته می خواند و آن را به متغیر html اختصاص می دهد.
یک شی BeautifulSoup ایجاد می کند و آن را به متغیر soup اختصاص می دهد.
شی BeautifulSoup اختصاص داده شده به سوپ با دو آرگومان ایجاد می شود. آرگومان اول HTML است که باید تجزیه شود و آرگومان دوم، رشته “html.parser” به شی می گوید که از کدام تجزیه کننده در پشت صحنه استفاده کند. “html.parser” نشان دهنده تجزیه کننده HTML داخلی پایتون است.
از آبجکت BeautifulSoup استفاده کنید
برنامه فوق را ذخیره و اجرا کنید. هنگامی که اجرای آن به پایان رسید، می توانید از متغیر SOAP در پنجره تعاملی برای تجزیه محتوای html به روش های مختلف استفاده کنید.
به عنوان مثال، BeautifulSoup دارای یک متد get_text() است که می تواند برای استخراج تمام متن از سند و حذف خودکار هر تگ HTML استفاده شود.
کد زیر را در پنجره تعاملی IDLE تایپ کنید:
>>> print(soup.get_text())
اغلب، شما نیاز دارید که فقط متن خاصی را از یک سند HTML دریافت کنید. استفاده از Beautiful Soup ابتدا برای استخراج متن و سپس استفاده از متد find() گاهی آسان تر از کار با عبارات منظم است.
با این حال، گاهی اوقات خود تگ های HTML عناصری هستند که به داده هایی که می خواهید بازیابی کنید اشاره می کنند. به عنوان مثال، شاید بخواهید URLهای تمام تصاویر موجود در صفحه را بازیابی کنید. این پیوندها در ویژگی src تگ های HTML موجود هستند.
در این مورد، می توانید از find_all() برای بازگرداندن لیستی از تمام نمونه های آن تگ خاص استفاده کنید.
>>> soup.find_all("img")
این فهرستی از تمام تگهای <img> در سند HTML را برمیگرداند. اشیاء موجود در لیست به نظر میرسد که ممکن است رشتههایی باشند که برچسبها را نشان میدهند، اما در واقع نمونههایی از شی Tag هستند. که توسط Beautiful Soup ارائه شده است.
تعامل با فرم های HTML
ماژول urllib که تاکنون در این آموزش با آن کار کرده اید. برای درخواست محتوای یک صفحه وب مناسب است. با این حال، گاهی اوقات شما نیاز به تعامل با یک صفحه وب برای به دست آوردن محتوای مورد نیاز خود دارید. به عنوان مثال، ممکن است لازم باشد یک فرم ارسال کنید. یا روی دکمه ای کلیک کنید. تا محتوای پنهان نمایش داده شود.
کتابخانه استاندارد پایتون ابزار داخلی برای کار با صفحات وب به صورت تعاملی ارائه نمی دهد. اما بسیاری از بسته های شخص ثالث از PyPI در دسترس هستند. در این میان، MechanicalSoup یک بسته محبوب و نسبتا ساده برای استفاده است.
در اصل، MechanicalSoup چیزی که به عنوان یک مرورگر بدون سر شناخته می شود، را نصب می کند، که یک مرورگر وب بدون رابط کاربری گرافیکی است. این مرورگر به صورت برنامه نویسی از طریق برنامه پایتون کنترل می شود.
MechanicalSoup را نصب کنید.
می توانید MechanicalSoup را با pip در ترمینال خود نصب کنید:
$ python3 -m pip install MechanicalSoup
یک شی مرورگر ایجاد کنید.
موارد زیر را در پنجره تعاملی IDLE تایپ کنید:
>>> importmechanicalsoup
>>> browser=mechanicalsoup.Browser()
اشیاء مرورگر نشان دهنده مرورگر وب بدون سر هستند. میتوانید از آنها برای درخواست یک صفحه از اینترنت با ارسال یک URL به متد ()get آنها استفاده کنید:
>>> url="http://آدرس مورد نظر/login"
>>> page=browser.get(url)
page یک شی Response است که پاسخ درخواست URL از مرورگر را ذخیره می کند:
>> page
<Response [200]>
عدد 200 نشان دهنده کد وضعیت است. که توسط درخواست بازگردانده شده است. کد وضعیت 200 به معنای موفقیت آمیز بودن درخواست است. یک درخواست ناموفق ممکن است کد وضعیت 404 را در صورت عدم وجود URL یا 500 را در صورت وجود خطا در سرور هنگام درخواست نشان دهد.
شما می توانید HTML را با بررسی ویژگی soup مشاهده کنید:
صفحه ورود به سیستم / را از مثال قبلی در مرورگر باز کنید و قبل از حرکت به آن نگاه کنید. سعی کنید نام کاربری و رمز عبور تصادفی را تایپ کنید. اگر اشتباه حدس زدید، پیام «نام کاربری یا رمز عبور اشتباه است!» در پایین صفحه نمایش داده می شود.
با این حال، اگر اعتبار ورود صحیح را ارائه دهید، به صفحه پروفایل / هدایت می شوید. در مثال بعدی، نحوه استفاده از MechanicalSoup را برای پر کردن و ارسال این فرم با استفاده از پایتون خواهید دید!
بخش مهم کد HTML فرم ورود به سیستم است . یعنی همه چیزهایی که داخل تگ های <form> هستند. <form> در این صفحه دارای ویژگی نام است که برای ورود به سیستم تنظیم شده است. این فرم شامل دو عنصر <input> است، یکی با نام user و دیگری با نام pwd. سومین عنصر <ورودی> دکمه ارسال است.
اکنون که ساختار اساسی فرم ورود و همچنین اعتبار مورد نیاز برای ورود به سیستم را میدانید، اجازه دهید نگاهی به یک برنامه بیندازیم. که فرم را پر کرده و ارسال می کند.
توجه: هکرها میتوانند از برنامههای خودکار مانند آنچه در بالا استفاده شد، با آزمایش سریع نامهای کاربری و گذرواژههای مختلف تا زمانی که ترکیبی کارآمد را پیدا کنند، ورود به سیستم اجباری را انجام دهند.
علاوه بر این که این بسیار غیرقانونی است. تقریباً همه وبسایتها این روزها شما را بن میکنند. و در صورت مشاهده درخواستهای ناموفق بیش از حد، آدرس IP شما را گزارش میدهند. بنابراین آن را امتحان نکنید!
نتیجه
اگرچه امکان تجزیه دادهها از وب با استفاده از ابزارهای موجود در کتابخانه استاندارد پایتون وجود دارد، ابزارهای زیادی در PyPI وجود دارد که میتواند به سادهسازی فرآیند کمک کند.
در این آموزش شما یاد گرفتید که چگونه:
درخواست یک صفحه وب با استفاده از ماژول urllib داخلی پایتون ارسال کنید.
HTML را با استفاده از Beautiful Soup تجزیه کنید.
با استفاده از MechanicalSoup با فرم های وب تعامل داشته باشید.
برای بررسی بهروزرسانیها، مکرراً از یک وبسایت داده درخواست کنید.
نوشتن برنامههای وب اسکریپینگ سرگرمکننده است. و اینترنت هیچ کمبودی در محتوا ندارد. که این مسئله میتواند منجر به انواع پروژههای هیجانانگیز شود. فقط به یاد داشته باشید، همه نمی خواهند که شما داده ها را از سرورهای وب آن ها بیرون بکشید. همیشه قبل از شروع وب اسکریپینگ ، شرایط استفاده از وب سایت را بررسی کنید. و به نحوه زمان بندی درخواست های وب احترام بگذارید تا سرور را پر از ترافیک نکنید.