العودة إلى المدونة

بروكسي لجمع بيانات الوظائف من hh.ru وSuperjob وLinkedIn: دليل شامل

دليل مفصل لإعداد البروكسي لبرامج تجميع بيانات مواقع الوظائف: اختيار نوع البروكسي، تجاوز حماية hh.ru و Superjob، إعداد تدوير IP ومعالجة الكابتشا.

📅٢٣ رمضان ١٤٤٧ هـ

استخراج لوحات الوظائف هو أحد أكثر سيناريوهات جمع البيانات طلبًا لتحليلات الموارد البشرية، ومراقبة سوق العمل، وأتمتة التوظيف. لكن مواقع الوظائف تحمي نفسها بنشاط من جمع البيانات التلقائي: تحظر عناوين IP بعد 50-100 طلب، وتعرض الكابتشا وتحظر الحسابات المشبوهة. في هذا المقال سنتناول كيفية إعداد البروكسي بشكل صحيح للاستخراج المستقر من hh.ru وSuperjob وLinkedIn ومنصات أخرى دون حظر.

لماذا تحظر لوحات الوظائف الاستخراج وكيف تعمل الحماية

تخسر مواقع الوظائف المال من الاستخراج: تُباع البيانات للمنافسين، وتُنشأ مجمعات بدون ترخيص، ويتجاوز أصحاب العمل النشر المدفوع. لذلك نفذت جميع المنصات الكبرى حماية متعددة المستويات ضد جمع البيانات التلقائي.

الطرق الرئيسية لحماية لوحات الوظائف:

  • تحديد المعدل حسب IP — يحظر hh.ru عناوين IP بعد 80-120 طلبًا في الساعة، وSuperjob بعد 50-70 طلبًا. يمكن أن يستمر الحظر من ساعة إلى يوم.
  • بصمة المتصفح — تحلل المواقع User-Agent ورؤوس HTTP ودقة الشاشة والخطوط المثبتة. إذا لم تتطابق البيانات مع متصفح حقيقي - يُحظر الطلب.
  • فحوصات JavaScript — تستخدم العديد من المواقع Cloudflare أو سكريبتات خاصة للتحقق من أن الطلب يأتي من متصفح حقيقي وليس بوت.
  • فخاخ Honeypot — روابط وحقول مخفية يراها المستخرج فقط. إذا انتقل البوت إليها - يُضاف IP إلى القائمة السوداء.
  • الكابتشا عند النشاط المشبوه — تظهر بعد سلسلة من الطلبات السريعة أو عند استخدام عناوين IP لمراكز البيانات.

بدون بروكسي يمكنك استخراج 100-200 وظيفة كحد أقصى، وبعد ذلك سيُحظر عنوان IP الخاص بك. للجمع الواسع النطاق للبيانات (آلاف الوظائف يوميًا) تصبح البروكسي أداة إلزامية.

مهم: يجب أن يتوافق الاستخراج مع شروط استخدام الموقع. توفر العديد من لوحات الوظائف واجهات برمجة تطبيقات رسمية للوصول القانوني إلى البيانات. على سبيل المثال، يحتوي hh.ru على واجهة برمجة تطبيقات مجانية مع حد للطلبات، وهي مناسبة لمعظم المهام.

أي نوع من البروكسي تختار لاستخراج الوظائف

يعتمد اختيار نوع البروكسي على حجم الاستخراج والميزانية ومتطلبات السرعة. دعونا نتناول ثلاثة خيارات رئيسية مع سيناريوهات استخدام محددة.

نوع البروكسي السرعة خطر الحظر متى تستخدم
مراكز البيانات عالية (50-200 مللي ثانية) عالي اختبار المستخرج، جمع البيانات العامة بدون تسجيل دخول
سكنية متوسطة (200-800 مللي ثانية) منخفض استخراج واسع النطاق من hh.ru وSuperjob مع تدوير IP
محمولة متوسطة (300-1000 مللي ثانية) منخفض جدًا الاستخراج مع تسجيل الدخول، تجاوز حماية LinkedIn القوية

بروكسي مراكز البيانات للاستخراج

هذا هو الخيار الأسرع والأرخص، لكن مع قيود. يتم التعرف بسهولة على عناوين IP لمراكز البيانات من قبل المواقع، لذا فهي مناسبة فقط للمهام البسيطة: استخراج قوائم الوظائف بدون تسجيل دخول، جمع البيانات العامة، اختبار المستخرج قبل التشغيل على بروكسي سكنية.

متى تعمل بروكسي مراكز البيانات:

  • استخراج كمية صغيرة من البيانات (حتى 500 وظيفة يوميًا)
  • جمع البيانات من مواقع بدون حماية قوية (لوحات وظائف إقليمية صغيرة)
  • استخدام واجهات برمجة التطبيقات الرسمية مع تدوير IP لتجاوز حدود المعدل
  • استخراج خلاصات RSS وملفات XML للوظائف

بالنسبة لـ hh.ru وSuperjob ستعمل بروكسي مراكز البيانات بشكل غير مستقر: ستحصل على كابتشا بعد 20-30 طلبًا، والعديد من عناوين IP موجودة بالفعل في القوائم السوداء لهذه المواقع.

البروكسي السكنية - الخيار الأمثل للوحات الوظائف

تستخدم البروكسي السكنية عناوين IP لمستخدمين منزليين حقيقيين، لذلك تعتبرها المواقع زوارًا عاديين. هذا هو التوازن الأمثل بين السعر والجودة لاستخراج الوظائف.

مزايا استخراج لوحات الوظائف:

  • خطر حظر منخفض — لا يمكن لـ hh.ru وSuperjob التمييز بين IP سكني ومستخدم حقيقي
  • مجموعة كبيرة من عناوين IP — يمكن إعداد التدوير لكل طلب أو مرة كل 5-10 دقائق
  • الربط الجغرافي — يمكن استخراج الوظائف من مدينة معينة باستخدام IP من تلك المنطقة
  • الاستقرار — يمكن لعنوان IP سكني واحد معالجة 200-500 طلب دون حظر

للاستخراج الواسع النطاق (أكثر من 1000 وظيفة يوميًا) البروكسي السكنية مع تدوير IP هي الحل القياسي. تقوم بإعداد تغيير IP كل 5-10 دقائق، وإضافة تأخيرات عشوائية بين الطلبات (3-7 ثوانٍ) وتحصل على جمع بيانات مستقر دون حظر.

البروكسي المحمولة لـ LinkedIn والاستخراج مع تسجيل الدخول

تستخدم البروكسي المحمولة عناوين IP لمشغلي الهاتف المحمول. ميزتها الرئيسية - يستخدم عنوان IP واحد مئات المستخدمين الحقيقيين في وقت واحد، لذلك لا تستطيع المواقع حظر مثل هذا العنوان دون خطر حظر آلاف الزوار العاديين.

متى تحتاج بروكسي محمولة:

  • استخراج LinkedIn — هذه المنصة لديها أقوى حماية ضد البوتات وتحظر بشكل عدواني عناوين IP لمراكز البيانات وحتى السكنية
  • العمل مع تسجيل الدخول — إذا كنت بحاجة لاستخراج الوظائف المغلقة أو بيانات الملفات الشخصية، تقلل عناوين IP المحمولة من خطر حظر الحساب
  • استخراج لوحات الوظائف الأجنبية — Indeed وGlassdoor وMonster تستخدم أنظمة حماية متقدمة، حيث تعمل عناوين IP المحمولة بشكل أكثر موثوقية
  • تجاوز الحظر القوي — إذا بدأت بروكسياتك السكنية في الحصول على كابتشا، فإن الانتقال إلى المحمولة سيحل المشكلة

عيب البروكسي المحمولة - السعر المرتفع والسرعة الأقل. لكن للمهام الحرجة، حيث الحظر غير مقبول، هذا هو الخيار الأفضل.

خصوصيات استخراج hh.ru: الحماية وطرق التجاوز

hh.ru - أكبر موقع روسي للوظائف مع أكثر حماية متقدمة ضد الاستخراج بين لوحات الوظائف المحلية. يستخدم الموقع مزيجًا من تحديد المعدل وبصمة المتصفح والتحليل السلوكي لتحديد البوتات.

كيف تعمل حماية hh.ru

1. حدود حسب عنوان IP: بعد 80-120 طلبًا في الساعة من عنوان IP واحد، يبدأ الموقع في عرض الكابتشا أو يعيد HTTP 429 (طلبات كثيرة جدًا). يستمر الحظر من ساعة إلى 6 ساعات حسب عدوانية الاستخراج.

2. التحقق من User-Agent والرؤوس: يحلل hh.ru رؤوس طلبات HTTP. إذا لم يتطابق User-Agent مع متصفح حقيقي أو كانت الرؤوس القياسية مفقودة (Accept-Language، Accept-Encoding)، يُحظر الطلب.

3. فحوصات JavaScript: تتطلب بعض صفحات hh.ru تنفيذ JavaScript لتحميل البيانات. لن يتمكن مستخرج HTTP بسيط بدون متصفح headless من الحصول على المحتوى الكامل.

4. روابط Honeypot: توجد على الصفحات عناصر مخفية يراها المستخرج فقط. إذا انتقل السكريبت الخاص بك عبر هذه الروابط - يُضاف IP إلى القائمة السوداء لمدة 24 ساعة.

استراتيجية تجاوز حماية hh.ru مع البروكسي

للاستخراج المستقر من hh.ru دون حظر استخدم التكوين التالي:

الإعداد الأمثل لاستخراج hh.ru:

  • نوع البروكسي: سكنية مع تدوير IP كل 5-10 دقائق
  • التأخير بين الطلبات: 4-8 ثوانٍ (قيمة عشوائية)
  • User-Agent: تدوير User-Agent حقيقي للمتصفحات الحديثة (Chrome وFirefox وSafari الإصدارات الأخيرة)
  • الرؤوس: مجموعة كاملة من رؤوس المتصفح القياسية (Accept وAccept-Language وAccept-Encoding وReferer)
  • Cookies: حفظ ونقل cookies بين الطلبات ضمن جلسة واحدة
  • حد الطلبات: لا يزيد عن 60-80 طلبًا لكل IP، ثم تغيير البروكسي

مثال على تسلسل آمن للإجراءات:

  1. الاتصال ببروكسي سكني مع IP من المنطقة المطلوبة (على سبيل المثال، موسكو)
  2. إجراء أول طلب إلى الصفحة الرئيسية لـ hh.ru، والحصول على cookies وحفظها
  3. الانتظار 5-7 ثوانٍ (محاكاة قراءة الصفحة)
  4. إجراء طلب إلى صفحة البحث عن الوظائف مع الفلاتر المطلوبة
  5. استخراج قائمة الوظائف (عادة 20-50 لكل صفحة)
  6. لكل وظيفة إجراء طلب إلى الصفحة التفصيلية مع تأخير 4-6 ثوانٍ
  7. بعد 60-70 طلبًا تغيير البروكسي وتكرار الدورة

مع هذه الاستراتيجية يمكنك استخراج 1000-2000 وظيفة يوميًا من مسار واحد دون حظر واحد. إذا كنت بحاجة إلى حجم أكبر - قم بتشغيل عدة مسارات متوازية مع بروكسيات مختلفة.

نصيحة: يوفر hh.ru واجهة برمجة تطبيقات مجانية للوصول إلى الوظائف. لمعظم المهام (تحليل سوق العمل، مراقبة الرواتب) ستكون واجهة برمجة التطبيقات حلاً أكثر استقرارًا من استخراج HTML. يمكن استخدام البروكسي لتدوير IP عند العمل مع واجهة برمجة التطبيقات لتجاوز حدود المعدل.

استخراج Superjob وLinkedIn والمنصات الأجنبية

Superjob: خصوصيات الحماية

يمتلك Superjob حماية أقل صرامة مقارنة بـ hh.ru، لكنه لا يزال يحارب الاستخراج بنشاط. الاختلافات الرئيسية:

  • حد معدل أقل: يحدث الحظر بعد 50-70 طلبًا في الساعة (مقابل 80-120 في hh.ru)
  • فحص أقل صرامة للرؤوس: يمكن استخدام مجموعة مبسطة من الرؤوس
  • عدم وجود حماية JavaScript: معظم البيانات متاحة من خلال طلب HTTP بسيط بدون متصفح headless
  • الحظر الإقليمي: بعض الوظائف متاحة فقط من IP لمنطقة معينة

بالنسبة لـ Superjob تكفي البروكسي السكنية مع التدوير كل 10-15 دقيقة وتأخير بين الطلبات 3-5 ثوانٍ. سيسمح هذا باستخراج 500-1000 وظيفة يوميًا بشكل مستقر.

LinkedIn: أقوى حماية

LinkedIn - هذه قصة منفصلة. تستخدم المنصة خوارزميات متقدمة للتعلم الآلي لتحديد البوتات ولديها واحدة من أكثر أنظمة الحماية عدوانية بين جميع الشبكات الاجتماعية ولوحات الوظائف.

خصوصيات حماية LinkedIn:

  • تسجيل الدخول الإلزامي: معظم البيانات متاحة فقط للمستخدمين المسجلين
  • التحليل السلوكي: يحلل LinkedIn أنماط الإجراءات: سرعة التمرير، حركات الماوس، الوقت على الصفحة
  • حظر الحسابات: عند النشاط المشبوه يُحظر ليس فقط IP، بل الحساب نفسه
  • قيود على مشاهدة الملفات الشخصية: يمكن للحسابات المجانية مشاهدة عدد محدود من الملفات الشخصية شهريًا
  • تنفيذ JavaScript الإلزامي: بدون متصفح headless الاستخراج مستحيل

استراتيجية استخراج LinkedIn:

  1. استخدم بروكسي محمولة — تعطي أقل خطر للحظر. يمكن استخدام عنوان IP محمول واحد لـ 100-200 مشاهدة للملفات الشخصية يوميًا.
  2. متصفح Headless إلزامي — استخدم Puppeteer أو Playwright مع إعداد بصمة متصفح حقيقية (دقة الشاشة، WebGL، Canvas).
  3. سرعة استخراج بطيئة — لا يزيد عن 20-30 ملفًا شخصيًا في الساعة من حساب واحد. أضف تأخيرات 10-20 ثانية بين المشاهدات.
  4. محاكاة السلوك الحقيقي — تمرير الصفحة، نقرات عشوائية، انتقالات بين أقسام الملف الشخصي.
  5. تسخين الحسابات — لا يمكن استخدام حسابات LinkedIn الجديدة فورًا للاستخراج. تحتاج إلى 1-2 أسبوع لمحاكاة نشاط مستخدم عادي.
  6. تدوير الحسابات — استخدم عدة حسابات مع بروكسيات مختلفة لتوزيع الحمل.

استخراج LinkedIn - هذه أصعب مهمة بين جميع لوحات الوظائف. إذا كنت بحاجة إلى بيانات من هذه المنصة، فكر في استخدام واجهة برمجة تطبيقات Sales Navigator الرسمية أو خدمات طرف ثالث توفر البيانات بشكل قانوني.

لوحات الوظائف الأجنبية: Indeed وGlassdoor وMonster

عادة ما تمتلك المنصات الأجنبية حماية أكثر صرامة من المواقع الروسية (باستثناء hh.ru). الخصوصيات الرئيسية:

  • Indeed — يستخدم Cloudflare مع فحوصات JavaScript. تحتاج إلى متصفح headless وبروكسي سكنية/محمولة من البلد الذي تستخرج وظائفه.
  • Glassdoor — يتطلب تسجيل الدخول لمشاهدة معظم البيانات. يحظر بنشاط عناوين IP لمراكز البيانات. استخدم بروكسي سكنية وسرعة استخراج بطيئة (تأخير 8-12 ثانية).
  • Monster — لديه واجهة برمجة تطبيقات للشركاء، لكن لاستخراج HTML تحتاج إلى بروكسي سكنية مع ربط جغرافي بالبلد المطلوب.

لجميع المنصات الأجنبية الربط الجغرافي للبروكسي أمر بالغ الأهمية. إذا كنت تستخرج وظائف في الولايات المتحدة، استخدم عناوين IP سكنية أمريكية. قد تثير الطلبات من عناوين IP من بلدان أخرى الشك وتؤدي إلى الحظر.

إعداد تدوير IP والتأخيرات بين الطلبات

الإعداد الصحيح لتدوير البروكسي هو مفتاح الاستخراج المستقر دون حظر. دعونا نتناول استراتيجيتين رئيسيتين: التدوير لكل طلب والتدوير حسب الوقت.

التدوير لكل طلب (Rotating Proxies)

في هذا النهج يأتي كل طلب HTTP من عنوان IP جديد. هذه الطريقة الأكثر أمانًا، لكن لها قيود:

المزايا:

  • من المستحيل تتبع نشاط عنوان IP واحد
  • يمكن إجراء المزيد من الطلبات في وحدة الزمن
  • لا حاجة لتتبع الحدود لكل IP

العيوب:

  • من المستحيل الحفاظ على الجلسة (تُفقد cookies عند تغيير IP)
  • غير مناسب للاستخراج مع تسجيل الدخول
  • تحظر بعض المواقع الطلبات إذا تغير IP بشكل متكرر جدًا

التدوير لكل طلب مناسب لاستخراج الصفحات العامة من hh.ru وSuperjob بدون تسجيل دخول. يتم إعداده من خلال معامل مزود البروكسي (عادة ما يكون نقطة نهاية خاصة مع تدوير تلقائي).

التدوير حسب الوقت (Sticky Sessions)

في هذا النهج يُستخدم عنوان IP واحد لفترة معينة (5-30 دقيقة)، ثم يحدث التغيير التلقائي. هذا هو الخيار الأمثل لمعظم مهام استخراج لوحات الوظائف.

فترات التدوير الموصى بها:

الموقع فترة التدوير الحد الأقصى للطلبات لكل IP التأخير بين الطلبات
hh.ru 5-10 دقائق 60-80 4-8 ثوانٍ
Superjob 10-15 دقيقة 50-70 3-5 ثوانٍ
LinkedIn 30-60 دقيقة 20-40 10-20 ثانية
Indeed 10-20 دقيقة 40-60 5-10 ثوانٍ
Glassdoor 15-30 دقيقة 30-50 8-12 ثانية

إعداد التأخيرات العشوائية

التأخير الثابت بين الطلبات (على سبيل المثال، 5 ثوانٍ بالضبط) يبدو مشبوهًا لأنظمة الحماية. لا يمكن للمستخدم الحقيقي التصرف بهذه الدقة. استخدم دائمًا تأخيرات عشوائية في نطاق.

أمثلة على تنفيذ التأخيرات العشوائية:

// Python
import time
import random

# تأخير من 4 إلى 8 ثوانٍ
delay = random.uniform(4, 8)
time.sleep(delay)

# منطق أكثر تعقيدًا: أحيانًا نأخذ وقفة طويلة
if random.random() < 0.1:  # احتمال 10%
    time.sleep(random.uniform(15, 30))  # محاكاة تشتت المستخدم
else:
    time.sleep(random.uniform(4, 8))
// JavaScript / Node.js
const sleep = (min, max) => {
  const delay = Math.random() * (max - min) + min;
  return new Promise(resolve => setTimeout(resolve, delay * 1000));
};

// الاستخدام
await sleep(4, 8);  // تأخير 4-8 ثوانٍ

// مع احتمال وقفة طويلة
if (Math.random() < 0.1) {
  await sleep(15, 30);  // احتمال 10% لوقفة طويلة
} else {
  await sleep(4, 8);
}

إضافة وقفات طويلة عشوائية (15-30 ثانية) باحتمال 5-10% يجعل سلوك المستخرج أكثر شبهاً بمستخدم حقيقي قد يتشتت بمكالمة هاتفية أو مهمة أخرى.

معالجة الكابتشا وأنواع الحظر الأخرى

حتى مع الإعداد الصحيح للبروكسي والتأخيرات قد تواجه الكابتشا أو أنواع أخرى من الحظر. دعونا نتناول كيفية الاستجابة بشكل صحيح لهذه المواقف.

أنواع حظر لوحات الوظائف

1. HTTP 429 Too Many Requests — النوع الأكثر شيوعًا من الحظر. يخبرك الموقع صراحة أنك تجاوزت حد الطلبات. عادة في رأس الاستجابة يوجد Retry-After، الذي يشير إلى عدد الثواني قبل إعادة المحاولة.

كيفية المعالجة: قم بتغيير البروكسي فورًا وأضف IP الحالي إلى القائمة السوداء للوقت المحدد في Retry-After (عادة 1-6 ساعات). إذا كان Retry-After غائبًا، أضف IP إلى القائمة السوداء لمدة ساعتين.

2. HTTP 403 Forbidden — IP محظور على مستوى الخادم. هذا حظر أكثر خطورة قد يستمر من عدة ساعات إلى يوم.

كيفية المعالجة: قم بتغيير البروكسي وأضف IP إلى القائمة السوداء طويلة الأجل (24 ساعة). قم بتحليل السجلات: ربما تستخرج بشكل عدواني جدًا أو تستخدم عناوين IP لمراكز البيانات حيث تحتاج إلى سكنية.

3. الكابتشا (CAPTCHA) — يعرض الموقع فحص "أنا لست روبوت". هذا يعني أن سلوكك بدا مشبوهًا، لكن IP لم يُحظر بالكامل بعد.

كيفية المعالجة: هناك ثلاثة خيارات:

  • تغيير البروكسي — أبسط طريقة. يُضاف IP الحالي إلى القائمة السوداء لمدة 6-12 ساعة.
  • حل الكابتشا التلقائي — استخدام خدمات مثل 2Captcha وAnti-Captcha وCapSolver. تكلف $1-3 لكل 1000 حل.
  • الحل اليدوي — إذا لم يكن الاستخراج حرجًا من حيث الوقت، يمكن إرسال الكابتشا للحل اليدوي من قبل مشغل.

4. Cloudflare Challenge — فحص JavaScript يتطلب تنفيذ كود في المتصفح. لن تجتاز مكتبة HTTP العادية هذا الفحص.

كيفية المعالجة: استخدم متصفح headless (Puppeteer وPlaywright وSelenium) مع إعداد بصمة حقيقية. تساعد مكتبات مثل puppeteer-extra-plugin-stealth في تجاوز كشف وضع headless.

دمج خدمات حل الكابتشا

إذا قررت حل الكابتشا تلقائيًا، إليك مثال على التكامل مع خدمة 2Captcha الشهيرة:

// Python باستخدام مكتبة 2captcha-python
from twocaptcha import TwoCaptcha
import requests

solver = TwoCaptcha('YOUR_API_KEY')

try:
    # حل reCAPTCHA v2
    result = solver.recaptcha(
        sitekey='6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
        url='https://hh.ru/search/vacancy',
        proxy={
            'type': 'HTTPS',
            'uri': 'login:password@ip:port'
        }
    )
    
    # الحصول على رمز الحل
    captcha_token = result['code']
    
    # إرسال الطلب مع الرمز
    response = requests.post(
        'https://hh.ru/search/vacancy',
        data={
            'g-recaptcha-response': captcha_token,
            # معاملات النموذج الأخرى
        },
        proxies={
            'http': 'http://login:password@ip:port',
            'https': 'http://login:password@ip:port'
        }
    )
    
except Exception as e:
    print(f'خطأ في حل الكابتشا: {e}')

يستغرق حل كابتشا واحدة 10-30 ثانية وتكلف حوالي $0.001-0.003. للاستخراج الواسع النطاق قد يكون هذا مكلفًا، لذا من الأفضل إعداد الاستخراج بحيث تظهر الكابتشا بأقل قدر ممكن.

نظام المراقبة والتنبيهات

للتشغيل المستقر للمستخرج من المهم إعداد مراقبة الحظر والتنبيهات التلقائية:

ما يجب تتبعه:

  • نسبة الطلبات الناجحة — إذا انخفضت إلى أقل من 90%، تحتاج إلى فحص البروكسي والإعدادات
  • عدد الكابتشا في الساعة — إذا كان أكثر من 5-10، فأنت تستخرج بشكل عدواني جدًا
  • متوسط سرعة استجابة البروكسي — إذا ارتفع بشكل حاد، ربما البروكسي محملة بشكل زائد
  • عدد أخطاء 429/403 — مؤشر على جودة البروكسي وصحة الإعدادات
  • قائمة عناوين IP المحظورة — إذا كان نفس IP يُحظر باستمرار، استبعده من المجموعة

قم بإعداد إرسال الإشعارات (Telegram، البريد الإلكتروني، Slack) إذا انخفضت نسبة الطلبات الناجحة عن القيمة الحدية. سيسمح هذا بالاستجابة السريعة للمشاكل وعدم إضاعة وقت الاستخراج.

إعداد البروكسي في أدوات الاستخراج الشائعة

دعونا نتناول كيفية إعداد البروكسي في أكثر الأدوات شيوعًا لاستخراج لوحات الوظائف: Python (requests، Scrapy)، Node.js (axios، Puppeteer) والحلول الجاهزة.

Python: requests وScrapy

Python - اللغة الأكثر شيوعًا للاستخراج بفضل مكتبات requests وBeautifulSoup وScrapy.

مثال مع مكتبة requests:

import requests
import random
import time

# قائمة البروكسي (احصل عليها من المزود)
PROXIES = [
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080'
]

# قائمة User-Agent للتدوير
USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
]

def parse_vacancy(url):
    proxy = random.choice(PROXIES)
    user_agent = random.choice(USER_AGENTS)
    
    headers = {
        'User-Agent': user_agent,
        'Accept': 'text/html,application/xhtml+xml',
        'Accept-Language': 'ru-RU,ru;q=0.9,en;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive'
    }
    
    proxies = {
        'http': proxy,
        'https': proxy
    }
    
    try:
        response = requests.get(
            url,
            headers=headers,
            proxies=proxies,
            timeout=30
        )
        
        if response.status_code == 200:
            return response.text
        elif response.status_code == 429:
            print(f'حد المعدل لـ {proxy}، نغير البروكسي')
            # إزالة البروكسي من القائمة مؤقتًا
            return None
        else:
            print(f'خطأ {response.status_code}')
            return None
            
    except Exception as e:
        print(f'خطأ في الطلب: {e}')
        return None

# الاستخدام
for i in range(100):
    html = parse_vacancy('https://hh.ru/vacancy/123456')
    if html:
        # معالجة البيانات
        pass
    
    # تأخير عشوائي
    time.sleep(random.uniform(4, 8))

مثال على إعداد Scrapy:

# settings.py

# تفعيل دعم البروكسي
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
    'scrapy_rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
    'scrapy_rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}

# قائمة البروكسي
ROTATING_PROXY_LIST = [
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080'
]

# الكشف التلقائي عن الحظر
ROTATING_PROXY_BAN_POLICY = 'scrapy_rotating_proxies.policy.BanDetectionPolicy'

# التأخير بين الطلبات
DOWNLOAD_DELAY = 5
RANDOMIZE_DOWNLOAD_DELAY = True  # تأخير عشوائي ±50%

# تدوير User-Agent
DOWNLOADER_MIDDLEWARES.update({
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
})

# الحد الأقصى للطلبات المتزامنة
CONCURRENT_REQUESTS = 4
CONCURRENT_REQUESTS_PER_DOMAIN = 1

Node.js: Puppeteer مع البروكسي

لاستخراج المواقع مع JavaScript (LinkedIn، Indeed) تحتاج إلى متصفح headless. Puppeteer - الحل الأكثر شيوعًا لـ Node.js.

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

// إضافة لتجاوز كشف متصفح headless
puppeteer.use(StealthPlugin());

async function parseWithProxy() {
  const proxy = 'http:user:[email protected]:8080';
  
  const browser = await puppeteer.launch({
    headless: true,
    args: [
      `--proxy-server=${proxy}`,
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage',
      '--disable-blink-features=AutomationControlled'
    ]
  });
  
  const page = await browser.newPage();
  
  // تعيين User-Agent حقيقي
  await page.setUserAgent(
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
  );
  
  // تعيين viewport
  await page.setViewport({ width: 1920, height: 1080 });
  
  try {
    await page.goto('https://hh.ru/search/vacancy', {
      waitUntil: 'networkidle2',
      timeout: 30000
    });
    
    // استخراج البيانات
    const vacancies = await page.evaluate(() => {
      const items = document.querySelectorAll('.vacancy-serp-item');
      return Array.from(items).map(item => ({
        title: item.querySelector('.vacancy-serp-item__title')?.textContent,
        company: item.querySelector('.vacancy-serp-item__meta-info-company')?.textContent,
        salary: item.querySelector('.vacancy-serp-item__sidebar')?.textContent
      }));
    });
    
    console.log(`تم العثور على ${vacancies.length} وظيفة`);
    return vacancies;
    
  } catch (error) {
    console.error('خطأ في الاستخراج:', error);
  } finally {
    await browser.close();
  }
}

// الاستخدام
parseWithProxy();

الخلاصة والتوصيات

الاستخراج الناجح للوحات الوظائف يتطلب نهجًا شاملاً: اختيار النوع المناسب من البروكسي، وإعداد التدوير الصحيح، ومحاكاة السلوك البشري، ومراقبة الحظر. دعونا نلخص التوصيات الرئيسية:

أفضل الممارسات:

  • للاستخراج الواسع النطاق من hh.ru وSuperjob — استخدم بروكسي سكنية مع تدوير كل 5-10 دقائق وتأخيرات عشوائية 4-8 ثوانٍ
  • لـ LinkedIn والمنصات ذات الحماية القويةبروكسي محمولة مع متصفح headless وسرعة استخراج بطيئة (10-20 ثانية بين الطلبات)
  • للاختبار والمهام البسيطة — يمكن استخدام بروكسي مراكز البيانات، لكن كن مستعدًا للحظر المتكرر
  • استخدم دائمًا تدوير User-Agent، ومجموعة كاملة من رؤوس HTTP، وحفظ cookies ضمن الجلسة
  • قم بإعداد المراقبة لنسبة الطلبات الناجحة وعدد الكابتشا لاكتشاف المشاكل بسرعة
  • فكر في استخدام واجهات برمجة التطبيقات الرسمية — العديد من لوحات الوظائف توفر وصولاً قانونيًا للبيانات بشروط أفضل من الاستخراج

تذكر أن الاستخراج يجب أن يكون أخلاقيًا ويتوافق مع شروط استخدام الموقع. استخدم البروكسي بمسؤولية، واحترم حدود المعدل، ولا تحمل الخوادم بشكل زائد بطلبات متكررة جدًا. النهج الصحيح سيسمح لك بجمع البيانات اللازمة دون مشاكل وحظر.

إذا كنت بحاجة إلى بروكسي موثوقة لاستخراج لوحات الوظائف، فإن ProxyCove توفر بروكسي سكنية ومحمولة عالية الجودة مع دعم تقني على مدار الساعة وأسعار مرنة. جرب الفترة التجريبية المجانية وتأكد من جودة الخدمة.