وب اسکرپینگ یا استخراج داده از وب، فرآیندی است برای جمعآوری خودکار اطلاعات از صفحات اینترنتی. این روش به کاربران اجازه میدهد تا بدون نیاز به ورود دستی، دادههای موردنیاز خود را از وبسایتها دریافت کرده و در قالبهای ساختیافته مانند CSV یا JSON ذخیره کنند. از تحلیل قیمت محصولات در فروشگاههای آنلاین گرفته تا گردآوری اخبار، ساخت دیتاست برای پروژههای یادگیری ماشین، یا پایش رقبا، وب اسکرپینگ ابزاری قدرتمند برای تحلیلگران داده، توسعهدهندگان و پژوهشگران است.
زبان برنامهنویسی پایتون بهدلیل سادگی و وجود کتابخانههای قدرتمند، یکی از محبوبترین گزینهها برای انجام وب اسکرپینگ محسوب میشود. در این مطلب، با تمرکز بر دو کتابخانهی کلیدی Requests و BeautifulSoup، گامبهگام با نحوهی ارسال درخواست به صفحات وب، تجزیهی ساختار HTML، و استخراج دادههای موردنظر آشنا خواهیم شد.
پیشنیازها و نصب کتابخانههای موردنیاز
برای شروع وب اسکرپینگ با پایتون، ابتدا باید ابزارهای پایهای را بشناسیم و محیط کاری مناسبی فراهم کنیم. در این بخش، به بررسی پیشنیازهای فنی، نصب کتابخانههای ضروری، و آمادهسازی مقدماتی برای اجرای اسکریپتهای استخراج داده میپردازیم.
دانش اولیه موردنیاز
اگرچه وب اسکرپینگ با پایتون پیچیدگی خاصی ندارد، اما آشنایی مقدماتی با موارد زیر توصیه میشود:
- مفاهیم پایهای زبان پایتون: متغیرها، حلقهها، توابع، و مدیریت فایلها
- آشنایی با ساختار HTML و عناصر رایج مانند
<div>,<a>,<p>,<span> - درک ابتدایی از نحوه کار مرورگرها و درخواستهای HTTP
اگر با این مفاهیم آشنا نیستید، پیشنهاد میشود ابتدا یک دوره مقدماتی پایتون و HTML را مرور کنید تا درک بهتری از ساختار صفحات وب و نحوه تعامل با آنها داشته باشید.
کتابخانههای موردنیاز
برای انجام وب اسکرپینگ در پایتون، دو کتابخانهی اصلی مورد استفاده قرار میگیرند:
- Requests: کتابخانهای قدرتمند برای ارسال درخواستهای HTTP به وبسایتها. با استفاده از Requests میتوان محتوای صفحات وب را دریافت کرد، وضعیت پاسخ را بررسی نمود، و هدرهای سفارشی ارسال کرد.
- BeautifulSoup: ابزاری برای تجزیه و تحلیل محتوای HTML و استخراج دادهها از ساختار DOM. این کتابخانه امکان جستجو در عناصر HTML، فیلتر کردن دادهها، و استخراج متن یا ویژگیهای خاص را فراهم میکند.
نصب کتابخانهها
برای نصب این کتابخانهها، کافی است از ابزار pip استفاده کنید. در محیط ترمینال یا خط فرمان، دستورات زیر را اجرا نمایید:
pip install requests beautifulsoup4
در صورت نیاز به نصب نسخه خاصی یا بهروزرسانی، میتوانید از دستور زیر استفاده کنید:
pip install --upgrade requests beautifulsoup4
پس از نصب موفق، میتوانید با اجرای یک اسکریپت ساده، صحت نصب را بررسی کنید:
import requests
from bs4 import BeautifulSoup
print("The library installed successfuly!")
آمادهسازی محیط کاری
برای اجرای اسکریپتهای وب اسکرپینگ، میتوانید از محیطهای زیر استفاده کنید:
- Python IDE مانند PyCharm یا VS Code
- Notebook محیطها مانند Jupyter Notebook برای اجرای مرحلهبهمرحله کدها
- ترمینال یا Command Line برای اجرای فایلهای
.py
همچنین توصیه میشود یک پوشهی کاری مشخص برای پروژههای وب اسکرپینگ ایجاد کنید و فایلهای خروجی مانند CSV یا JSON را در آن ذخیره نمایید.
ارسال درخواست به صفحات وب با Requests
برای شروع فرآیند وب اسکرپینگ، نخستین گام دریافت محتوای صفحهی وب است. این کار با ارسال یک درخواست HTTP به آدرس موردنظر انجام میشود. کتابخانهی Requests در پایتون این امکان را فراهم میکند تا بهسادگی درخواستهای GET ،POST و سایر متدهای HTTP را ارسال کرده و پاسخ دریافتی را مدیریت کنیم.
ارسال درخواست GET
درخواست GET رایجترین نوع درخواست برای دریافت محتوای یک صفحه است. در مثال زیر، یک درخواست GET به آدرس مشخصی ارسال میشود و محتوای HTML صفحه چاپ میگردد:
import requests
url = "https://example.com"
response = requests.get(url)
print(response.status_code) # بررسی وضعیت پاسخ
print(response.text) # محتوای HTML صفحه
بررسی وضعیت پاسخ
هر پاسخ HTTP دارای یک کد وضعیت (Status Code) است که نشان میدهد درخواست با موفقیت انجام شده یا با خطا مواجه شده است. برخی از کدهای رایج عبارتاند از:
| کد | توضیح |
|---|---|
| 200 | موفقیتآمیز (OK) |
| 301 | تغییر مسیر دائمی (Redirect) |
| 403 | دسترسی ممنوع (Forbidden) |
| 404 | صفحه پیدا نشد (Not Found) |
| 500 | خطای سرور (Server Error) |
برای اطمینان از موفقیتآمیز بودن درخواست، میتوان از شرط زیر استفاده کرد:
if response.status_code == 200:
print("درخواست موفقیتآمیز بود.")
else:
print("خطا در دریافت صفحه:", response.status_code)
ارسال هدرهای سفارشی
برخی وبسایتها برای جلوگیری از دسترسی رباتها، درخواستهایی را که فاقد هدرهای مرورگر هستند مسدود میکنند. در این موارد، میتوان با افزودن هدر User-Agent، رفتار یک مرورگر واقعی را شبیهسازی کرد:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
response = requests.get(url, headers=headers)
مدیریت زمان پاسخ و خطاها
در برخی موارد، ممکن است سرور پاسخ ندهد یا اتصال با تأخیر مواجه شود. برای جلوگیری از توقف برنامه، میتوان زمان انتظار (timeout) را مشخص کرد:
try:
response = requests.get(url, timeout=5)
response.raise_for_status() # بررسی خطاهای HTTP
except requests.exceptions.RequestException as e:
print("خطا در اتصال:", e)
تجزیهی محتوای HTML با BeautifulSoup
پس از دریافت محتوای صفحه با Requests، نوبت به تجزیهی آن و استخراج دادههای موردنظر میرسد. کتابخانهی BeautifulSoup این امکان را فراهم میکند تا ساختار HTML را بهصورت درختی تحلیل کرده و عناصر خاص را جستجو کنیم.
ابتدا باید محتوای HTML را به شیء BeautifulSoup تبدیل کنیم:
from bs4 import BeautifulSoup
import requests
url = "https://example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
در اینجا، html.parser نوع تجزیهگر داخلی پایتون است. میتوان از تجزیهگرهای دیگر مانند lxml نیز استفاده کرد.
استخراج عناصر HTML
برای استخراج دادهها از عناصر خاص، میتوان از متدهای find ،find_all یا select استفاده کرد. بهعنوان مثال، استخراج عنوان صفحه:
title_tag = soup.title
print(title_tag.text)
یا استخراج تمام لینکها از صفحه:
links = soup.find_all("a")
for link in links:
href = link.get("href")
print(href)
جستجو بر اساس کلاس یا شناسه
میتوان عناصر HTML را بر اساس کلاس (class) یا شناسه (id) فیلتر کرد:
headline = soup.find("h1", class_="main-title")
print(headline.text)
یا:
section = soup.find(id="news-section")
print(section.text)
استفاده از CSS Selector
برای جستجوی دقیقتر، میتوان از select و CSS Selector استفاده کرد:
items = soup.select("div.article > h2.title")
for item in items:
print(item.text)
مثال عملی: استخراج تیترهای خبری از یک وبسایت
در این مثال عملی، تیترهای خبری را از وبسایت فارسی «ایسنا» استخراج میکنیم. ابتدا ساختار HTML صفحهی اصلی ایسنا را بررسی میکنیم. تیترهای خبری در تگهای <h3> قرار دارند. با استفاده از Requests و BeautifulSoup، این تیترها را دریافت و چاپ میکنیم:
import requests
from bs4 import BeautifulSoup
url = "https://www.isna.ir/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
headlines = soup.find_all("h3")
for idx, headline in enumerate(headlines, 1):
print(f"{idx}. {headline.text.strip()}")
else:
print("خطا در دریافت صفحه:", response.status_code)
در این اسکریپت:
- درخواست GET با هدر مرورگر ارسال میشود تا از مسدود شدن جلوگیری شود.
- محتوای HTML صفحهی اصلی ایسنا تجزیه میشود.
- تیترهای خبری با استفاده از تگ h3 استخراج میشوند.
- تیترها بهصورت فهرستشده چاپ میگردند.
برای اطمینان از صحت تگها و کلاسها، پیشنهاد میشود ساختار HTML صفحه را با ابزار Inspect مرورگر بررسی کنید.
نکات مهم در وب اسکرپینگ: اخلاق، محدودیتها و پایداری
وب اسکرپینگ، با وجود کاربردهای گستردهاش، نیازمند رعایت اصولی است که هم از نظر فنی اهمیت دارند و هم از نظر اخلاقی و قانونی. در این بخش، به مهمترین نکاتی میپردازیم که هنگام طراحی و اجرای اسکریپتهای استخراج داده باید در نظر گرفته شوند.
۱. رعایت فایل robots.txt
بسیاری از وبسایتها در مسیر robots.txt مشخص میکنند که کدام بخشهای سایت برای خزندهها (crawlers) مجاز یا ممنوع هستند. پیش از شروع اسکرپینگ، بهتر است این فایل را بررسی کنید:
https://example.com/robots.txt
اگر در این فایل مسیر خاصی با Disallow مشخص شده باشد، به این معناست که دسترسی خودکار به آن بخش مجاز نیست. رعایت این محدودیتها نشانهی احترام به سیاستهای سایت است.
۲. محدود کردن نرخ درخواستها (Rate Limiting)
ارسال تعداد زیاد درخواست در زمان کوتاه میتواند باعث مسدود شدن IP شما شود یا فشار غیرضروری به سرور وارد کند. برای جلوگیری از این مشکل:
- بین هر درخواست، چند ثانیه تأخیر قرار دهید.
- از توابعی مانند
time.sleep()برای کنترل سرعت استفاده کنید.
import time
for link in links:
response = requests.get(link)
time.sleep(2) # تأخیر ۲ ثانیهای بین درخواستها
۳. استفاده از هدرهای مناسب
برخی وبسایتها درخواستهایی را که فاقد هدرهای مرورگر هستند، بهعنوان ربات شناسایی کرده و مسدود میکنند. افزودن هدر User-Agent میتواند به شبیهسازی رفتار مرورگر کمک کند:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
response = requests.get(url, headers=headers)
۴. مدیریت خطاها و استثناها
در هنگام اسکرپینگ، ممکن است با خطاهای مختلفی مواجه شوید: از خطاهای HTTP گرفته تا قطعی اتصال یا تغییر ساختار HTML. برای جلوگیری از توقف ناگهانی برنامه، باید از بلوکهای try-except استفاده کنید:
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print("خطا:", e)
۵. تغییر ساختار صفحات وب
ساختار HTML وبسایتها ممکن است در هر زمان تغییر کند. بنابراین، اسکریپتهای اسکرپینگ باید بهگونهای طراحی شوند که در برابر این تغییرات مقاوم باشند یا بهراحتی قابل بهروزرسانی باشند. استفاده از انتخابگرهای دقیق و بررسی مداوم خروجیها در این زمینه بسیار مهم است.
ذخیرهسازی دادههای استخراجشده در قالب CSV و JSON
پس از استخراج دادهها از صفحات وب، مرحلهی بعدی ذخیرهسازی آنها برای استفادههای بعدی است. دو قالب رایج برای ذخیره دادهها عبارتاند از:
- CSV: مناسب برای دادههای جدولی و قابل استفاده در اکسل یا ابزارهای تحلیل داده
- JSON: مناسب برای دادههای ساختیافته و سلسلهمراتبی، قابل استفاده در برنامهنویسی و APIها
در این بخش، نحوهی ذخیرهسازی تیترهای خبری در هر دو قالب را بررسی میکنیم.
ذخیره در فایل CSV
برای ذخیره دادهها در قالب CSV، از کتابخانهی csv استفاده میکنیم. فرض کنید لیستی از تیترها را در متغیر headlines داریم:
import csv
with open("headlines.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["عنوان"])
for headline in headlines:
writer.writerow([headline.text.strip()])
در این اسکریپت:
- فایل
headlines.csvایجاد میشود. - عنوان ستونها در ردیف اول نوشته میشود.
- هر تیتر در یک ردیف جداگانه ذخیره میگردد.
ذخیره در فایل JSON
برای ذخیره دادهها در قالب JSON، از کتابخانهی json استفاده میکنیم. ابتدا تیترها را به یک لیست پایتونی تبدیل میکنیم:
import json
titles = [headline.text.strip() for headline in headlines]
with open("headlines.json", "w", encoding="utf-8") as file:
json.dump(titles, file, ensure_ascii=False, indent=2)
در این اسکریپت:
- تیترها بهصورت لیست رشتهها ذخیره میشوند.
- فایل
headlines.jsonبا فرمت خوانا و یونیکد ایجاد میشود.
نکات تکمیلی
- برای ذخیره دادههای پیچیدهتر (مانند عنوان، لینک، تاریخ)، میتوان از لیست دیکشنریها استفاده کرد.
- در پروژههای بزرگتر، ذخیرهسازی در دیتابیس مانند SQLite یا MongoDB نیز رایج است.
- همیشه قبل از ذخیرهسازی، دادهها را پاکسازی و اعتبارسنجی کنید تا از خطاهای احتمالی جلوگیری شود.
جمعبندی و منابع یادگیری
در این مطلب، با مراحل کامل وب اسکرپینگ با پایتون آشنا شدیم؛ از ارسال درخواست به صفحات وب با استفاده از کتابخانهی Requests گرفته تا تجزیهی محتوای HTML با BeautifulSoup و استخراج دادههای موردنظر. همچنین با نکات مهمی مانند رعایت اصول اخلاقی، مدیریت خطاها، و ذخیرهسازی دادهها در قالبهای استاندارد آشنا شدیم.
وب اسکرپینگ ابزاری قدرتمند برای تحلیل دادههای عمومی است، اما استفادهی مسئولانه از آن اهمیت بالایی دارد. رعایت قوانین سایتها، محدود کردن نرخ درخواستها، و احترام به ساختار و مالکیت محتوا، بخشی از اخلاق حرفهای در این حوزه محسوب میشود.
منابع پیشنهادی برای یادگیری بیشتر:
-
مستندات رسمی Requests:
https://docs.python-requests.org -
مستندات BeautifulSoup:
https://www.crummy.com/software/BeautifulSoup/bs4/doc -
کتابهای پیشنهادی:
- Web Scraping with Python نوشتهی Ryan Mitchell
- Automate the Boring Stuff with Python نوشتهی Al Sweigart
با تمرین و تجربه، میتوانید اسکریپتهای قدرتمندتری بنویسید، دادههای پیچیدهتری استخراج کنید، و پروژههای تحلیلی خود را با دادههای واقعی غنیتر سازید.
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید