استخراج البيانات المدعومة بالذكاء الاصطناعي وتجميع الويب باستخدام OpenClaw
كاشطات الويب التقليدية هشة. وهي تعتمد على محددات CSS وأنماط XPath التي تنقطع في اللحظة التي يعيد فيها الموقع تصميم تخطيطه. لا يمكنها التكيف مع المحتوى الديناميكي الذي يتم تحميله بواسطة أطر عمل JavaScript. إنها تفشل بصمت عند مواجهة اختبارات CAPTCHA، أو تحديد المعدل، أو كتل IP. يتطلب الحفاظ على أسطول الكاشطة اهتمامًا مستمرًا مع تغير المواقع المستهدفة - وهي تكلفة غالبًا ما تتجاوز قيمة البيانات التي يتم استخراجها.
تختلف عوامل استخراج البيانات في OpenClaw. فهي تجمع بين أتمتة المتصفح والفهم البصري والتحليل المستند إلى LLM لاستخراج البيانات من مواقع الويب دون الاعتماد على محددات هشة. عندما يغير موقع ما تخطيطه، يتكيف الوكيل. عندما يواجه اختبار CAPTCHA، فإنه يتصاعد بدلاً من الفشل بصمت. والنتيجة هي خط أنابيب لاستخراج البيانات يكون من حيث الحجم أكثر قابلية للصيانة من الكاشطات التقليدية.
الوجبات الرئيسية
- يستخدم وكلاء الاستخراج في OpenClaw أتمتة المتصفح (الكاتب المسرحي) للمحتوى الذي يتم عرضه بواسطة JavaScript، مما يزيل الفجوة بين ما يراه المستخدمون وما يمكن لأدوات الكشط الوصول إليه.
- يقوم التحليل المستند إلى LLM باستخراج البيانات المنظمة من HTML غير المنظم بدون محددات CSS - يفهم الوكيل المحتوى لغويًا، وليس موضعيًا.
- تدوير الوكيل المدمج، وطلب التوزيع العشوائي لبصمات الأصابع، ومعالجة تحديد المعدل لإجراءات مكافحة الروبوتات دون بنية تحتية إضافية.
- يؤدي استخراج المخطط أولاً إلى إنتاج مخرجات مكتوبة ومتحقق من صحتها، ولم تعد هناك حاجة للتعامل مع البيانات المسروقة الجزئية أو المشوهة.
- يقوم وكيل الاستخراج بمراقبة تغييرات الموقع والتنبيهات عندما تتغير بنية البيانات أو توفرها بشكل كبير.
- تم تضمين حواجز الحماية الأخلاقية في: الامتثال لملف robots.txt، واحترام الحد الأقصى للمعدل، ونقاط التفتيش الخاصة بمراجعة شروط الخدمة.
- يتم تنظيف البيانات المستخرجة وتطبيعها وتسليمها إلى مستودع البيانات أو واجهة برمجة التطبيقات (API) أو التطبيق النهائي تلقائيًا.
- تقوم ECOSIRE ببناء وإدارة خطوط أنابيب استخراج البيانات المخصصة لمعلومات السوق والمراقبة التنافسية وتطبيقات البحث.
الهندسة المعمارية: كيف يقوم OpenClaw باستخراج البيانات
يحتوي مكدس استخراج البيانات على أربع طبقات:
Target URL(s)
↓
[ Browser Agent ] — navigation, rendering, interaction
↓
[ Parser Agent ] — LLM-based content extraction
↓
[ Validation Agent ] — schema validation, normalization
↓
[ Delivery Agent ] — destination write (warehouse, API, file)
يتعامل وكيل المتصفح مع طلبات HTTP وعرض JavaScript. يقوم Parser Agent باستخراج المعنى من HTML المعروض. يقوم وكيل التحقق بفرض الامتثال للمخطط وتطبيع القيم. يقوم وكيل التسليم بكتابة البيانات المستخرجة إلى الوجهة المستهدفة.
وكيل المتصفح: عرض ما يراه المستخدمون
لا يمكن استخلاص المواقع ذات الاستخدام المكثف لجافا سكريبت (المنتجعات الصحية، والتمرير اللانهائي، والمحتوى المشروط) بطلبات HTTP البسيطة. يستخدم وكيل المتصفح Playwright لعرض الصفحات تمامًا كما يفعل المتصفح، ثم يعرض DOM المعروض بالكامل إلى Parser Agent.
export const RenderPage = defineSkill({
name: "render-page",
tools: ["browser", "proxy"],
async run({ input, tools }) {
const proxyConfig = await tools.proxy.getNextProxy({ country: input.targetCountry });
const page = await tools.browser.newPage({
proxy: proxyConfig,
userAgent: getRandomUserAgent(),
viewport: { width: 1440, height: 900 },
locale: "en-US",
timezoneId: "America/New_York",
});
await page.setExtraHTTPHeaders({
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
});
const response = await page.goto(input.url, { waitUntil: "networkidle", timeout: 30_000 });
if (response.status() === 429) {
throw new SkillError("RATE_LIMITED", "Target site returned 429. Backing off.", { retryAfterMs: 60_000 });
}
// Execute interaction steps if defined (click "Load More", handle cookie banners, etc.)
for (const step of input.interactionSteps ?? []) {
await executeInteractionStep(page, step);
}
const html = await page.content();
const screenshot = await page.screenshot({ type: "png" }); // For visual verification
await page.close();
return { html, screenshot, url: page.url(), statusCode: response.status() };
},
});
طلب التوزيع العشوائي لبصمات الأصابع: يقوم وكيل المتصفح بتدوير وكلاء المستخدم، وأحجام إطار العرض، ورؤوس HTTP لتجنب الحظر القائم على بصمات الأصابع. يتم استخلاص ملفات تعريف بصمات الأصابع من مكتبة منسقة من توقيعات المتصفح الواقعية.
تدوير الوكيل: تحتفظ أداة الوكيل بمجموعة من الوكلاء السكنيين ووكلاء مراكز البيانات المنظمين حسب الموقع الجغرافي. فهو يختار الوكلاء بناءً على متطلبات الوصول الجغرافي للموقع المستهدف ويقوم بتدويرهم لتوزيع الطلبات عبر عناوين IP.
خطوات التفاعل: تتطلب العديد من المواقع التفاعل قبل أن يصبح المحتوى مرئيًا—النقر على "قبول ملفات تعريف الارتباط"، والتمرير لبدء التحميل البطيء، والنقر على عناصر التحكم في ترقيم الصفحات. يتم تحديد خطوات التفاعل بشكل تصريحي:
{
"interactionSteps": [
{ "type": "click", "selector": "[data-testid='cookie-accept']", "optional": true },
{ "type": "scroll", "direction": "down", "pixels": 2000 },
{ "type": "wait", "milliseconds": 2000 },
{ "type": "click", "text": "Load more results", "optional": true }
]
}
وكيل المحلل اللغوي: استخراج الدلالات بدون محددات
المحلل اللغوي هو المكان الذي تظهر فيه ميزة الذكاء الاصطناعي لـ OpenClaw بشكل أكبر. بدلاً من محددات CSS الهشة، يرسل Parser Agent HTML المقدم وتعريف المخطط إلى LLM، الذي يستخرج الحقول المطلوبة باستخدام الفهم الدلالي.
export const ExtractStructuredData = defineSkill({
name: "extract-structured-data",
tools: ["llm"],
async run({ input, tools }) {
// Clean HTML for LLM consumption (strip scripts, styles, non-content)
const cleanedHtml = cleanHtmlForExtraction(input.html, {
stripTags: ["script", "style", "noscript", "iframe"],
preserveAttributes: ["href", "src", "data-price", "data-sku"],
maxLength: 50_000, // LLM context limit
});
const extractedData = await tools.llm.extract({
content: cleanedHtml,
schema: input.extractionSchema,
instructions: `Extract the requested fields from the HTML. For prices, include the numeric value only (no currency symbols). For dates, use ISO 8601 format. If a field is not present on the page, return null for that field.`,
});
return { data: extractedData, sourceUrl: input.url, extractedAt: new Date().toISOString() };
},
});
تعريف مخطط الاستخراج: يتم تعريف المخططات بتنسيق مخطط JSON، مما يوفر إرشادات دقيقة للكتابة في LLM:
{
"type": "object",
"properties": {
"productName": { "type": "string", "description": "Full product name including model/variant" },
"price": { "type": "number", "description": "Current selling price, numeric only" },
"originalPrice": { "type": ["number", "null"], "description": "Original price before discount, or null if not on sale" },
"availability": { "type": "string", "enum": ["in_stock", "out_of_stock", "limited", "preorder"] },
"rating": { "type": ["number", "null"], "description": "Average rating out of 5, or null if no ratings" },
"reviewCount": { "type": ["integer", "null"] },
"sku": { "type": ["string", "null"] }
},
"required": ["productName", "price", "availability"]
}
يملأ LLM كل حقل بناءً على فهمه الدلالي لمحتوى الصفحة. تؤدي الحقول المطلوبة الغائبة إلى فشل الاستخراج بدلاً من القيمة الخالية الصامتة.
إدارة الزحف: التنقل في المواقع متعددة الصفحات
يتطلب استخراج البيانات الأكثر فائدة التنقل عبر صفحات متعددة: قوائم المنتجات المقسمة إلى صفحات، والتسلسلات الهرمية للفئات، والمقالات متعددة الصفحات. يقوم مدير الزحف بتنسيق وكلاء المتصفح والمحلل عبر الموقع.
export const CrawlProductListing = defineSkill({
name: "crawl-product-listing",
tools: ["browser", "queue", "storage"],
async run({ input, tools }) {
let pageUrl: string | null = input.startUrl;
const allProducts = [];
let pageNumber = 1;
while (pageUrl && pageNumber <= input.maxPages) {
const rendered = await tools.browser.render(pageUrl, { interactionSteps: input.interactionSteps });
const products = await extractProductsFromPage(rendered.html, input.extractionSchema);
allProducts.push(...products);
// Find the "Next" page URL
pageUrl = extractNextPageUrl(rendered.html, input.paginationPattern);
pageNumber++;
// Respect crawl rate — be a polite scraper
await sleep(input.delayBetweenPagesMs ?? 2000);
}
await tools.storage.put(`crawls/${Date.now()}-products.json`, JSON.stringify(allProducts));
return { productCount: allProducts.length, pagesProcessed: pageNumber - 1 };
},
});
يحترم مدير الزحف robots.txt بشكل افتراضي. قبل بدء الزحف، يقوم بجلب ملف robots.txt الخاص بالموقع المستهدف وتحليله والتحقق من السماح بالمسارات المستهدفة لوكيل المستخدم الذي تم تكوينه. يتم حظر عمليات الزحف التي تحاول الوصول إلى المسارات غير المسموح بها ويتم إرسال تنبيه إلى المشغل.
التعامل مع تدابير مكافحة الروبوتات
تستخدم أنظمة مكافحة الروبوتات الحديثة (Cloudflare، وAkamai Bot Manager، وPerimeterX) إشارات سلوكية لتمييز البشر عن الروبوتات. يستخدم وكيل الاستخراج عدة تقنيات للظهور كحركة مرور شرعية للمتصفح:
محاكاة حركة الماوس: تحتوي جلسات المتصفح الحقيقية على حركات غير خطية للماوس. يحاكي الوكيل مسارات المؤشر الواقعية بمنحنيات السرعة الطبيعية قبل النقر على الأهداف.
اختلاف التوقيت: يتم تأخير الطلبات بفواصل زمنية عشوائية مأخوذة من توزيع تمت معايرته ليناسب سلوك التصفح البشري، وليس بفواصل زمنية موحدة أو حتمية.
إدارة ملفات تعريف الارتباط: يتم الاحتفاظ بملفات تعريف الارتباط التي تحددها أنظمة مكافحة الروبوتات وإرسالها في طلبات لاحقة، تمامًا كما يفعل المتصفح.
إكمال تحدي JavaScript: بالنسبة للمواقع التي تستخدم تحديات JavaScript (التحقق من إمكانيات واجهة برمجة تطبيقات المتصفح، وتنفيذ ألغاز الحوسبة)، تمر بيئة المتصفح الكاملة بعمليات التحقق هذه تلقائيًا.
بالنسبة للمواقع التي تحتوي على بوابات CAPTCHA، يكون للوكيل مساران:
- تكامل الخدمة: قم بتوجيه اختبارات CAPTCHA إلى خدمة حل اختبار CAPTCHA بمساعدة الإنسان (2captcha، Anti-Captcha) عندما يكون الحل غير التفاعلي مقبولاً.
- التصعيد البشري: قم بإيقاف مهمة الاستخراج مؤقتًا، وقم بتنبيه المشغل البشري للتنقل يدويًا بعد اختبار CAPTCHA، والاستئناف من الصفحة التالية.
التحقق من صحة المخطط وتطبيع البيانات
البيانات الأولية المستخرجة صاخبة. تأتي الأسعار بتنسيقات مختلفة (1,299.99 دولارًا، 1299.99، 1.299.99 للتنسيقات الأوروبية). تظهر التواريخ بكل تنسيق يمكن تخيله. تحتوي أسماء المنتجات على أخطاء في الكتابة بالأحرف الكبيرة والتشفير بشكل غير متناسق. يقوم وكيل التحقق بتطبيع جميع القيم قبل أن تصل إلى طبقة التسليم.
export const NormalizeExtractedData = defineSkill({
name: "normalize-extracted-data",
async run({ input }) {
const normalized = input.data.map((record) => ({
...record,
price: parseFloat(String(record.price).replace(/[^0-9.]/g, "")),
originalPrice: record.originalPrice
? parseFloat(String(record.originalPrice).replace(/[^0-9.]/g, ""))
: null,
productName: record.productName.trim().replace(/\s+/g, " "),
extractedAt: new Date(record.extractedAt).toISOString(),
availability: normalizeAvailability(record.availability),
}));
// Validate against schema
const validation = validateAgainstSchema(normalized, input.outputSchema);
const valid = normalized.filter((_, i) => validation[i].valid);
const invalid = normalized.filter((_, i) => !validation[i].valid);
return { valid, invalid, validCount: valid.length, invalidCount: invalid.length };
},
});
تتم كتابة السجلات غير الصالحة (الحقول المطلوبة المفقودة والقيم التي لا يمكن تطبيعها) إلى مخزن استثناءات منفصل للمراجعة بدلاً من إسقاطها بصمت.
التسليم: الحصول على البيانات أينما تريد
يكتب وكيل التسليم البيانات المقيسة إلى الوجهة التي تم تكوينها:
مستودع البيانات: إدراج دفعة إلى BigQuery أو Snowflake أو Redshift مع تعيين أعمدة مطابق للمخطط. مقسمة حسب تاريخ الاستخراج للاستعلام الفعال.
REST API: النشر إلى نقطة نهاية API الداخلية للاستهلاك في الوقت الفعلي. يدعم إعادة المحاولة على 5xx ويتضمن التراجع الأسي.
S3 / Cloud Storage: اكتب بتنسيق Parquet أو JSON للمعالجة النهائية عبر مسارات التحليلات.
قاعدة البيانات: قم بالترقية إلى PostgreSQL أو MySQL أو MongoDB مع حل تعارض قابل للتكوين (التحديث عند المطابقة، أو التخطي عند المطابقة، أو الخطأ عند المطابقة).
كشف التغيير ومراقبته
المواقع تغير هيكلها. يقوم المنافس بإعادة تصميم صفحات منتجاته. يقوم المورد بتحديث تنسيق التسعير الخاص به. يحتاج خط الاستخراج إلى اكتشاف هذه التغييرات والتنبيه قبل أن تتدهور جودة البيانات.
يعمل وكيل المراقبة يوميًا ويقارن مخرجات الاستخراج الحالية بخط الأساس الإحصائي:
- معدل التغطية الميدانية (ما هي النسبة المئوية للسجلات التي تحتوي على قيم غير فارغة لكل حقل)
- تغييرات توزيع القيمة (نطاقات الأسعار ونسب التوفر)
- معدل نجاح الاستخراج (ما هي النسبة المئوية لمحاولات الزحف التي تنتج سجلات صالحة)
تؤدي الانحرافات الكبيرة إلى إطلاق تنبيه مع عينة من المخرجات المتغيرة للمراجعة البشرية.
الأسئلة المتداولة
هل يعتبر تجريف الويب قانونيًا؟
تعتمد شرعية تجريف الويب على الولاية القضائية والبيانات التي يتم نسخها وشروط خدمة الموقع المستهدف. يُسمح عمومًا بالاطلاع على البيانات العامة (أسعار المنتجات، ومعلومات الاتصال المدرجة علنًا، والمقالات الإخبارية المنشورة) في معظم الولايات القضائية، وفقًا لشروط خدمة الموقع. إن التهرب من المصادقة، أو الوصول إلى البيانات الشخصية، أو التحايل على تدابير الحماية التقنية يثير مخاوف قانونية وأخلاقية. توصي ECOSIRE بالحصول على مراجعة قانونية لحالة الاستخدام المحددة والمواقع المستهدفة قبل نشر خطوط أنابيب استخراج الإنتاج. يتضمن OpenClaw الامتثال لملف robots.txt وتحديد المعدل بشكل افتراضي كحواجز حماية أخلاقية أساسية.
كيف يتعامل النظام مع المواقع التي تتطلب تسجيل الدخول للوصول إلى البيانات؟
بالنسبة للمواقع التي تمتلك مؤسستك فيها بيانات اعتماد شرعية (بوابة الموردين الخاصة بك، وخدمات مراقبة أسعار المنافسين التي تشترك فيها، والمواقع الشريكة)، يمكن للوكيل تسجيل الدخول باستخدام بيانات الاعتماد المكونة المخزنة في مدير الأسرار. تتم معالجة تفاعل تسجيل الدخول بواسطة وكيل المتصفح باستخدام نظام خطوات التفاعل. يتم الاحتفاظ بملفات تعريف الارتباط للجلسة وتحديثها تلقائيًا. بالنسبة للمواقع التي تتطلب مصادقة متعددة العوامل، يدعم الوكيل MFA المستند إلى TOTP باستخدام سر TOTP قابل للتكوين.
ما هو ضمان حداثة البيانات للبيانات المسروقة؟
تعتمد حداثة البيانات على جدول الزحف الخاص بك. يدعم OpenClaw جداول الزحف بدءًا من الوقت الفعلي (الزحف المستمر مع تحديد المعدل) وصولاً إلى اليومي أو الأسبوعي أو عند الطلب. بالنسبة لبيانات الأسعار التنافسية، تعد عمليات الزحف كل ساعة أو مرتين يوميًا أمرًا شائعًا. بالنسبة لبيانات أبحاث السوق التي تتغير ببطء، يكفي أن تكون يومية أو أسبوعية. يقوم عامل الاستخراج بوضع الطوابع الزمنية على كل سجل مع وقت الاستخراج حتى يتمكن المستهلكون من تقييم مدى نضارته.
هل يستطيع النظام التعامل مع واجهات برمجة التطبيقات المرقّمة وكذلك صفحات الويب؟
نعم. يتعامل وكيل المتصفح مع صفحات الويب؛ يتعامل وكيل استخراج API مع واجهات برمجة تطبيقات REST وGraphQL المرقمة. بالنسبة لواجهات برمجة التطبيقات التي تُرجع JSON منظم، يتم استبدال Parser Agent بخطوة أبسط لتعيين المخطط والتي تقوم بتعيين حقول استجابة API إلى مخطط الإخراج. يتعامل مدير الزحف مع ترقيم الصفحات عبر رؤوس الارتباط، وترقيم الصفحات المستند إلى المؤشر، وترقيم الصفحات بحدود الإزاحة، وأنماط ترقيم الصفحات المستندة إلى الرمز المميز.
كيف تتعامل مع المحتوى الديناميكي الذي يتم تحميله بشكل غير متزامن بعد عرض الصفحة الأولية؟
يدعم وكيل المتصفح الانتظار الخامل للشبكة - فهو ينتظر حتى لا يتم تقديم أي طلبات شبكة جديدة لمدة 500 مللي ثانية قبل استخراج محتوى الصفحة. بالنسبة لاستدعاءات API المحددة التي تقوم بتحميل البيانات الهامة، يمكنك تكوين الوكيل لاعتراض استجابات الشبكة واستخراج البيانات مباشرة من حمولة API بدلاً من HTML المقدم، وهو أسرع وأكثر موثوقية من تحليل HTML.
الخطوات التالية
تعتبر البيانات أحد الأصول التنافسية، ولكن فقط إذا كان بإمكانك الوصول إليها بشكل موثوق وعلى نطاق واسع. توفر عوامل استخلاص البيانات في OpenClaw الموثوقية والقدرة على التكيف والتحليل المدعوم بالذكاء الاصطناعي الذي لا يمكن للكاشطات التقليدية الهشة مطابقته.
تشتمل خدمة ECOSIRE [خدمة OpenClaw Custom Skills] (/services/openclaw/custom-skills) على تصميم خط أنابيب استخراج البيانات وتنفيذه لمعلومات السوق والمراقبة التنافسية وتتبع الأسعار وحالات استخدام جمع البيانات البحثية. يقوم فريقنا بتصميم خطوط أنابيب الاستخراج التي تكون قوية وقابلة للصيانة وسليمة من الناحية الأخلاقية.
اتصل بـ ECOSIRE لمناقشة متطلبات استخراج البيانات الخاصة بك والحصول على اقتراح تنفيذ مخصص.
بقلم
ECOSIRE Research and Development Team
بناء منتجات رقمية بمستوى المؤسسات في ECOSIRE. مشاركة رؤى حول تكاملات Odoo وأتمتة التجارة الإلكترونية وحلول الأعمال المدعومة بالذكاء الاصطناعي.
مقالات ذات صلة
AI-Powered Accounting Automation: What Works in 2026
Discover which AI accounting automation tools deliver real ROI in 2026, from bank reconciliation to predictive cash flow, with implementation strategies.
Payroll Processing: Setup, Compliance, and Automation
Complete payroll processing guide covering employee classification, federal and state withholding, payroll taxes, garnishments, automation platforms, and year-end W-2 compliance.
AI Agents for Business Automation: The 2026 Landscape
Explore how AI agents are transforming business automation in 2026, from multi-agent orchestration to practical deployment strategies for enterprise teams.