ProxynetProxynet

اسکرپینگ وب عاملی چیست و چگونه کار می‌کند؟

تاریخ انتشار:

13 دقیقه مطالعه

Acar Diveroli
نویسنده: Acar Diveroli
پنجره ایزومتریک با صفحه‌ای که عامل می‌بیند، کارت برنامه‌ای با گام‌های شماره‌دار و حجم شبح‌وار با خط‌چین در میان

پیش روی شما 200 سایت کوچک متفاوت است و باید از همه آن‌ها فیلدهای یکسانی — نام محصول، قیمت، وضعیت موجودی — جمع‌آوری شود. نوشتن اسکریپت برای هر سایت یعنی صدها گزینشگر؛ سپردن همه به یک API اسکرپینگ یعنی رکوردهای خالی برای بیشترشان، چون ساختارشان جور درنمی‌آید. وقتی همین کار را به یک عامل هوش مصنوعی می‌دهید، تصویر عوض می‌شود: عامل هر صفحه را خودش می‌خواند، با نگاه به همان صفحه تصمیم می‌گیرد داده کجاست و در صورت نیاز وارد یک پیوند می‌شود و برنامه‌اش را نیمه‌راه اصلاح می‌کند.

این، خلاصه یک‌جمله‌ای اسکرپینگ وب عاملی (agentic web scraping) است. در این نوشته توضیح می‌دهیم اسکرپینگ عاملی چیست، حلقه عامل در کار اسکرپینگ با کدام گام‌ها کار می‌کند، بلوک‌های سازنده سامانه کدام‌اند، یک اسکلت کد کارا و سمت هزینه و قابلیت اعتماد در برابر اسکریپت‌های مبتنی بر قانون و خطاهای معمول عامل. سمت «مسیر را چه کسی برمی‌گزیند» — خط لوله ثابتی که مدل فقط در گام تجزیه کار می‌کند — را در نوشته اسکرپر هوش مصنوعی بررسی کرده‌ایم.

اسکرپینگ وب عاملی چیست؟

برای جمع‌آوری داده از صفحه سه سطح وجود دارد و برای درست به کار بردن این اصطلاح باید هر سه را جدا نگه داشت. در سطح اول همه چیز در دست توسعه‌دهنده است: اسکریپت در کد می‌داند به کدام آدرس برود و از کدام عنصر داده بگیرد. در سطح دوم کار تجزیه به مدل سپرده می‌شود اما مسیر همچنان ثابت است: صفحه می‌آید، مدل فیلدها را استخراج می‌کند، جریان تمام می‌شود — موضوع نوشته اسکرپر هوش مصنوعی همین بود. در سطح سوم مدل وارد حلقه می‌شود: به کدام صفحه برویم، کدام دکمه را فشار دهیم، چه زمانی متوقف شویم، در زمان اجرا تصمیم‌گیری می‌شود. همین سطح سوم اسکرپینگ وب عاملی است.

با تفکیک نوشته Building effective agents از Anthropic بگوییم: جریان‌هایی که گام‌هایشان را کد می‌کشد جریان کاری‌اند؛ جریان‌هایی که مدل فرایند خودش را مدیریت می‌کند عامل‌اند. اسکرپینگ با عامل، همان تعریف است که به جمع‌آوری داده اعمال شده است. اگر تفاوت را در یک جمله فشرده کنیم: در اسکرپر هوش مصنوعی پاسخ پرسش «صفحه را چه کسی تجزیه می‌کند» مدل است؛ در اسکرپینگ عاملی پاسخ پرسش «مسیر را چه کسی برمی‌گزیند» هم به مدل منتقل می‌شود.

حلقه عامل در اسکرپینگ چگونه کار می‌کند؟

شیوه کلی کار عامل — درک، برنامه‌ریزی، اقدام، ارزیابی — و پایه نظری این حلقه موضوع نوشته عامل‌های هوش مصنوعی چگونه کار می‌کنند بود؛ تکرارش نمی‌کنیم و شکل مخصوص اسکرپینگ آن را می‌بینیم. در هر دور پنج گام می‌چرخد:

  1. درک. آنچه عامل «می‌بیند» پیکسل‌های پنجره مرورگر نیست، بلکه خلاصه ساخت‌یافته صفحه است: درخت دسترس‌پذیری، عنوان‌ها، فهرست پیوندها، فیلدهای فرم. این خلاصه وارد پنجره زمینه مدل می‌شود؛ کل HTML خام وارد نمی‌شود.
  2. برنامه‌ریزی. مدل با نگاه به هدف — «قیمت هر محصول این فهرست را استخراج کن» — اقدام بعدی را برمی‌گزیند: کلیک روی دکمه فیلتر، رفتن به صفحه دوم صفحه‌بندی یا تصمیم اینکه داده اکنون نمایان است.
  3. اقدام. اقدامی که مدل برمی‌گزیند یک فراخوانی ابزار است: مانند git(url)، tıkla(betimleme)، doldur(alan, değer). فراخوانی را در عمل مرورگر اجرا می‌کند؛ مدل فقط فرمان را می‌نویسد.
  4. استخراج. وقتی داده هدف نمایان شد، مدل فیلدها را مطابق شمایی که تعریف کرده‌اید پر می‌کند. این گام، گام تجزیه خط لوله ثابت است که درون عامل جا گرفته است.
  5. اعتبارسنجی و تکرار یا پایان. نوع‌ها و فیلدهای اجباری خروجی با کد بازرسی می‌شود؛ اگر چیزی کم باشد، مدل می‌بیند چه اطلاعاتی کم است و به صفحه مربوط برمی‌گردد. شرط توقفی مانند سقف گام، سقف هزینه یا تعداد صفحه نمی‌گذارد حلقه بی‌پایان ادامه یابد.

گام چهارم و پنجم نشان می‌دهند اسکرپینگ عاملی هم‌زمان با دو نظم جداگانه کار می‌کند: اعتماد نکردن به تصمیم‌ها و خروجی مدل هم‌زمان دو لایه کار اضافه می‌کند — یک لایه اعتبارسنجی و یک لایه توقف. اگر هیچ‌کدام نباشد، سامانه در حالی که «کار می‌کند» به نظر می‌رسد، بی‌سروصدا داده نادرست تولید می‌کند.

بلوک‌های سازنده

  • ابزار مرورگر. دست‌های عامل. یک کتابخانه اتوماسیون مانند Playwright درخت دسترس‌پذیری‌ای را که مدل می‌تواند ببیند و اقدام‌هایی را که می‌تواند به کار ببرد فراهم می‌کند؛ جزء آماده‌ای هم هست که این کار را به‌عنوان سرور MCP انجام می‌دهد. راه‌اندازی و فلگ‌های پروکسی آن را در نوشته Playwright MCP توضیح دادیم؛ خود پروتکل را به نوشته MCP چیست؟ می‌سپاریم.
  • شما و اعتبارسنجی. شمای JSON داده درخواستی، خروجی مدل را به یک قرارداد می‌بندد. بازرسی نوع، اجباری بودن و بازه در کد می‌ماند؛ رکورد مشکوک پیش از نوشته شدن در مخزن اصلی به صف جداگانه‌ای می‌رود.
  • نقطه توقف و حافظه. کارهای طولانی را می‌توان نیمه‌کاره قطع کرد؛ آدرس‌هایی که عامل گشته است، صفحه‌های کامل‌شده و رکوردهای جمع‌آوری‌شده بیرون نگه داشته می‌شوند. پنجره زمینه حافظه کوتاه‌مدت است؛ حافظه کاری 200 سایتی در پنجره مدل جا نمی‌شود، در فایل جا می‌شود.
  • مرزهای امنیتی. دامنه‌هایی که عامل می‌تواند باز کند، تعداد گامی که می‌تواند بردارد و ابزارهایی که می‌تواند فرابخواند از پیش محدود می‌شوند؛ محتوای صفحه‌ای که اسکرپ می‌کند به‌عنوان داده وارد مدل می‌شود، نه دستور. تمام این لایه، از فهرست مجاز و محدودیت نرخ گرفته تا پاک‌سازی تزریق، را در نوشته دسترسی امن LLM به وب ساخته‌ایم.

اسکلتی کوچک از یک عامل

پیش‌نویس Python زیر اسکلت مستقل از ارائه‌دهنده حلقه بالا را نشان می‌دهد. سمت مرورگر Playwright است؛ تابع model_cagir با کلاینت ارائه‌دهنده‌ای که به کار می‌برید پر می‌شود و از مدل یا یک اقدام یا خروجی هم‌خوان با شمای تعریف‌شده انتظار می‌رود.

python
import json
from playwright.sync_api import sync_playwright

PROXY = {"server": "http://pr.proxynet.io:8000",
         "username": "kullanici", "password": "parola"}
HEDEF = "https://example.com/urun-listesi"
SEMA = {"urun_adi": str, "fiyat": float, "stokta": bool}

def gozlemle(sayfa):
    # Ajanın gözü: ham HTML değil, sayfanın yapısal özeti.
    return sayfa.locator("body").aria_snapshot()

def model_cagir(gozlem, talimat):
    # Sağlayıcının resmî istemcisiyle doldurun. Modele gozlem + talimat
    # gönderilir; yanıt ya {"arac": ..., ...} ya da şemalı veridir.
    raise NotImplementedError("model çağrısı burada yapılır")

def dogrula(kayit):
    for alan, tur in SEMA.items():
        if not isinstance(kayit.get(alan), tur):
            raise ValueError(f"{alan} beklenen türde değil")
    return kayit

with sync_playwright() as p:
    tarayici = p.chromium.launch(proxy=PROXY)
    sayfa = tarayici.new_page()
    sayfa.goto(HEDEF)

    for adim in range(8):                       # durma koşulu: adım bütçesi
        karar = json.loads(model_cagir(gozlemle(sayfa),
                                       "Listedeki ürünleri çıkar."))
        if karar.get("arac") == "cikar":
            print(dogrula(karar["kayit"]))      # modele doğrudan güvenilmez
            break
        if karar["arac"] == "git":
            sayfa.goto(karar["url"])
        elif karar["arac"] == "tikla":
            sayfa.get_by_role(karar["rol"], name=karar["ad"]).click()

سه ویژگی این اسکلت باقی نوشته را خلاصه می‌کند: چیزی که مدل در هر دور می‌بیند HTML خام نیست، خلاصه ساخت‌یافته است؛ حلقه شرط توقف دارد؛ خروجی مدل پیش از عبور از dogrula هیچ‌جا نوشته نمی‌شود. همه گزینه‌های پروکسی Playwright را در نوشته پروکسی Playwright به‌صورت جدول داده بودیم.

در کنار اسکرپینگ مبتنی بر قانون

سه سطح را در یک جدول گذاشتن روشن می‌کند کدام کار به کدام سطح می‌رود:

معیاراسکریپت مبتنی بر قانوناسکرپر هوش مصنوعی (خط لوله ثابت)عامل (عاملی)
مسیر را چه کسی برمی‌گزیند؟توسعه‌دهنده، در کدتوسعه‌دهنده، در کدمدل، در زمان اجرا
تاب‌آوری در برابر تغییر سایتپایینبالا (در تجزیه)بالا (تجزیه + مسیر)
هزینه واحدتقریباً صفرتوکن برای هر صفحهتوکن برای هر دور؛ تعداد دورها متغیر
پیش‌بینی‌پذیریزیادمتوسطکم
کار مناسبصفحه‌های باثبات، حجم بالاصفحه‌های با ساختار متغیرکارهای چندمرحله‌ای که مسیرشان از پیش معلوم نیست

فرمول هزینه ساده است: کل دستمزد عامل حاصل‌ضرب تعداد دورها در توکن‌هایی است که در هر دور فرستاده و گرفته می‌شود. در اسکریپت مبتنی بر قانون این عدد نزدیک صفر است؛ در اسکرپر هوش مصنوعی تعداد دورها یکی است (یک فراخوانی تجزیه)؛ در کارهای عاملی تعداد دورها بسته به دشواری صفحه تغییر می‌کند — بیشتر صفحه‌ها در دو دور تمام می‌شوند، در حالی که کاری که از منوهای فیلتر می‌گذرد ممکن است شش تا هشت دور طول بکشد. به همین دلیل بودجه عامل به خود کار بسته نمی‌شود، به سقف گام بسته می‌شود: سامانه‌ای که بدون سقفی مانند for adim in range(8) در حلقه ساخته شود، می‌تواند روی یک صفحه خراب ساعت‌ها دور بزند. نحوه محاسبه هزینه‌های واحد سمت مدل را در نوشته وب اسکرپینگ با ⁦GPT-6 Astra⁩ جداگانه بررسی کرده بودیم.

خطاهای معمول عامل

خطاهای سامانه‌های عاملی با خطاهای اسکریپت متفاوت است؛ اسکریپت که بشکند می‌ایستد، عامل ممکن است بدون آنکه بشکند منحرف شود. مهم‌ترین حالت‌ها و جایی که ظاهر می‌شوند:

  • گرفتار شدن در حلقه. عامل میان همان دو صفحه رفت‌وآمد می‌کند یا پشت سر هم روی همان دکمه کلیک می‌کند. ظاهرش فربه شدن تعداد دورها و تکرار همان دنباله اقدام در ثبت‌هاست؛ چاره آن است که آدرس‌های بازدیدشده و اقدام‌ها نگه داشته شود و مدل در هر دور این فهرست را ببیند.
  • انحراف هدف. مدل هدف «قیمت استخراج کن» را به هدف «سایت را بگرد» تغییر می‌دهد؛ رکوردی نمی‌آید اما دور مصرف می‌شود. چاره آن است که هدف در زمینه هر دور تکرار شود و بر تعداد دورهای خالی سقف گذاشته شود.
  • پر کردن ساختگی. وقتی داده دیده نمی‌شود، مدل فیلدها را به احتمال پر می‌کند. تنها چاره لایه اعتبارسنجی است؛ صف رکوردهای مشکوک تنها جایی است که این حالت خطا را می‌گیرد.
  • انفجار هزینه. نتیجه ترکیبی حلقه و انحراف: کاری بدون سقف گام و سقف بودجه می‌تواند در یک اجرا بودجه روز را خرج کند. هر دو سقف در کد می‌مانند، نه در وجدان مدل.
  • تباهی بی‌سروصدا. پنهان‌کارترین حالت: عامل با تعداد کمی رکورد «موفق» برمی‌گردد. اگر سی سایت از 200 سایت خالی بماند و کسی نگاه نکرده باشد، خطا نه در گزارش‌گیر، در خود گزارش پنهان است. چاره هشدار زیر انتظار است: کاری که به زیر تعداد رکورد مورد انتظار برسد جداگانه علامت می‌خورد.

در سمت مسدودسازی چه چیزی تغییر کرد؟

ظاهر عامل نزد محافظت‌های ضدربات مثل هر اسکرپری است که مرورگر بدون رابط به کار می‌برد: اعتبار IP، سرعت درخواست و سیگنال‌های مرورگر به همان شکل سنجیده می‌شوند؛ هوش مدل در این سنجش‌ها دیده نمی‌شود. بر فراز آن، عامل بیشتر از خط لوله ثابت درخواست تولید می‌کند — برای هر تصمیم صفحه‌های میانی باز می‌شود و به آن‌ها برگردیده می‌شود. به همین دلیل در کارهای عاملی تدا نشست اهمیت می‌یابد: اینکه همان نشست گشت‌وگذار از همان آدرس خروج خارج شود یعنی درخواست‌های میانی به هم پیوند نمی‌خورند. پروکسی با نشست ثابت که در طول نشست آدرسی بی‌تغییر فراهم می‌کند به همین دلیل به کارهای عاملی می‌خورد؛ در فهرست‌های هدف گسترده، برای بزرگ کردن استخر از پروکسی مسکونی استفاده می‌شود.

در سمت چارچوب مشروع هم چیزی آسان نمی‌شود: عامل همچنان ملزم به پیروی از robots.txt و شرایط سایت است، محتوای پشت ورود به حساب و داده شخصی همچنان مسئولیتی جداگانه‌اند. به این‌ها یک سطر افزوده شد: سایت‌ها آغاز کرده‌اند عامل‌هایی را که هنگام آمدن خود را روشن اعلام می‌کنند (هویت ربات تأییدشده، درخواست‌های امضاشده) از عامل‌هایی که نمی‌کنند جدا کنند. چرایی مسدود شدن عامل‌ها و این نظم تازه را در نوشته چرا سایت‌ها عامل‌های خرید هوش مصنوعی را مسدود می‌کنند؟ بررسی کرده‌ایم؛ خلاصه این است: راه مشروع پرش از تشخیص نیست، حمل آشکار هویت است.

کاربردها

  • فهرست‌هایی که از منوی فیلتر می‌گذرند. در کاتالوگ‌هایی که گام‌های دسته، فیلتر و صفحه‌بندی در هر سایت متفاوت کار می‌کنند، عامل ساعت‌ها کار به‌ازای هر اسکریپت را به یک دستور می‌رساند؛ سمت اسکریپتی منطق صفحه‌بندی را در نوشته صفحه‌بندی (pagination) توضیح دادیم.
  • کاتالوگ‌های دم‌بلند. گرد آوردن صدها سایت فروشنده کوچک در یک شمای واحد از پروتوتایپ کردن با عامل زاده می‌شود، نه از نوشتن گزینشگر برای هر سایت؛ جدول تصمیم برای بزرگ کردن با خط لوله ثابت در نوشته اسکرپر هوش مصنوعی است.
  • راه‌اندازی نخست رصد قیمت و موجودی. در یک مجموعه هدف تازه، عامل نخستین کشف را انجام می‌دهد؛ اگر مسیر پیداشته باثبات باشد، همان کار به اسکریپت مبتنی بر قانون سپرده می‌شود؛ راه‌اندازی سرتاسری رصد در نوشته رصد قیمت رقبا است.
  • داده زنده برای کاربردهای مدل. عامل می‌تواند برای کاربرد مدل زبانی شما محتوای به‌روز صفحه‌ها را جمع کند و پاک‌شده‌اش را عرضه کند؛ در این کاربرد لایه دسترسی باید با قواعد نوشته دسترسی امن LLM به وب محدود شود.

چه زمانی عامل، چه زمانی اسکریپت؟

نیازپیشنهاد
یک صفحه باثبات؛ حجم بالااسکریپت مبتنی بر قانون؛ مدل لازم نیست
صفحه‌هایی که ساختارشان تغییر می‌کند؛ مسیر ثابتاسکرپر هوش مصنوعی (خط لوله ثابت + تجزیه با LLM)
کار چندمرحله‌ای با گام‌های از پیش نامعلومعامل، با سقف گام و بودجه
پروتوتایپ و کشف، کاری که بعداً بزرگ می‌شودکشف با عامل، سپردن مسیر پیداشته به اسکریپت
میلیون‌ها صفحه در روزنه عامل؛ خط لوله مبتنی بر قانون + مدل در استثنا

قاعده سطر آخر را چنین می‌توان خلاصه کرد: عامل به فاز کشف کار تعلق دارد، اسکریپت به فاز تکرار. تبدیل کردن مسیری را که عامل یک‌بار یافته (آدرس‌های پیموده‌شده، عناصر کلیک‌شده، مقادیر فرم ارسالی) به اسکریپت یعنی همان کار را از این پس بدون توکن تکرار کردن.

چارچوب حقوقی و اخلاقی

عامل حقوق اسکرپینگ را تغییر نمی‌دهد: robots.txt، شرایط سایت، داده شخصی و قواعد محتوای پشت ورود به حساب عیناً برقرارند؛ چارچوب را در نوشته آیا اسکرپینگ وب قانونی است؟ توضیح داده‌ایم. کار عاملی دو مسئولیت اضافه دارد. نخست، محتوای صفحه به API مدل فرستاده می‌شود: در صفحه‌هایی که داده شخصی دارند، خود این انتقال وارد مقررات می‌شود و پیش از ارسال پاک‌سازی لازم است. دوم، عامل فقط نمی‌خواند — کلیک می‌کند و می‌تواند فرم پر کند؛ اختیاراتی که به او داده می‌شود به همین دلیل باید با کمترین نیاز محدود شود و اقدام‌هایش ثبت شود.

سؤالات متداول

آیا اسکرپینگ وب عاملی جایگزین اسکرپینگ کلاسیک می‌شود؟

خیر. عامل در کارهایی ارزش تولید می‌کند که مسیرشان از پیش معلوم نیست؛ در صفحه باثبات و حجم بالا اسکریپت مبتنی بر قانون همچنان سریع‌تر، ارزان‌تر و پیش‌بینی‌پذیرتر است. چیدمان رایج کنار هم گذاشتن این دو است: عامل کشف می‌کند، اسکریپت تکرار می‌کند.

هزینه اسکرپینگ عاملی چگونه محاسبه می‌شود؟

حاصل‌ضرب تعداد دورها در هزینه توکن هر دور است. در اسکریپت مبتنی بر قانون تعداد دورها صفر، در اسکرپر هوش مصنوعی یکی است؛ در کارهای عاملی بسته به دشواری صفحه تغییر می‌کند. به همین دلیل بودجه به کار بسته نمی‌شود، به حلقه بسته می‌شود: سقف گام و سقف خرج در کد نوشته می‌شود.

در چه مواردی به کار گرفتن عامل منطقی است؟

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

داده‌ای که عامل جمع می‌کند چگونه اعتبارسنجی می‌شود؟

با اعتبارسنجی در خط لوله ثابت تفاوتی ندارد: شمای JSON، بازرسی نوع و فیلدهای اجباری، بازرسی بازه و مقایسه دستی با نمونه‌گیری. افزون بر این در کارهای عاملی تعداد رکورد مورد انتظار رصد می‌شود؛ کاری که زیر انتظار برود بی‌سروصدا نمی‌گذرد، جداگانه علامت می‌خورد.

سایت‌ها عامل‌ها را مسدود می‌کنند، راه مشروع چیست؟

پنهان نکردن هویت عامل، حمل آشکار آن؛ پیروی از شرایط سایت و robots.txt؛ به کار بردن هویت ربات تأییدشده، اگر اعطا شدنی باشد. چرایی مسدودسازی و نظم عامل‌های امضاشده را در نوشته عامل‌های خرید هوش مصنوعی توضیح داده‌ایم.

اسکرپینگ عاملی را با کدام ابزار باید آغاز کرد؟

برای سمت مرورگر، Playwright و رابطی که آن را به مدل وصل می‌کند: یا سرور MCP آماده یا حلقه خودتان. سمت مدل هر API با پشتیبانی خروجی ساخت‌یافته کافی است؛ برای شروع می‌توانید اسکلت بالا را همراه سقف گام به کار ببرید.

خلاصه

اسکرپینگ وب عاملی مدل را هم به مسیر و هم به تجزیه اسکرپینگ می‌کشاند: صفحه را مشاهده می‌کند، گام بعدی را تصمیم می‌گیرد، داده را مطابق شمای تعریف‌شده استخراج می‌کند. آنچه به دست می‌آورد جا شدن کارهای متغیر و چندمرحله‌ای در یک دستور است؛ بهایش هزینه‌ای است که با تعداد دورها بالا می‌رود و پیش‌بینی‌ناپذیری‌ای که باید با کد رام شود. اگر سقف گام، لایه اعتبارسنجی و ثبت رویداد سر جای خود باشند، عامل ابزار نیرومندی برای کشف است؛ کارهای باثبات و تکراری در اسکریپت می‌مانند. هنگام برپا کردن خط جمع‌آوری داده می‌توانید به راهکارهای اسکرپینگ داده ما نگاهی بیندازید.

پرسش از ChatGPTپرسش از Claude