اسکرپینگ وب در سال ۲۰۲۵ بیش از هر زمان دیگری به دو چیز نیاز دارد: انتخاب ابزار درست و استفادهی هدفمند. اگر دنبال استخراج سریع چند فیلد از صفحهای ساده هستید، نیازی نیست یک مرورگر کامل را بالا بیاورید. اگر با وباپلیکیشنی پویا طرفید که محتوایش پس از اجرای جاوااسکریپت بارگذاری میشود، کتابخانههای پارس ساده کافی نیستند. و اگر پروژهتان به دهها یا صدها هزار صفحه در روز میرسد، چارچوبی میخواهید که مدیریت صف، خطا، کش، و موازیسازی را بهصورت ساختاریافته انجام دهد.
در این راهنما سه ابزار شاخص پایتون را مرور میکنیم: Scrapy برای خزش مقیاسپذیر، Beautiful Soup برای پارس سادهی HTML (معمولاً همراه با Requests/HTTPX)، و Playwright برای رندر سمتکاربر و تعاملات پیچیده. معیارهای انتخاب، موارد استفادهی ایدهآل، مزایا و معایب هرکدام، و در انتها یک نقشهی تصمیمگیری ارائه میشود.
Scrapy یک فریمورک کامل برای خزش وب و استخراج داده است. نکتهی کلیدی آن این است که تنها یک کتابخانهی «پارس» نیست؛ بلکه همهچیز را از مدیریت درخواستها، اولویتبندی، کش، پایپلاینهای پاکسازی و خروجیگرفتن از دادهها تا میانافزارها برای هدرها و پروکسیها پوشش میدهد. برای پروژههای دادهمحور، پایدار و بزرگ انتخاب ایدهآل است.
چه زمانی از Scrapy استفاده کنیم؟ وقتی دهها/صدها هزار URL دارید، باید سرعت و مقاومت در برابر خطا بالا باشد، و میخواهید منطق استخراج در ساختاری تمیز و قابلآزمون بماند.
مزایا:
محدودیتها: رندر JS بهصورت پیشفرض ندارد (برای صفحات پویا معمولاً نیاز به ادغام با ابزارهای رندر مانند Playwright یا Splash دارید). منحنی یادگیری نسبت به کتابخانههای سبک بیشتر است.
نمونهکد کوتاه Scrapy
# نصب:
# pip install scrapy
# ساخت پروژه:
# scrapy startproject quotes
# cd quotes
# scrapy genspider quotes_spider quotes.toscrape.com
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes_spider"
start_urls = ["https://quotes.toscrape.com/"]
def parse(self, response):
for q in response.css(".quote"):
yield {
"text": q.css(".text::text").get(),
"author": q.css(".author::text").get(),
"tags": q.css(".tag::text").getall(),
}
next_page = response.css("li.next a::attr(href)").get()
if next_page:
yield response.follow(next_page, callback=self.parse)
این ساختار از همان ابتدا شما را به سمت یک معماری «قابل نگهداشت» هدایت میکند؛ چیزی که در پروژههای بزرگ ارزش طلایی دارد.
Beautiful Soup کتابخانهای است برای پارس HTML/XML که با نحو ساده و Pythonic نوشتن انتخابگرها و ناوبری در درخت DOM را آسان میکند. بهتنهایی درخواست HTTP نمیفرستد، بنابراین معمولاً همراه با requests
یا httpx
استفاده میشود.
چه زمانی از BS4 استفاده کنیم؟ وقتی صفحه استاتیک است (یا HTML نهایی بهسادگی در پاسخ برمیگردد)، استخراج چند فیلد محدود دارید، و میخواهید سریع نمونه اولیه بسازید یا تکهاسکریپتهای کوچک داشته باشید.
مزایا:
محدودیتها: برای حجم بالا طراحی نشده، مدیریت صف/بازپخش/کش داخلی ندارد، و رندر JS انجام نمیدهد.
نمونهکد کوتاه Beautiful Soup
# نصب:
# pip install beautifulsoup4 requests
import requests
from bs4 import BeautifulSoup
resp = requests.get("https://example.com/blog")
soup = BeautifulSoup(resp.text, "html.parser")
items = []
for card in soup.select(".post-card"):
items.append({
"title": card.select_one("h2").get_text(strip=True),
"url": card.select_one("a")["href"],
"summary": card.select_one(".excerpt").get_text(strip=True)
})
print(items)
اگر بعداً حجم بالا رفت، میتوانید همین منطق انتخابگرها را بهراحتی درون یک Spider در Scrapy منتقل کنید.
Playwright در اصل ابزار اتوماسیون مرورگر است (Chromium/Firefox/WebKit) که در حالت هدلس هم اجرا میشود. برای صفحاتی که داده پس از اجرای JS و درخواستهای XHR/Fetch ظاهر میشود—یا وقتی باید دکمهای کلیک، اسکرول بینهایت مدیریت، یا فرمی ارسال کنید—Playwright انتخابی قدرتمند است.
چه زمانی از Playwright استفاده کنیم؟ وقتی محتوای هدف بدون اجرای JS در HTML اولیه نیست، یا نیاز به شبیهسازی رفتار کاربر (کلیک، تایپ، انتظار برای سلکتور) دارید.
مزایا:
محدودیتها: سنگینتر و کندتر از رویکردهای بدون مرورگر است؛ نیاز به منابع بیشتر دارد. برای مقیاس بالا معمولاً باید صفبندی، کانتینرسازی و مدیریت همزمانی را جداگانه طراحی کنید.
نمونهکد کوتاه Playwright
# نصب:
# pip install playwright
# playwright install
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com/app", wait_until="networkidle")
# مثال: ورود و استخراج داده
# page.fill("#username", "user"); page.fill("#password", "pass"); page.click("text=Login")
page.wait_for_selector(".row")
data = [el.inner_text() for el in page.query_selector_all(".row .title")]
print(data)
browser.close()
robots.txt
احترام بگذارید و نرخ درخواستها را کنترل کنید. این متن مشاورهی حقوقی نیست.برای یک خزندهی قیمت فروشگاهها: با BS4 نمونه کوچک بزنید، بعد با Scrapy به چندین دامنه توسعه دهید، سیستم صف و ذخیرهسازی خروجی را اضافه کنید، و تنها برای صفحاتی که محتوای قیمت با JS رندر میشود Playwright را وارد کنید. این رویکرد هزینهی اجرا را پایین نگه میدارد و در عین حال پوشش کامل میدهد.
lxml
بهعنوان پارسر سریعتر کنید (pip install lxml
).wait_for_selector
یا"wait_until="networkidle
استفاده کنید تا با DOM پایدار کار کنید.یک قاعدهی ساده اما قدرتمند: ساده شروع کنید، فقط در صورت نیاز پیچیده شوید. Beautiful Soup برای اسکریپتهای سبک و سریع، Scrapy برای سیستمهای بالغ و در مقیاس، و Playwright برای جاوااسکریپت و تعاملات پیچیده. با ترکیب هوشمندانهی این سه، تقریباً تمام سناریوهای متداول اسکرپینگ وب را پوشش میدهید.