برنامه نویسی

دریافت داده از WhoScored: پروژه خراش دادن وب با سلنیوم

چند وقت پیش، پستی در dev.to در مورد Web Scraping با Python، BeautifulSoup و Requests نوشتم. در حالی که این پست یک نمای کلی از فرآیند خراش دادن داده ها در اکثر وب سایت ها ارائه می دهد، در برخی موارد این رویکرد کافی نیست. برخی از وب سایت ها به گونه ای پیکربندی شده اند که از دسترسی خودکار برای خراش داده ها جلوگیری کنند. به طور کلی، وب سایت ها به دنبال پرهیز از ربات هایی هستند که می توانند باعث بارگیری بیش از حد سرور شوند و کاربرانی که می توانند اطلاعات را به دست آورند و بدون اعتبار مناسب از آن استفاده کنند.

با وجود این حفاظت ها، استفاده از ابزارهای اتوماسیون در وب سایت ها می تواند برای ایجاد راه حل های اتوماسیون، تست و تجزیه و تحلیل داده ها برای برنامه های کاربردی وب ضروری باشد. بنابراین، یادگیری در مورد این ابزارها برای توسعه، آزمایش و تجزیه و تحلیل وب سایت هایی با محافظت های ضد خزنده ضروری است.

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

الزامات کتابخانه و نصب

قبل از شروع تولید خود کد، باید مطمئن شویم که همه ابزارهای لازم را داریم. بنابراین، اطمینان حاصل کنید که شرایط زیر را برآورده می کنید:

نصب ابزارهای مورد نیاز

نصب سلنیوم

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

برای نصب کتابخانه سلنیوم می توانید از pip استفاده کنید.

pip install selenium
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نصب سوپ زیبا

کتابخانه BeautifulSoup ابزاری برای استخراج داده ها از فایل های HTML و XML است. مرور، جستجو، و اصلاح اسناد HTML و XML را ساده و موثر می کند.

برای نصب کتابخانه BeautifulSoup می توانید از pip نیز استفاده کنید.

pip install beautifulsoup4
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نصب پاندا

کتابخانه Pandas ساختارها و عملکردهای داده با کارایی بالا را برای دستکاری داده ها ارائه می دهد و فرآیندهای علم داده و تجزیه و تحلیل را کارآمدتر و شهودی تر می کند.

برای نصب کتابخانه Pandas می توانید از pip نیز استفاده کنید.

pip install pandas
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دانلود WebDriver

ابزار سلنیوم از درایورهای وب برای انجام فعالیت های اتوماسیون استفاده می کند. WebDriver ابزاری است که برای تست خودکار در مرورگرهای وب استفاده می شود. این به توسعه دهندگان و آزمایش کنندگان اجازه می دهد تا یک مرورگر (مانند کروم، فایرفاکس یا سافاری) را به صورت برنامه نویسی کنترل کنند و تعامل واقعی کاربر را شبیه سازی کنند. یکی از محبوب ترین WebDriver ها Selenium WebDriver است که از چندین مرورگر و زبان های برنامه نویسی مانند Python، Java و C# پشتیبانی می کند.

ChromeDriver یک جزء خاص از Selenium WebDriver است که به شما امکان می دهد مرورگر Google Chrome را کنترل کنید. این به عنوان پلی بین Selenium WebDriver و مرورگر عمل می کند و امکان اجرای تست های خودکار در کروم را فراهم می کند.

برای دانلود ابزار، باید به سایت دانلود گوگل کروم دسترسی داشته باشید و نسخه کرومدرایور سازگار با سیستم عامل خود را انتخاب کنید.

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

پس از دانلود فایل فشرده مربوطه، فایل ها را اکسترکت کرده و مکان فایل chromedriver.exe را ذخیره کنید، زیرا بعدا استفاده خواهد شد.

پیاده سازی

اولین قدم در اجرای پروژه ما وارد کردن کتابخانه هایی است که استفاده خواهیم کرد. برای این کار از قطعه کد زیر استفاده کنید. این قطعه BeautifulSoup، کتابخانه Selenium و Pandas را وارد می‌کند.

from bs4 import BeautifulSoup
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
import pandas as pd
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با کتابخانه های وارد شده، می توانیم درایور وب خود را برای دسترسی به صفحات اینترنت پیکربندی کنیم. برای پیکربندی، سازنده Selenium WebDriver به یک سرویس نیاز دارد – سرویس، که برای پیکربندی و مدیریت سرویس WebDriver برای Chrome استفاده می‌شود، مانند مشخص کردن مسیر فایل اجرایی ChromeDriver و تعریف آرگومان‌های اضافی. و گزینه هایی برای نمونه مرورگر کروم. بنابراین، در گزیده زیر، ما شیء خود را که مسئول به دست آوردن و دستکاری صفحه است، پیکربندی و نمونه سازی می کنیم.

chrome_options = webdriver.chrome.options.Options()
chrome_driver = "endereco/do/arquivo/chromedriver.exe"
service_to_pass = Service(executable_path=chrome_driver)
wd = webdriver.Chrome(service=service_to_pass, options=chrome_options)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حال برای بدست آوردن داده از صفحه مورد نظرمان اقدام لازم را انجام می دهیم. برای این کار از متد get() شی ایجاد شده استفاده می کنیم. متد دریافت مسئولیت باز کردن وب سایت را بر عهده دارد. بعداً از ویژگی شی WebDriver به نام page_source استفاده خواهیم کرد که به ما امکان دسترسی به کد منبع (محتوای) صفحه مورد نظر را می دهد.

علاوه بر این، باید آدرس صفحه ای را که می خواهید به آن دسترسی داشته باشید، تعیین کنید. در پروژه از وب سایت www.whoscored.com مخصوصا صفحه آمار آن استفاده کردم. این وب سایت دارای حفاظت ضد خزنده است و بنابراین با استفاده از آن به عنوان آزمایش می توان کارایی ابزار را مشاهده کرد.

صفحه بدون آموزش
صفحه بدون آموزش

URL_BASE = "https://www.whoscored.com/Statistics"
wd.get(URL_BASE)
soup_file = wd.page_source
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

برای این کار از کتابخانه‌های Pandas و BeautifulSoup که قبلاً وارد شده‌اند استفاده می‌کنیم. اگر در دنبال کردن کد زیر مشکل دارید، توصیه می‌کنم به دنبال آموزش مقدمه‌ای بر WebScraping باشید، زیرا هر یک از توابع مورد استفاده در زیر را معرفی می‌کند.

بخش اول پردازش شامل ارسال کد منبع از طریق تجزیه کننده HTML BeautifulSoup است.

soup_page = BeautifulSoup(soup_file, "html.parser")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون، داده‌هایی را که می‌خواهیم واکشی می‌کنیم. در پروژه، داده هایی را از جدول مشخص شده در زیر به دست خواهیم آورد. اینها داده های خلاصه شده با 20 باشگاه برتر با توجه به نمرات اختصاص داده شده توسط وب سایت است.

جدول قابل دسترسی
جدول قابل دسترسی

ابتدا به جدول انتخاب شده در HTML با شناسه آن دسترسی خواهیم داشت.

main_table = soup_page.find('div', {'id': 'top-team-stats-summary'})

team_sum_stats_table = main_table.find('table', {'id': 'top-team-stats-summary-grid'})
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون، در جدول، نام ستون های موجود را دریافت می کنیم.

team_sum_stats_header = team_sum_stats_table.find_all('th')

header_columns = [column_name.text for column_name in team_sum_stats_header]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه داشته باشید که کد بالا از قابلیت List Comprehension استفاده می کند. این نوع ویژگی از یک نحو ساده تر و تمیزتر برای ایجاد لیست از لیست های دیگر استفاده می کند. بنابراین، کد بالا معادل کد ارائه شده در زیر است.

team_sum_stats_header = team_sum_stats_table.find_all('th')

header_columns = []
    for column_name in team_sum_stats_header:
        header_columns.append(column_name.text)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا بیایید داده های سلولی را از جدول خود دریافت کنیم. برای این کار از کد زیر استفاده کنید.

team_sum_stats_body = team_sum_stats_table.find('tbody').find_all('tr')

teams_stats = [[cell_value.text for cell_value in row.find_all('td')] for row in team_sum_stats_body]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این بار، کد دارای دو درک لیست تودرتو است. شاید پیچیده به نظر برسد، اما در واقعیت، کد پیشنهادی مانند کد زیر عمل می کند.

teams_stats = []
for row in team_sum_stats_body:
    cells = row.find_all('td')
    row_values = []
    for cell_value in cells:
        row_values.append(cell_value.text)
    teams_stats.append(row_values)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون، ما ستون ها و ردیف های مقادیر خود را داریم. سپس می توانیم DataFrame خود را با اطلاعات ساختاری موجود در وب سایت ایجاد کنیم. برای این کار از کد زیر استفاده کنید.

df_sum = pd.DataFrame(teams_stats, columns=header_columns)

print(df_sum.head())
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد مانند تصویر زیر منجر به پنج رکورد اول در جدول وب سایت می شود.

نتیجه کد ما
نتیجه کد ما

مخزن

کد پروژه کامل در مخزن github من است.

ملاحظات نهایی

امیدوارم آموزش به نوعی کمک کند. من شما را تشویق می کنم که نسخه های خود را پیاده سازی کنید و خوشحالم که به هر طریقی که می توانم کمک می کنم.

اگر می خواهید با ما تماس بگیرید، ایمیل خود را lisandramelo34@gmail.com و نمایه لینکدین خود را می گذارم.

نوشته های مشابه

دیدگاهتان را بنویسید

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

دکمه بازگشت به بالا