Web scraping چیست؟

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

آنچه در اینجا خواهید آموخت

پایتون دو کتابخانه به نام‌های Requests و Beautiful Soup ارائه می‌کند که به شما کمک می‌کند وب‌سایت‌ها را راحت‌تر خراش دهید. استفاده ترکیبی از درخواست‌های Python و Beautiful Soup می‌تواند محتوای HTML را از یک وب‌سایت بازیابی کند و سپس آن را برای استخراج داده‌های مورد نیاز تجزیه کند. در این مقاله روش استفاده از این کتابخانه ها را با یک مثال به شما نشان می دهم.

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

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

لطفاً توجه داشته باشید که اگرچه وب اسکراپر ابزار مفیدی است، مطمئن شوید که با تمام دستورالعمل‌های قانونی مطابقت دارید. این شامل احترام به وب سایت است robots.txt فایل و رعایت شرایط خدمات، بنابراین از استخراج غیرمجاز داده ها جلوگیری کنید.

همچنین قبل از سوهان زدن از سوهان زدن مطمئن شوید process به عملکرد وب سایت آسیب نمی رساند یا سرورهای آن را بیش از حد بارگذاری می کند. در نهایت، با حذف نکردن اطلاعات شخصی یا حساس بدون رضایت مناسب، به حریم خصوصی داده ها احترام بگذارید.

چگونه سوپ زیبا و درخواست های پایتون با هم کار می کنند

بیایید نقش هر کتابخانه را درک کنیم.

کتابخانه درخواست‌های پایتون مسئول واکشی محتوای HTML از آدرس اینترنتی شما در اسکریپت است. هنگامی که محتوا را بازیابی می کند، داده ها را در یک شی پاسخ ذخیره می کند.

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

اما این دوتایی محدودیت هایی دارد. کتابخانه Requests نمی تواند وب سایت هایی با محتوای جاوا اسکریپت پویا را مدیریت کند. بنابراین شما باید در درجه اول از آن برای سایت هایی استفاده کنید که محتوای ایستا را از سرورها ارائه می دهند. اگر نیاز به خراش دادن یک سایت بارگذاری شده پویا دارید، باید از ابزارهای اتوماسیون پیشرفته تری مانند سلنیوم استفاده کنید.

چگونه با Python SDK یک Web Scraper بسازیم

اکنون که فهمیدیم Beautiful Soup و Python Requests چه کاری می توانند انجام دهند، بیایید در مورد اینکه چگونه می توانیم داده ها را با استفاده از این ابزارها خراش دهیم، بحث کنیم.

پیشنهاد می‌کنیم بخوانید:  دکوراتور دارایی پایتون

در مثال زیر، داده ها را از مخزن یادگیری ماشین UC Irvine جمع آوری می کنیم.

AD_4nXd2MTmii-KD8tu6AAeHhbr9Sb5vauq3jC3AcYc2Yvd4kcCQLdTdVrBqZuFOpF-vKQ3E012hV7W6bm0iOtqrCsvJx6xsT165CV8MKj46T165CV000000000iOtqrCsvJx6xsT165CV8MKj46T165CV0000F 4XLVBuikCJpXTIB6c6JriJtP9MQ?key=f_hrU3B_rjNJFpKZiiV3Pw
مجموعه داده ها در مخزن یادگیری ماشین UC Irvine

همانطور که می بینید، شامل مجموعه داده های زیادی است و می توانید با رفتن به یک مجموعه داده، جزئیات بیشتری در مورد هر مجموعه داده پیدا کنید page برای مجموعه داده شما می توانید به اختصاصی دسترسی داشته باشید page با کلیک کردن روی نام مجموعه داده در لیست بالا.

برای دریافت ایده از اطلاعات ارائه شده برای هر مجموعه داده، تصویر زیر را بررسی کنید.

AD_4nXcb7_BVgpIh1P931U-HHX6BKIPN1ODKRzc6WqjX-n77uA9Uvz_e80wqc2YtJx2-Rq3HzWKtlDE31gV-7jz0UASzKrhq86VXV45KrhqNXV4VR5 k54hpyEetzyuDjMgPYW4KKW-oPhKjh8?key=f_hrU3B_rjNJFpKZiiV3Pw
مجموعه داده عنبیه

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

مرحله 1: وارد کردن کتابخانه های ضروری

اولین، import کتابخانه های لازم: درخواست برای ایجاد درخواست های HTTP، BeautifulSoup برای تجزیه محتوای HTML، و CSV برای ذخیره داده ها.

import requests
from bs4 import BeautifulSoup
import csv

مرحله 2: URL پایه و سرصفحه CSV را تعریف کنید

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

def scrape_uci_datasets():
    base_url = "https://archive.ics.uci.edu/datasets"


    headers = [
        "Dataset Name", "Donated Date", "Description",
        "Dataset Characteristics", "Subject Area", "Associated Tasks",
        "Feature Type", "Instances", "Features"
    ]


    data = []

مرحله 3: یک تابع برای خراش دادن جزئیات مجموعه داده ایجاد کنید

یک تابع را تعریف کنید scrape_dataset_details که URL یک مجموعه داده جداگانه را می گیرد page، محتوای HTML را بازیابی می کند، آن را با استفاده از BeautifulSoup تجزیه می کند و اطلاعات مربوطه را استخراج می کند.


    def scrape_dataset_details(dataset_url):
        response = requests.get(dataset_url)
        soup = BeautifulSoup(response.text, 'html.parser')


        dataset_name = soup.find(
            'h1', class_='text-3xl font-semibold text-primary-content')
        dataset_name = dataset_name.text.strip() if dataset_name else "N/A"


        donated_date = soup.find('h2', class_='text-sm text-primary-content')
        donated_date = donated_date.text.strip().replace(
            'Donated روی ', '') if donated_date else "N/A"


        description = soup.find('p', class_='svelte-17wf9gp')
        description = description.text.strip() if description else "N/A"


        details = soup.find_all('div', class_='col-span-4')


        dataset_characteristics = details[0].find('p').text.strip() if len(
            details) > 0 else "N/A"
        subject_area = details[1].find('p').text.strip() if len(
            details) > 1 else "N/A"
        associated_tasks = details[2].find('p').text.strip() if len(
            details) > 2 else "N/A"
        feature_type = details[3].find('p').text.strip() if len(
            details) > 3 else "N/A"
        instances = details[4].find('p').text.strip() if len(
            details) > 4 else "N/A"
        features = details[5].find('p').text.strip() if len(
            details) > 5 else "N/A"


        return [
            dataset_name, donated_date, description, dataset_characteristics,
            subject_area, associated_tasks, feature_type, instances, features
        ]

این scrape_dataset_details تابع محتوای HTML یک مجموعه داده را بازیابی می کند page و آن را با استفاده از BeautifulSoup تجزیه می کند. این اطلاعات را با هدف قرار دادن عناصر خاص HTML بر اساس استخراج می کند روی برچسب ها و کلاس های آنها، مانند نام مجموعه داده ها، تاریخ اهدا، و توضیحات.

تابع از روش هایی مانند find و find_all برای مکان یابی این عناصر و بازیابی محتوای متنی آنها، رسیدگی به مواردی که ممکن است عناصر از دست رفته با ارائه مقادیر پیش فرض.

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

مرحله 4: یک تابع برای خراش دادن لیست های مجموعه داده ایجاد کنید

یک تابع را تعریف کنید scrape_datasets که URL یک را می گیرد page فهرست کردن مجموعه داده های متعدد، محتوای HTML را بازیابی می کند و تمام پیوندهای مجموعه داده را پیدا می کند. برای هر پیوند، تماس می گیرد scrape_dataset_details برای دریافت اطلاعات دقیق

    def scrape_datasets(page_url):
        response = requests.get(page_url)
        soup = BeautifulSoup(response.text, 'html.parser')


        dataset_list = soup.find_all(
            'a', class_='link-hover link text-xl font-semibold')


        if not dataset_list:
            print("No dataset links found")
            return


        for dataset in dataset_list:
            dataset_link = "https://archive.ics.uci.edu" + dataset['href']
            print(f"Scraping details for {dataset.text.strip()}...")
            dataset_details = scrape_dataset_details(dataset_link)
            data.append(dataset_details)

مرحله 5: با استفاده از پارامترهای صفحه بندی، صفحات را حلقه بزنید

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

    skip = 0
    take = 10
    while True:
        page_url = f"https://archive.ics.uci.edu/datasets؟skip={skip}&take={take}&sort=desc&orderBy=NumHits&search="
        print(f"Scraping page: {page_url}")
        initial_data_count = len(data)
        scrape_datasets(page_url)
        if len(
                data
        ) == initial_data_count:  
            break
        skip += take

مرحله 6: داده های خراشیده شده را در یک فایل CSV ذخیره کنید

پس از خراش دادن تمام داده ها، آن را در یک فایل CSV ذخیره کنید.

    with open('uci_datasets.csv', 'w', newline="", encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(headers)
        writer.writerows(data)


    print("Scraping complete. Data saved to 'uci_datasets.csv'.")

مرحله 7: عملکرد Scraping را اجرا کنید

در نهایت با scrape_uci_datasets عملکرد برای شروع خراشیدن process.

scrape_uci_datasets()

کد کامل

در اینجا کد کامل وب اسکراپر آمده است:

import requests
from bs4 import BeautifulSoup
import csv


def scrape_uci_datasets():
    base_url = "https://archive.ics.uci.edu/datasets"


    headers = [
        "Dataset Name", "Donated Date", "Description",
        "Dataset Characteristics", "Subject Area", "Associated Tasks",
        "Feature Type", "Instances", "Features"
    ]


    # List to store the scraped data
    data = []


    def scrape_dataset_details(dataset_url):
        response = requests.get(dataset_url)
        soup = BeautifulSoup(response.text, 'html.parser')


        dataset_name = soup.find(
            'h1', class_='text-3xl font-semibold text-primary-content')
        dataset_name = dataset_name.text.strip() if dataset_name else "N/A"


        donated_date = soup.find('h2', class_='text-sm text-primary-content')
        donated_date = donated_date.text.strip().replace(
            'Donated روی ', '') if donated_date else "N/A"


        description = soup.find('p', class_='svelte-17wf9gp')
        description = description.text.strip() if description else "N/A"


        details = soup.find_all('div', class_='col-span-4')


        dataset_characteristics = details[0].find('p').text.strip() if len(
            details) > 0 else "N/A"
        subject_area = details[1].find('p').text.strip() if len(
            details) > 1 else "N/A"
        associated_tasks = details[2].find('p').text.strip() if len(
            details) > 2 else "N/A"
        feature_type = details[3].find('p').text.strip() if len(
            details) > 3 else "N/A"
        instances = details[4].find('p').text.strip() if len(
            details) > 4 else "N/A"
        features = details[5].find('p').text.strip() if len(
            details) > 5 else "N/A"


        return [
            dataset_name, donated_date, description, dataset_characteristics,
            subject_area, associated_tasks, feature_type, instances, features
        ]


    def scrape_datasets(page_url):
        response = requests.get(page_url)
        soup = BeautifulSoup(response.text, 'html.parser')


        dataset_list = soup.find_all(
            'a', class_='link-hover link text-xl font-semibold')


        if not dataset_list:
            print("No dataset links found")
            return


        for dataset in dataset_list:
            dataset_link = "https://archive.ics.uci.edu" + dataset['href']
            print(f"Scraping details for {dataset.text.strip()}...")
            dataset_details = scrape_dataset_details(dataset_link)
            data.append(dataset_details)


    # Loop through the pages using the pagination parameters
    skip = 0
    take = 10
    while True:
        page_url = f"https://archive.ics.uci.edu/datasets؟skip={skip}&take={take}&sort=desc&orderBy=NumHits&search="
        print(f"Scraping page: {page_url}")
        initial_data_count = len(data)
        scrape_datasets(page_url)
        if len(
                data
        ) == initial_data_count: 
            break
        skip += take


    with open('uci_datasets.csv', 'w', newline="", encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(headers)
        writer.writerows(data)


    print("Scraping complete. Data saved to 'uci_datasets.csv'.")


scrape_uci_datasets()

هنگامی که اسکریپت را اجرا می کنید، برای مدتی اجرا می شود تا زمانی که terminal می‌گوید «هیچ پیوند داده‌ای یافت نشد» و به دنبال آن «خراش کامل شد. داده‌ها در “uci_datasets.csv” ذخیره شدند، که نشان می‌دهد داده‌های خراشیده شده در یک فایل CSV ذخیره شده‌اند.

پیشنهاد می‌کنیم بخوانید:  حذف عناصر از لیست پایتون با ایندکس
AD_4nXdRUvJJsu32oaxdattur__98CEF9GvqQMDTDQzpqS-NW3I2-haF5tfWH_mIBFwEhAqLhUhURVKCNFJE-b1bRzeZtz2oApWePqLZqWahNQW0000 2MdqvoLDhToy-gCj9o?key=f_hrU3B_rjNJFpKZiiV3Pw

برای مشاهده داده های خراشیده شده، “uci_datasets.csv” را باز کنید، باید بتوانید داده های سازماندهی شده بر اساس نام مجموعه داده، تاریخ اهدا، توضیحات، ویژگی ها، منطقه موضوعی و غیره را مشاهده کنید. روی.

AD_4nXd1ZkPzSyPxZ3KsZklCPPcruSll4xUBxm3KiNdageDzHK-wbTxG7v8HLFpoJ-gMvIpdKPxzoshzRlmNjiPeVcbvse14gdGFHu7Wqm89UGT h1bUO4w0D9sLFC_5Tmy3o?key=f_hrU3B_rjNJFpKZiiV3Pw
داده های سازماندهی شده بر اساس نام مجموعه داده، تاریخ اهدا، توضیحات، ویژگی ها، حوزه موضوعی و غیره روی.

اگر فایل را از طریق اکسل باز کنید، می توانید دید بهتری از داده ها داشته باشید.

AD_4nXfdmf621HGzQNHCdgxTJ6cvl2YEpuAq5hfvqpE9KrbZ8kDkGo6R3YIYpCFMmNoY8z29YEfcesZap9hpxiLc3fwHEyzLdo6dNQGNExRdamHfvqpE9KrbZ8kDkGo6R3YIYpCFMmNoY8z29YEfcesZap9hpxiLc3fwHEyzLdo6dNQGNExRdamFhKodGTU I5miEUp_UCyNPZo?key=f_hrU3B_rjNJFpKZiiV3Pw
داده ها در فایل اکسل سازماندهی شده اند

با پیروی از منطق ذکر شده در این مقاله، می توانید بسیاری از سایت ها را خراش دهید. تنها کاری که باید انجام دهید این است که از URL اصلی شروع کنید، روش پیمایش در لیست را بیابید و به آدرس اختصاصی بروید page برای هر آیتم لیست سپس، مناسب را شناسایی کنید page عناصری مانند شناسه ها و کلاس هایی که می توانید داده های مورد نظر خود را جداسازی و استخراج کنید.

همچنین باید منطق پشت صفحه بندی را درک کنید. اغلب، صفحه‌بندی تغییرات جزئی در URL ایجاد می‌کند، که می‌توانید از آن برای حلقه‌بندی از یکی استفاده کنید page به دیگری.

در نهایت، می توانید داده ها را در یک فایل CSV بنویسید که برای ذخیره سازی و به عنوان ورودی برای تجسم مناسب است.

نتیجه

استفاده از Python SDK همراه با Requests و Beautiful Soup به شما این امکان را می دهد که وب اسکرپرهای کاملاً کاربردی برای استخراج داده ها از وب سایت ها ایجاد کنید. در حالی که این عملکرد می تواند برای تصمیم گیری مبتنی بر داده بسیار سودمند باشد، مهم است که ملاحظات اخلاقی و قانونی را در نظر داشته باشید.

هنگامی که با روش های استفاده شده در این اسکریپت آشنا شدید، می توانید تکنیک هایی مانند مدیریت پروکسی و تداوم داده ها را بررسی کنید. همچنین می توانید با کتابخانه های دیگر مانند Scrapy، Selenium و Puppeteer آشنا شوید تا نیازهای جمع آوری داده های خود را برآورده کنید.

با تشکر از شما برای خواندن! من جس هستم و در Hyperskill متخصص هستم. شما می توانید یک را بررسی کنید پایتون توسعه دهنده دوره روی پلت فرم