پرش به محتوای اصلی
پرش به محتوای مقاله

ایزوله‌های V8 در برابر Headless Chrome در معماری استخراج داده

·۱۲ مرداد ۱۴۰۵۱۴ دقیقه مطالعه
لوگوی گیت‌هاب و نام مخزن draco از کاربر 0xchasercat
لوگوی گیت‌هاب و نام مخزن draco از کاربر 0xchasercat
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

استفاده از ایزوله‌های V8 به‌جای Headless Chrome برای اجرای جاوااسکریپت صفحات وب؛ این یعنی دسترسی به محتوای پویا بدون سربار رم و پردازش یک مرورگر کامل.

تصور کنید یک برنامه‌نویس بخواهد هزاران صفحه وب را برای تغذیه یک مدل زبانی استخراج کند، اما با دیواری از CAPTCHAها و مصرف تصاعدی رم مواجه شود. اینجاست که Draco وارد می‌شود تا بازی را با سرعت خیره‌کننده ۳۰۰ میلی‌ثانیه‌ای تغییر دهد. ۳۰۰ میلی‌ثانیه؛ این تمام زمانی است که این استخراج‌کننده (Scraper) نوشته شده با زبان Rust برای استخراج یک مارک‌داون پاک از صفحات پیچیده وب نیاز دارد. در حالی که استخراج‌کننده‌های سنتی به مرورگرهای بدون سر (Headless Browsers) وابسته هستند که منابع سیستم را به‌شدت مصرف می‌کنند، Draco این سرعت را از طریق جایگزینی ناوگان مرورگر با یک ایزوله V8 سبک و درون-فرآیندی (in-process) به دست می‌آورد. این رویکرد بهینه‌سازی عملکرد یادآور تلاش‌های مشابه در ابزارهای تحلیل کد است، جایی که بازنویسی هسته Tree-sitter در Rust منجر به کاهش چشمگیر مصرف CPU شد.

بر اساس مستندات این پروژه، Draco یک ابزار استخراج داده (Web Scraping) است که برخلاف روش‌های سنتی، به‌جای به‌کارگیری ناوگان بزرگی از مرورگرهای سنگین، از یک ایزوله V8 (V8 Isolate) — شبیه به یک اتاقک کوچک و ایزوله در حافظه که فقط بخش‌های ضروری موتور مرورگر را اجرا می‌کند — استفاده می‌کند. استخراج داده از وب مدت‌هاست که یک توازن دشوار بین سرعت و قابلیت بوده است. کلاینت‌های HTTP ساده سریع هستند اما در برابر برنامه‌های تک‌صفحه‌ای (SPA) — وب‌سایت‌هایی که شبیه به اپلیکیشن‌های موبایل هستند و محتوایشان را در لحظه با جاوااسکریپت تولید می‌کنند — شکست می‌خورند. در مقابل، ابزارهایی مثل Playwright یا Puppeteer این صفحات را مدیریت می‌کنند اما مقدار عظیمی از رم را می‌بلند و به‌راحتی توسط سیستم‌های ضد-بات (Anti-bot) شناسایی می‌شوند. Draco این دوگانه را با پیاده‌سازی یک سیستم ارتقای پلکانی (Tiered Escalation System) می‌شکند.

معماری پنهان‌کاری

Draco برای دور زدن سیستم‌های حفاظتی از اثرانگشت TLS/JA4 استفاده می‌کند که دقیقاً مشابه اثرانگشت مرورگرهای واقعی است. طبق گزارش توسعه‌دهندگان، این مکانیزم با تقلید از دست‌دادن (Handshake) یک مرورگر واقعی، اجازه می‌دهد ابزار به صفحاتی دسترسی یابد که معمولاً کلاینت‌های برنامه‌نویسی معمولی را مسدود می‌کنند. این استراتژی برای عبور از سدهای امنیتی، شباهت زیادی به روش‌هایی دارد که در پروژه Fortress برای مهندسی معکوس موتور کرومیوم به کار گرفته شده است. این رویکرد باعث می‌شود ابزار از محرک‌های فوری که منجر به نمایش CAPTCHA یا خطاهای ۴۰۳ Forbidden می‌شوند، دوری کند. این یک جایگزین بسیار سبک‌تر برای سرویس‌هایی مثل Firecrawl یا Browserbase است و هیچ نیازی به محیط Node.js یا ناوگان مرورگر Chrome ندارد.

برای صفحات HTML استاندارد، فرآیند تنها یک دریافت (Fetch) با اثرانگشت و تجزیه (Parse) ساده است که معمولاً حدود ۳۰۰ میلی‌ثانیه زمان می‌برد. ابزار سپس محتوا را از طریق یک پیاده‌سازی بومی Rust از خط لوله مارک‌داون عبور می‌دهد. این فرآیند مشابه استخراج محتوای اصلی در Firecrawl است و از یک مبدل معادل Turndown/GFM برای تبدیل قطعی محتوا استفاده می‌کند.

جزئیات استخراج محتوا

هنگام استخراج یک صفحه، Draco سه خروجی اصلی تولید می‌کند:

  • مارک‌داون (Markdown): محتوای اصلی به مارک‌داون پاک تبدیل می‌شود که شامل عناوین، لیست‌ها، نقل‌قول‌های بلوکی و بلوک‌های کد حصاردار (Fenced Code Blocks) همراه با تگ‌های زبان است. این ابزار جداول GFM و لینک‌های مطلق‌سازی شده (Absolutized) تولید می‌کند. تمامی موارد زائد (Boilerplate) مانند نوارهای ناوبری، هدرها، بخش‌های کناری (Asides)، فوترها و تبلیغات حذف می‌شوند. همچنین اسکریپت‌ها، استایل‌ها و تصاویر base64 حذف می‌گردند تا هیچ نویزی به خروجی نهایی نشت نکند.
  • متا‌داده‌ها (Metadata): این بخش شامل عنوان صفحه، توضیحات، زبان، URL کانونی (Canonical) و Favicon است. Draco تمام تگ‌های og:* ،twitter:* و article:* را به همراه sourceURL ،statusCode و contentType ثبت می‌کند.
  • گزارش ردیابی و زمان‌بندی (Trace and Timing): یک گزارش دقیق نشان می‌دهد که دقیقاً کدام مراحل اجرا شده‌اند و توزیع میلی‌ثانیه‌ها در هر یک از این مراحل چگونه بوده است.

مدیریت جاوااسکریپت با ایزوله‌های V8

وقتی صفحه‌ای شناسایی شود که یک «پوسته نازک» (Thin Shell) است (یعنی محتوا تنها پس از اجرای JS ظاهر می‌شود)، Draco به سطح دوم (Tier 2) ارتقا می‌یابد. به‌جای بوت کردن یک مرورگر کامل، یک ایزوله V8 را از یک اسنپ‌شات موتور DOM که در زمان ساخت (Build-time) تهیه شده، در کمتر از ۱۰ میلی‌ثانیه بازسازی می‌کند.

  • رندر و سپس مارک‌داون (Render-then-Markdown): ایزوله، پوسته را هیدراته (Hydrate) کرده، DOM زنده را سریال‌سازی می‌کند و سپس <head> واقعی پوسته (شامل عنوان، Open Graph و کانونی) را روی <body> هیدراته شده می‌چسباند. سپس موتور محتوا مجدداً اجرا می‌شود. اگر صفحه‌ای دارای صفحات اسکلتی «در حال بارگذاری...» (Loading skeleton screens) باشد، Draco این حالت را به عنوان رندر ناقص تشخیص داده و طبق آن ارتقا می‌یابد تا خطوط جایگزین (Placeholder) از خروجی نهایی حذف شوند.

  • شنود زمان اجرا (Runtime Interception): این موتور می‌تواند درخواست‌های XHR/fetch ارسال شده توسط JS صفحه را شنود کند تا API واقعی داده‌های JSON را بیابد. در واقع ایزوله مانند یک «غیب‌بین» برای کشف API عمل می‌کند، نه یک رندرکننده بصری. درخواست‌های داده با یک استوب (Stub) مصنوعی پاسخ داده می‌شوند و JS صفحه هیچ دسترسی به میزبان (Host Bindings) ندارد.

  • عدم دسترسی به میزبان: برای امنیت، JS صفحه هیچ قابلیت ورودی/خروجی (I/O) ندارد؛ یعنی نمی‌تواند مستقیماً به فایل‌سیستم یا شبکه دسترسی داشته باشد. ایزوله اسکریپت‌های خارجی <script src> و <script type="module"> (شامل وارد کردنهای پویا) را به‌صورت همزمان از طریق یک کلاینت پنهان استخر شده (Pooled stealth client) اجرا می‌کند.

  • کش منابع (Resource Caching): زیر-منابع اسکریپتی از طریق یک کش تکه-بندی شده تغییرناپذیرِ سراسری-فرآیند (۵۱۲ مگابایت رم و ۲ گیگابایت دیسک) مدیریت می‌شوند. این امر تضمین می‌کند که یک تکه (Chunk) از یک SPA فقط یک‌بار در طول چندین استخراج دریافت شود و بارگذاری‌ها مانند پشته شبکه یک مرورگر در حلقه رویداد (Event Loop) ایزوله پخش شوند.

استخراج پیشرفته و کشف API

Draco فراتر از مارک‌داون، می‌تواند داده‌های ساختاریافته را با استفاده از یک رویکرد چندسطحی استخراج کند. ابزار از ارزان‌ترین سطحی که داده‌ها را ارائه دهد شروع کرده و در صورت نیاز ارتقا می‌یابد:

  • سطح ۰ (وضعیت تعبیه‌شده استاتیک): جست‌وجو برای __NEXT_DATA__ ،JSON-LD یا window.__NUXT__.
  • سطح ۱ (بازپخش Build-ID): دریافت مستقیم مسیرهای /_next/data/<buildId>/...json برای سایت‌های Next.js.
  • سطح ۲ (شنود زمان اجرا): بوت کردن ایزوله V8 درون-فرآیندی، اجازه دادن به JS برای هیدراته شدن، شنود fetch/XHR و بازپخش برنده با کلاینت پنهان.

کاربران با اجرای دستور draco scrape --format endpoints می‌توانند یک کاتالوگ رتبه‌بندی شده از APIهایی که یک صفحه استفاده می‌کند را مشاهده کنند. این به توسعه‌دهندگان اجازه می‌دهد دقیق‌ترین اندپوینتی که سایت برای داده‌های خود استفاده می‌کند را بیابند. هر اندپوینت دارای یک امتیاز است (هرچه بالاتر، احتمال اینکه API واقعی داده باشد بیشتر است) و یک پرچم replayable دارد که نشان می‌دهد آیا درخواست بدون نقض سیاست‌های ایمنی تغییر (Mutation-safety)، قابل بازپخش است یا خیر. ردیاب‌های تحلیلی (Analytics beacons) و دارایی‌های استاتیک در انتهای این لیست قرار می‌گیرند.

نصب و نیازمندی‌های ساخت

سریع‌ترین راه نصب Draco در لینوکس یا macOS استفاده از اسکریپت نصب است: curl -fsSL https://raw.githubusercontent.com/0xchasercat/draco/main/install.sh | sh. این اسکریپت به‌طور خودکار سیستم‌عامل و معماری را تشخیص داده، باینری را دانلود کرده و آن را به تنظیمات شل کاربر مانند .zshrc ،.bashrc یا .config/fish/config.fish اضافه می‌کند.

برای کسانی که می‌خواهند کد را از سورس با دستور cargo build --release بسازند، پیش‌نیازها شامل cmake ،یک کامپایلر C/C++ ،clang/libclang ،perl و pkg-config است. این موارد برای V8 و BoringSSL + bindgen در wreq مورد نیاز هستند.

  • دبیان/اوبونتو: apt install build-essential cmake clang libclang-dev perl pkg-config
  • فدورا: dnf install gcc gcc-c++ cmake clang clang-devel llvm-devel perl pkgconf
  • مک: Xcode Command Line Tools + brew install cmake

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

Draco چندین حالت استقرار برای جریان‌های کاری مختلف ارائه می‌دهد:

  • رابط خط فرمان (CLI): ابزاری مستقیم برای انتقال مارک‌داون به فایل‌ها. پرچم‌های رایج شامل --proxy برای پشتیبانی از SOCKS5 (مثلاً socks5://127.0.0.1:9050)، --delay برای رعایت ادب در درخواست‌ها (مثلاً 500 میلی‌ثانیه) و --tier-max برای محدود کردن نردبان ارتقا است. پرچم‌های پیشرفته شامل --extract <JSONPATH> ،--no-main-content ،--wait-for <ms> و --capture-window-ms <ms> هستند. کدهای خروج استاندارد شده‌اند: 0 برای موفقیت، 1 برای خطا، 2 برای پشتیبانی نشده و 3 برای needs_browser.
  • حالت دیمون (Daemon Mode): یک سرور HTTP دائمی (draco serve) که یک REST API سازگار با Firecrawl را روی پورت پیش‌فرض ۳۰۰۲ ارائه می‌دهد. این حالت از /v1/scrape ،/v1/map (کشف سریع سایت با ادغام sitemaps و لینک‌ها) و /v1/crawl (خزش BFS غیرهمزمان) پشتیبانی می‌کند. اندپوینت /v1/map فایل /sitemap.xml را با لینک‌های صفحه ادغام کرده و از فیلترینگ میزبان-یکسان و حذف تکراری‌ها استفاده می‌کند.
  • خزش و دسته‌بندی (Crawl and Batching): مسیر /v1/crawl از یک BFS محدود به میزبان-یکسان با حد پیش‌فرض ۱۰ (سقف ۱۰۰) و maxDepth برابر با ۲ استفاده می‌کند. مسیر /v1/batch/scrape لیست‌های URL را به‌صورت موازی پردازش می‌کند. هر دو از وب‌هوک‌ها برای رویدادهای started ،page ،completed و failed پشتیبانی می‌کنند، با تحویل سریع و تکرار در دقایق ۱، ۵ و ۱۵.
  • سرور MCP: یکپارچه‌سازی با پروتکل زمینهٔ مدل (Model Context Protocol) از طریق draco mcp. این به عامل‌های هوش مصنوعی در Claude Desktop یا Code اجازه می‌دهد از ابزارهایی مانند draco_scrape ،draco_discover و draco_search استفاده کنند. همچنین از جلسات وضعیت‌دار draco_interact از طریق اندپوینت POST /mcp دیمون پشتیبانی می‌کند.

جست‌وجوی وب و تعامل پویا

این ابزار شامل دستور draco search است که چندین موتور جست‌وجو را به‌صورت موازی کوئری می‌کند: DuckDuckGo (اندپوینت HTML)، Bing، Brave، Baidu، Yandex و ZapMeta. این ابزار از اجماع رتبه-معکوس (Reciprocal-rank consensus) برای ادغام نتایج استفاده می‌کند تا اگر یک موتور درخواست را مسدود کرد، موتورهای دیگر شکست را پوشش دهند. پاسخ یک آرایه تخت از عناوین، توضیحات و URLها است. کاربران می‌توانند نتایج را محدود کنند (پیش‌فرض ۵، حداکثر ۱۰۰) و scrapeOptions.formats را ارسال کنند تا هر URL نتیجه استخراج شده و فیلدهای سند روی آن ادغام شود.

برای جریان‌های پیچیده، draco interact جلسات وضعیت‌دار (Stateful) را فعال می‌کند. کاربران می‌توانند یک جلسه باز کنند، جاوااسکریپت دلخواه را در محدوده صفحه اجرا کنند، روی المان‌ها از طریق سلکتورها کلیک کنند و در حالی که کوکی‌ها در کل جریان حفظ می‌شوند، بین صفحات جابجا شوند. این نسخه-DOM از اکشن‌های مرورگر است. تابع exec ممکن است await کرده و مقادیر را تحت یک بودجه سریال‌سازی شده برگرداند؛ اگر بودجه exceeded شود، یک توصیف‌گر کوتاه‌شده (Truncation descriptor) بازگردانده می‌شود.

مدل امنیت و عملکرد

امنیت از طریق عدم دسترسی ایزوله V8 به قابلیت‌های میزبان مدیریت می‌شود. تنها عملیات‌های در دسترس JS صفحه، ثبت درخواست‌های شنود شده، بارگذاری تکه‌های اسکریپت، ثبت تشخیص‌ها، خواب (Sleep) و حل URLها است. هیچ دسترسی به شبکه، فایل‌سیستم یا فرآیند وجود ندارد. زندان سطح سیستم‌عامل قبلی (با استفاده از seccomp و Landlock) در نسخه ۰.۱۴ بازنشسته شد زیرا سربار IPC آن توان عملیاتی را محدود می‌کرد. امنیت فعلی بر روی ایزوله متمرکز است که در گزارش‌ها با نام runtime.sandbox شناخته می‌شود.

عملکرد از طریق یک ساختار خاص در Crateها بهینه شده است:

  • draco-types: قراردادهای انتقال داده (Wire) و نتایج.
  • draco-net: کلاینت HTTP پنهان TLS/JA4 از طریق wreq/BoringSSL.
  • draco-static: استخراج مارک‌داون و منطق JSON سطوح ۰ و ۱.
  • draco-runtime: ایزوله V8 سطح ۲ با موتور happy-dom.
  • draco-core: ماشین حالت ارتقا و کش تکه‌ها (Chunk cache).
  • draco-cli: رابط خط فرمان.

برای محیط‌های با رم محدود، یک ساخت سبک با استفاده از --no-default-features بخش V8 و axum را حذف می‌کند، که اجازه استخراج مارک‌داون پایه و استخراج JSON استاتیک را داده و اندازه باینری را کاهش می‌دهد. این تغییر نشان می‌دهد که صنعت در حال گذار از مدل «مرورگر به‌عنوان سرویس» به سمت «اجرای جراحی‌شده با ایزوله» است. با حذف رابط کاربری و سربارهای سطح سیستم‌عامل یک مرورگر، توسعه‌دهندگان می‌توانند عملیات استخراج را با کسری از هزینه‌های پردازشی قبلی مقیاس‌بندی کنند. در بنچمارک‌های محلی، هیدراتاسیون یک SPA در یک فرآیند گرم (Warm-process) در حدود ۱۵۰ میلی‌ثانیه پاسخ می‌دهد.

گام بعدی شما

  • اگر از Firecrawl یا Browserbase استفاده می‌کنید، Draco را در محیط محلی تست کنید تا کاهش هزینه‌های زیرساختی را بسنجید.
  • برای توسعه عامل‌های هوشمند، سرور MCP این ابزار را به Claude Desktop متصل کنید تا دسترسی مدل به وب سریع‌تر شود.
  • از دستور scrape --format endpoints برای مهندسی معکوس APIهای سایت‌های هدف استفاده کنید.

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است — به تحلیل ما درباره تراشه‌های Blackwell برای پردازش داده‌های حجیم مراجعه کنید.

چرا این موضوع مهم است؟

این ابزار با حذف لایه‌های اضافی مرورگر، سرعت استخراج داده را ۱۰ برابر کرده و هزینه‌های محاسباتی را به شدت پایین می‌آورد. تخصص در شبیه‌سازی اثرانگشت TLS/JA4 باعث می‌شود دسترسی به داده‌های وب بدون مسدود شدن توسط سیستم‌های ضد-بات ممکن شود.

تأثیر برای ایران

به دلیل ماهیت متن‌باز و اجرای محلی (Self-hosting)، توسعه‌دهندگان ایرانی می‌توانند بدون نیاز به پرداخت ارزی برای سرویس‌های ابری، سیستم‌های استخراج داده سریع و ضد-مسدودساز را پیاده کنند.

·نگاه ما
تحریریه دات‌هوش

جایگزینی مرورگرهای کامل با ایزوله‌های V8، نقطه پایان مدل‌های گران‌قیمت Browser-as-a-Service است. Draco ثابت می‌کند که برای استخراج داده، ما به رندر گرافیکی نیاز نداریم و فقط باید «منطق اجرای جاوااسکریپت» را شبیه‌سازی کنیم. این تغییر پارادایم، هزینه عملیاتی (OpEx) استخراج داده را برای لایه آموزش مدل‌های زبانی به‌شدت کاهش می‌دهد.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.