در این مقاله بهزبان ساده و فنی تفاوت میان اسکریپینگ و وب کراولینگ را بررسی میکنیم، مثالهای عملی و قطعهکدهای پایتون میآوریم و نشان میدهیم چطور این دو معمولاً در یک سیستم بزرگ با هم کار میکنند. در پایان، شما میدانید چه زمانی از کراولر استفاده کنید، چه زمانی اسکریپر بسازید، و چگونه بهصورت امن، پایدار و مقیاسپذیر دادهها را جمعآوری کنید.
وب اسکریپینگ چیست؟
وب اسکریپینگ (web scraping) به فرایند ارسال درخواست به یک صفحه وب یا API و استخراج اطلاعات مشخص از محتوای دریافتی گفته میشود. هدف معمولاً گرفتن فیلدهای ساختاریافته (مثل نام محصول، قیمت، تصویر، توضیح) و ذخیرهٔ آنها در یک دیتابیس یا فایل است.
موارد کاربرد رایج:
- پایش قیمت محصولات: جمعآوری قیمتها برای تحلیل رقبا.
- تولید لید: استخراج نام و ایمیل برای اهداف فروش (با رعایت قوانین حریم خصوصی).
- پایش شبکههای اجتماعی: جمعآوری متریکها و پروفایلها برای تحلیل رشد.
مثالی ساده با requests و BeautifulSoup برای خواندن یک صفحه محصول و بازگرداندن یک دیکشنری ساختاریافته:
import requests
from bs4 import BeautifulSoup
def scrape_product(url):
"""ورودی: آدرس صفحه محصول
خروجی: دیکشنری شامل name, price, images
"""
headers = {'User-Agent': 'my-scraper/1.0'}
resp = requests.get(url, headers=headers, timeout=10)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, 'html.parser')
name = soup.select_one('h1.product-title').get_text(strip=True) if soup.select_one('h1.product-title') else None
price = soup.select_one('span.price').get_text(strip=True) if soup.select_one('span.price') else None
images = [img['src'] for img in soup.select('img.product-image') if img.get('src')]
return {'name': name, 'price': price, 'images': images, 'url': url}
توضیح مختصر:
- ورودی: url صفحه محصول.
- خروجی: یک دیکشنری ساده با فیلدهای استخراجشده.
- خطبهخط: ایجاد هدر برای User-Agent → ارسال درخواست → بررسی وضعیت پاسخ → ساختاردهی با BeautifulSoup → انتخاب با CSS selector → بازگشت داده.
نکتهها: همیشه از timeout و raise_for_status() استفاده کنید تا خطاها سریع آشکار شوند؛ سشنهای requests.Session() برای reuse اتصالها مفید است.
وب کراولینگ چیست؟
وب کراولینگ متمرکز بر کشف صفحات و ساخت نقشهٔ سایت است، نه استخراج جزئیات هر صفحه. کراولرها صفحات را بازدید، لینکها را استخراج و معمولاً لیستی از URLها یا نمایهای برای ایندکسسازی تولید میکنند.
مثال سادهٔ کراولر که لینکهای داخلی یک دامنه را تا عمق مشخص مییابد:
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
def crawl(start_url, max_depth=2):
seen = set()
queue = [(start_url, 0)]
domain = urlparse(start_url).netloc
while queue:
url, depth = queue.pop(0)
if url in seen or depth > max_depth:
continue
try:
resp = requests.get(url, timeout=10)
resp.raise_for_status()
except Exception:
continue
seen.add(url)
soup = BeautifulSoup(resp.text, 'html.parser')
for a in soup.select('a[href]'):
href = urljoin(url, a['href'])
if urlparse(href).netloc == domain:
queue.append((href, depth + 1))
return list(seen)
توضیح:
- کراولر ورودی: یک URL آغازین و عمق جستجو.
- خروجی: لیست URLهای کشفشده در همان دامنه.
- ریزکارها: نرمالسازی آدرسها با urljoin، فیلتر براساس دامنه، و جلوگیری از بازدید مجدد با seen.
تفاوتهای کلیدی
جملهٔ خلاصه: اسکریپینگ برای استخراج دادههای مشخص است، کراولینگ برای کشف و فهرستبندی صفحات.
- هدف: اسکریپینگ -> داده؛ کراولینگ -> کشف/ایندکس.
- خروجی: اسکریپینگ -> رکوردهای ساختاریافته (مثلاً JSON/VARCHAR)، کراولینگ -> لیست URL و نقشهٔ سایت.
- شیوهٔ معرفی به سایت: کراولرها معمولاً خودشان را معرفی میکنند (و سایتها اغلب کمک میکنند)، اما اسکریپرها اغلب نیاز به پنهانسازی هویت (پراکسی، user-agent جعلی) دارند—البته باید با ملاحظات قانونی همراه باشد.
ترکیب اسکریپینگ و کراولینگ
در پروژههای بزرگ معمولاً ابتدا یک کراولر صفحات هدف را پیدا میکند و سپس لیست URLها را به صف اسکریپرها میدهد تا دادهٔ ساختاریافته استخراج شود. این تقسیم کار مزایایی مثل تفکیک مسئولیت، قابلیت مقیاس و کنترل بهتر نرخ درخواست فراهم میکند.
معماری پیشنهادی ساده:
- کراولر → کشف URLها و ذخیره در صف (مثلاً Redis یا یک دیتابیس صف).
- سامانه صف → بارگذاری متعادل میان چند اسکریپر.
- اسکریپرها → استخراج داده و ارسال به دیتابیس (مثلاً PostgreSQL، Elasticsearch یا S3 برای فایلها).
- نظارت و لاگینگ → بررسی failure، retry و alerting.
مثالِ ساختاریافتهٔ خروجی اسکریپر (نمونه JSON):
{
"name": "Product name",
"offers": [{"price": "42", "currency": "USD", "availability": "InStock"}],
"sku": "978-3-16-148410-0",
"brand": "product brand",
"mainImage": "https://example.com/image.png",
"description": "product description",
"url": "https://example.com/product"
}
نکات عملی، امنیت و بهترینروشها
برای تولید یک سامانهٔ قابلاطمینان در سطح تولید، به نکات زیر توجه کنید:
- رزپکت به robots.txt و قوانین سایت: حتی اگر فنی بتوانید ignore کنید، بررسی قوانین و احترام به آنها ریسک حقوقی را کاهش میدهد.
- نرخدهی و دیرکرد: از نرخدهی (rate limiting) و backoff تصاعدی برای جلوگیری از فشار روی سرور هدف استفاده کنید.
- پراکسی و چرخش آیپی: برای مقیاسپذیری و جلوگیری از بلاک شدن مفید است، ولی استفاده باید با سیاستهای حقوقی و اخلاقی همخوان باشد.
- هدرها و fingerprinting: بازتولید منطقی هدرها (مثل User-Agent) و session cookieها کمک میکند، اما جعل بیش از حد ممکن است مشکلساز شود.
- مدیریت خطا: لاگینگ دقیق، ریترای با محدودیت، گزارش خطا و بررسی محتوای غیرمنتظره (CAPTCHA، صفحات 403) ضروریاند.
- پایداری و دیتاست: از شناسههای یکتا برای رکوردها استفاده کنید، تغییرات صفحه را versioning کنید و برای دادههای بزرگ از ذخیرهسازی مناسب (نظیر object store یا timeseries DB) بهره ببرید.
- محافظت از اطلاعات حساس: قوانین حریم خصوصی (مانند GDPR) را بررسی کنید؛ ذخیره یا پردازش اطلاعات شخصی نیازمند مطابقت قانونی است.
جمعبندی
اسکریپینگ و کراولینگ دو جزء مکمل در وزارت جمعآوری دادهٔ وب هستند: کراولینگ برای کشف و نقشهبرداری صفحات و اسکریپینگ برای استخراج دادههای دقیق. برای سیستمهای مقیاسپذیر، کراولرها URLها را کشف میکنند و اسکریپرها آنها را پردازش میکنند؛ در عین حال رعایت قوانین سایت، مدیریت نرخ و استراتژیهای retry، proxies و لاگینگ از ملزومات تولیدی هستند.
اگر دنبال اجرای اولیه هستید، با یک اسکریپر ساده و قوانین نرخدهی شروع کنید، سپس به سمت جداسازی کراولینگ و اسکریپینگ، صفبندی کارها و مانیتورینگ پیشروی کنید.
آسان اسکریپ را در گوگل بهعنوان منبع ترجیحی انتخاب کن
مقالههای جدید ما زودتر و پررنگتر در نتایج گوگل و Discover برایت نمایش داده میشود. افزودن از تنظیمات گوگل





