از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
چگونه از Python SDK برای ساختن وب Scraper خود استفاده کنید
سرفصلهای مطلب
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 جمع آوری می کنیم.
همانطور که می بینید، شامل مجموعه داده های زیادی است و می توانید با رفتن به یک مجموعه داده، جزئیات بیشتری در مورد هر مجموعه داده پیدا کنید page برای مجموعه داده شما می توانید به اختصاصی دسترسی داشته باشید page با کلیک کردن روی نام مجموعه داده در لیست بالا.
برای دریافت ایده از اطلاعات ارائه شده برای هر مجموعه داده، تصویر زیر را بررسی کنید.
کدی که در زیر می نویسیم از هر مجموعه داده عبور می کند، جزئیات را می خراشد و آنها را در یک فایل 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 ذخیره شدهاند.
برای مشاهده داده های خراشیده شده، “uci_datasets.csv” را باز کنید، باید بتوانید داده های سازماندهی شده بر اساس نام مجموعه داده، تاریخ اهدا، توضیحات، ویژگی ها، منطقه موضوعی و غیره را مشاهده کنید. روی.
اگر فایل را از طریق اکسل باز کنید، می توانید دید بهتری از داده ها داشته باشید.
با پیروی از منطق ذکر شده در این مقاله، می توانید بسیاری از سایت ها را خراش دهید. تنها کاری که باید انجام دهید این است که از URL اصلی شروع کنید، روش پیمایش در لیست را بیابید و به آدرس اختصاصی بروید page برای هر آیتم لیست سپس، مناسب را شناسایی کنید page عناصری مانند شناسه ها و کلاس هایی که می توانید داده های مورد نظر خود را جداسازی و استخراج کنید.
همچنین باید منطق پشت صفحه بندی را درک کنید. اغلب، صفحهبندی تغییرات جزئی در URL ایجاد میکند، که میتوانید از آن برای حلقهبندی از یکی استفاده کنید page به دیگری.
در نهایت، می توانید داده ها را در یک فایل CSV بنویسید که برای ذخیره سازی و به عنوان ورودی برای تجسم مناسب است.
نتیجه
استفاده از Python SDK همراه با Requests و Beautiful Soup به شما این امکان را می دهد که وب اسکرپرهای کاملاً کاربردی برای استخراج داده ها از وب سایت ها ایجاد کنید. در حالی که این عملکرد می تواند برای تصمیم گیری مبتنی بر داده بسیار سودمند باشد، مهم است که ملاحظات اخلاقی و قانونی را در نظر داشته باشید.
هنگامی که با روش های استفاده شده در این اسکریپت آشنا شدید، می توانید تکنیک هایی مانند مدیریت پروکسی و تداوم داده ها را بررسی کنید. همچنین می توانید با کتابخانه های دیگر مانند Scrapy، Selenium و Puppeteer آشنا شوید تا نیازهای جمع آوری داده های خود را برآورده کنید.
با تشکر از شما برای خواندن! من جس هستم و در Hyperskill متخصص هستم. شما می توانید یک را بررسی کنید پایتون توسعه دهنده دوره روی پلت فرم
منتشر شده در 1403-07-10 19:40:06