استخراج بيانات من صفحة ويب بمحدد CSS
أداة الاستخراج بمحدد CSS تقرأ صفحة ويب وتستخرج فقط العناصر المطابقة لمحدد تحدده أنت مسبقًا، كسعر منتج أو عنوان قسم. تناسب من يعرف بنية الصفحة بدقة ويحتاج نتيجة ثابتة قابلة للتكرار على صفحات مشابهة، دون تكلفة معالجة ذكاء اصطناعي لا يحتاجها.
شغّلها أونلاين
شغّل هذه المهمة على خوادمنا باستخدام حسابك. الأدوات المجانية تعمل داخل متصفحك، أما هذه فتُخصم من رصيدك في KIT حسب السعر الموضّح أعلاه.
متى يناسبك محدد CSS لا الذكاء الاصطناعي
إن كانت بنية الصفحة معروفة وثابتة — كموقع متجر واحد يستخدم نفس القالب لكل صفحاته — فمحدد CSS دقيق يعطي نتيجة موثوقة ومتوقعة في كل مرة، وأسرع وأرخص من استخراج بالذكاء الاصطناعي. الذكاء الاصطناعي يفيد أكثر عند اختلاف تصميم كل صفحة عن الأخرى، لا عند تكرار نفس البنية بدقة، فلا داعي لدفع تكلفة إضافية على فهم لا تحتاجه أصلًا حين تكون البنية معروفة سلفًا.
كيف تكتب المحدد
يُكتب المحدد بصيغة CSS قياسية كما في تطوير الويب: اسم صنف، معرّف فريد، أو مسار داخل بنية الصفحة. يمكن تحديد عدة محددات في طلب واحد لاستخراج أكثر من حقل معًا — كعنوان المنتج وسعره في نفس الطلب — بدل إرسال طلب منفصل لكل حقل، مما يوفر عدد الطلبات المطلوبة لجمع بيانات صفحة واحدة كاملة بدل تفكيكها لطلبات منفصلة لكل حقل على حدة.
دقة النتيجة وحدودها
تعيد الأداة نص العنصر المطابق تمامًا كما يظهر في الصفحة؛ إن تغيّر تصميم الموقع لاحقًا وتبدّل اسم الصنف المستخدم، يتوقف المحدد القديم عن العمل ويحتاج تحديثًا. هذه هي الميزة والقيد معًا: دقة عالية طالما بنية الصفحة ثابتة، وحاجة لمراجعة دورية إن غيّر الموقع تصميمه لاحقًا دون إشعار مسبق بذلك التغيير الذي قد يمر دون انتباه لفترة طويلة. لهذا يُنصح بفحص المحدد من وقت لآخر على عيّنة صغيرة.
السعر
نحو $0.041 لكل صفحة بغض النظر عن عدد المحددات المطلوبة منها، وتعمل الأداة من هذه الصفحة أو عبر الـAPI لمن يستخرج بيانات مئات الصفحات المتشابهة آليًا. هذا السعر الثابت يسهّل حساب تكلفة مراقبة عشرات الصفحات بمحدد واحد بدقة مسبقة قبل بدء أي مهمة جمع بيانات كبيرة تمتد لأسابيع أو أشهر متواصلة دون تجاوز الميزانية المرصودة أو مفاجآت غير محسوبة في الفاتورة.
حالات الاستخدام
متجر يراقب سعر منافس محدد يوميًا
يستخرج تاجر تجزئة سعر منتج واحد من صفحة منافس معروفة البنية يوميًا، بمحدد CSS ثابت يوفر عليه فتح الصفحة يدويًا كل مرة.
مطور يبني قائمة أسعار من موقع مورد
يستخرج عبدالله المنصوري أسماء وأسعار خمسين منتجًا من صفحة كتالوج مورد واحد، بمحدد CSS واحد يتكرر على كل صفحاتها.
صحفي يجمع عناوين أخبار من قسم ثابت
يستخرج صحفي مستقل عناوين آخر الأخبار من قسم ثابت في موقع رسمي حكومي، بمحدد CSS يبقى صالحًا طالما لم يتغير تصميم الموقع.
الأسئلة الشائعة
ما الفرق بين هذه الأداة وأداة الاستخراج بالذكاء الاصطناعي؟
هذه تعتمد محددًا دقيقًا تحدده أنت مسبقًا، فهي أسرع وأرخص لكنها تتوقف إن تغيّر تصميم الصفحة؛ الاستخراج بالذكاء الاصطناعي يفهم السياق ويتكيف مع تصاميم مختلفة تلقائيًا.
ماذا يحدث إن لم يطابق المحدد أي عنصر؟
تعيد الأداة نتيجة فارغة مع رسالة توضح أن المحدد لم يجد تطابقًا، دون خصم رسوم على طلب فاشل تمامًا.
هل يمكن استخراج عدة حقول في طلب واحد؟
نعم، يمكن تحديد أكثر من محدد في نفس الطلب لاستخراج عدة حقول معًا من الصفحة ذاتها.
هل تُحفظ الصفحة بعد الاستخراج؟
لا، تُستخدم لإنتاج البيانات فقط ثم تُحذف دون الاحتفاظ بأي نسخة من محتواها.
كم تكلفة استخراج بيانات مئة صفحة؟
نحو $4.1، بواقع $0.041 للصفحة الواحدة تقريبًا.
هل أحتاج معرفة برمجية لاستخدامها؟
معرفة أساسية بمحددات CSS تكفي؛ أدوات فحص العنصر المدمجة في أي متصفح تساعد في إيجادها دون خبرة برمجة عميقة.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/web/scrape-selector \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://ejemplo.com","selectors":{"titulo":"h1","precio":".price"}}'const res = await fetch("https://api.kit.forhosting.com/web/scrape-selector", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"url": "https://ejemplo.com",
"selectors": {
"titulo": "h1",
"precio": ".price"
}
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/scrape-selector",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"url": "https://ejemplo.com",
"selectors": {
"titulo": "h1",
"precio": ".price"
}
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/scrape-selector", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"url":"https://ejemplo.com","selectors":{"titulo":"h1","precio":".price"}}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"url":"https://ejemplo.com","selectors":{"titulo":"h1","precio":".price"}}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/scrape-selector", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"url": "https://ejemplo.com",
"selectors": {
"titulo": "h1",
"precio": ".price"
}
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.scrape_selector",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
timeout_sec | 30 |
max_crawl_pages | 25 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |
422 | task_failed | لم تنجح معالجة المهمة، ولن تُحتسب عليك؛ أعد المحاولة أو راسلنا مباشرة. |