
بمجرد أن أصبح الأمر مثيرًا للاهتمام بالنسبة لي ، ولكن ماذا لو حاولت تحليل الوظائف الشاغرة ورسم بعض قمم عليها. تعرف على من هو صاحب الراتب الأكثر ، والأكثر طلبًا وأكثر من ذلك بكثير.
كمصدر للبيانات ، استخدمت HeadHunter المعروفة. تم جمع ومعالجة الوظائف لشهر مايو. لمدة شهر فقط ، لأن واجهة برمجة التطبيقات لا تسمح لك بالحصول على المزيد.
جمع البيانات
يحتوي HeadHunter API على وثائق ممتازة ، تقع في المستودع . يجب تقديم الطلبات إلى النطاق https://api.hh.ru/ مع تثبيت User-Agent
، ويفضل أن يكون من النموذج _/_ (__)
(أحيانًا إصدارات أخرى من عمل User-Agent
، ولكن إذا كان الخادم لا يحب شيئًا ، _/_ (__)
خطأ )
منطق المجموعة بسيط للغاية ، لذلك قمت بتطبيقه على bash باستخدام cURL و jq . ومع ذلك ، أريد مشاركة بعض الفروق الدقيقة.
ترقيم الصفحات
للبحث عن الوظائف الشاغرة بواسطة معلمات مختلفة ، هناك نقطة نهاية GET /vacancies
.
curl -A 'irenica (https://irenica.com/)' 'https://api.hh.ru/vacancies'
سيتم تقسيم نتائج البحث إلى صفحات يكون per_page
معلمة per_page
مسؤولة عن الحجم (20 افتراضيًا و 100 كحد أقصى). يمكنك تحديد صفحة معينة عن طريق تحديد معلمة page
(يبدأ الترقيم من 0).
سيشير حقل pages
معلومات الخدمة الذي تم إرجاعه مع الوظائف الشاغرة إلى إجمالي عدد صفحات النتيجة.
باستخدام هذا ، يمكنك التكرار بسهولة على جميع الصفحات:
declare -ii=0 while true; do declare url="https://api.hh.ru/vacancies?per_page=100&page=$i" declare page="$(curl -A 'irenica (https://irenica.com/)' "$url")"
بيانات الوظيفة الكاملة
ومع ذلك ، تحتوي نتائج البحث على جزء فقط من بيانات الوظيفة. للحصول على كل شيء ، تحتاج إلى تقديم طلب منفصل لنقطة نهاية النموذج GET /vacancies/id_
.
توجد بيانات الوظيفة الجزئية في حقل items
في نتائج البحث. أولاً ، سنجمع منهم معرّف الوظيفة الشاغرة:
declare vacanciesIds="$(echo "$page" | jq -r '.items[].id')"
ثم نطلب معلومات كاملة عن الوظائف الشاغرة بشكل فردي:
for vacancyId in $vacanciesIds; do declare url="https://api.hh.ru/vacancies/$vacancyId" declare vacancy="$(curl -A 'irenica (https://irenica.com/)' "$url")"
تجاوز حد البحث
واجهة برمجة تطبيقات HeadHunter لها ميزة واحدة - بغض النظر عن العدد الذي تم العثور عليه ، سيتم إرجاع 2000 كحد أقصى. في هذه الحالة ، سيتم إرجاع الرقم الفعلي الذي تم العثور عليه أيضًا في الحقل found
في نتائج البحث. بفضل هذا ، يمكنك معرفة ما إذا كنت قد تلقيت جميع البيانات المطلوبة ، أو إذا كانت هناك خسائر.
للتغلب على هذا القيد ، توصلت إلى ما يلي. عند البحث ، يمكنك تحديد طول الوقت الذي تم فيه نشر الوظائف الشاغرة (عبر date_to
و date_to
، والتي تقبل التاريخ بتنسيق ISO 8601). يمكنك أخذ فجوة صغيرة وفرز جميع النتائج في مثل هذه القطع: بعد كل شيء ، كلما كان الفاصل الزمني أقصر ، قل عدد الوظائف الشاغرة التي تنشرها لذلك.
يجدر الانتباه إلى أن الوظائف الشاغرة التي تم نشرها فقط في الشهر الماضي يتم إرجاعها. لذلك ، لا معنى لتعيين النطاق بعد الآن.
للتكرار عبر فترات زمنية ، يتم تمثيل الأخير بشكل أفضل على أنه وقت Unix:
declare -i startTime=$(date -d '-1 month' +%s) declare -i endTime=$(date -d now +%s) while ((startTime <= endTime)); do declare -i intervalEnd=$((startTime + 60*60)) declare startTimeIso="$(date -d @$startTime +%FT%T)" declare intervalEndIso="$(date -d @$intervalEnd +%FT%T)"
معالجة الراتب
لجمع الإحصاءات ، كان من الضروري تجميع الشواغر وفقًا لمعايير معينة. على باش ، كان هذا بالفعل مشكلة ، لذلك استخدمت بايثون.
منطق المجموعة ليس شيئًا خاصًا - تراكم البيانات في مصفوفة ترابطية وفرزها وإخراجها بتنسيق CSV. ومع ذلك ، مرة أخرى عدد قليل من الفروق الدقيقة.
شوكة الراتب
وتجدر الإشارة إلى أن الراتب مقدم على شكل رقمين - الحد الأدنى والأقصى ، وقد يتغيب أحدهما.
نظرًا للتحليل كان من الضروري أن يكون لديك رقم واحد ، قررت استخدام الحد السفلي ، وفقط إذا كان غائبًا ، فإن الحد العلوي.
salary = None if vacancy['salary']: if vacancy['salary']['to']: salary = vacancy['salary']['to'] if vacancy['salary']['from']: salary = vacancy['salary']['from']
أسعار العملات
يمكن تحديد الرواتب في الوظائف الشاغرة بعملات مختلفة ، ويمكن أن يكون لها أسعار مختلفة. يحتوي HeadHunter API على نقطة نهاية GET /dictionaries
تحتوي على جميع القيم الضرورية المحددة مسبقًا. يتم عرض أسعار الصرف في مجال currency
. للراحة ، سيكون من الأفضل وضع قائمتهم في مصفوفة ترابطية ، حيث يكون المفتاح هو رمز حرف العملة:
currencies = {} dictionaries = requests.get('https://api.hh.ru/dictionaries').json() for currency in dictionaries['currency']: currencies[currency['code']] = currency['rate']
الآن ، أثناء المعالجة ، سيكون من السهل تحويل جميع الرواتب إلى عملة واحدة:
salary /= currencies[vacancy['salary']['currency']]
محاسبة ضريبة الدخل الشخصية
في بعض الشواغر ، يشار إلى الراتب قبل دفع ضريبة الدخل الشخصي ، في بعض - بعد. يتحدث الحقل gross
عن خيار محدد: true
في الحالة الأولى false
في الحالة الثانية.
قررت تحويل جميع الرواتب للخيار بعد الضريبة:
if vacancy['salary']['gross']: salary -= salary * 0.13
تحليل النتائج
والآن حان الوقت لإظهار الأرقام.
العمل عن بعد
ربما يرغب العديد من الذين قرأوا هذا المنشور في العمل على موقع بعيد. ولكن كما ترى ، لم يتم اقتباس العمل من المنزل في بلدنا بعد. الراتب أقل بكثير ، وعدد الشواغر أقل بكثير. وبالتالي كان هناك خيار أقل لمقدم الطلب.
وهذا أمر غريب بما فيه الكفاية ، لأنه في العديد من المهن والعديد من الشركات (وفقًا لخصائص المهام) ، فإن وجود شخص في المكتب ليس ضروريًا على الإطلاق. لكن هذه حجة أبدية.
الاسم | متوسط الراتب | الحد الأدنى للراتب | الراتب الأقصى | رقم |
---|
موظفي المنزل | 112536 | 10977 | 130،000 | 19 |
تكنولوجيا المعلومات والإنترنت والاتصالات | 55225 | 1000 | 300000 | 2828 |
الإدارة العليا | 47687 | 9474 | 100000 | 23 |
استخراج المواد الخام | 46579 | 20000 | 90898 | 80 |
التركيب والخدمة | 45439 | 11874 | 69600 | 9 |
الخدمة العامة والمنظمات غير الربحية | 44911 | 20000 | 90،000 | 19 |
الموظفين العاملين | 44218 | 9499 | 67860 | 37 |
الإنتاج | 42388 | 2372 | 100000 | 236 |
البناء والعقارات | 39896 | 70 | 110000 | 329 |
النقل والخدمات اللوجستية | 37662 | 9490 | 100000 | 223 |

المتقدمين الإعاقة
ومع ذلك ، هناك عدد أقل من الوظائف الشاغرة - للأشخاص ذوي الإعاقة. وهذا غير منطقي تمامًا - على الرغم من أن أرباب العمل لا يريدون أن يتم إزالتهم ، ولكن من بين أولئك الذين هم على استعداد لذلك ، فلماذا القليل من الذين يفكرون في الأشخاص ذوي الإعاقة؟ إذا كنت لا تهتم بما هو الشخص في ثلاث مناطق زمنية ، فما الفرق الذي يحدثه لك ، هل هو قادر ، على سبيل المثال ، على المشي؟
قد يكون الكثير منكم على دراية بالأشخاص ذوي الإعاقة. أنا أيضًا ، وتساءلت عن مدى صعوبة العثور على عمل ، وما الذي يمكنهم الاعتماد عليه.
الاسم | متوسط الراتب | الحد الأدنى للراتب | الراتب الأقصى | رقم |
---|
الخدمة العامة والمنظمات غير الربحية | 69675 | 8700 | 90،000 | 8 |
الإدارة العليا | 48705 | 30000 | 82425 | 15 |
تكنولوجيا المعلومات والإنترنت والاتصالات | 45321 | 4350 | 200،000 | 1050 |
العلم والتعليم | 45056 | 3158 | 90،000 | 376 |
المشتريات | 43591 | 15000 | 80،000 | 9 |
البناء والعقارات | 42148 | 22 | 250000 | 210 |
الإنتاج | 40969 | 10،000 | 130500 | 189 |
المحاسبة والمحاسبة الإدارية وتمويل المشاريع | 36387 | 2610 | 113100 | 125 |
المحامون | 34308 | 2610 | 160،000 | 131 |
الأمان | 33414 | 22 | 90،000 | 178 |

الطلاب
نبدأ جميعًا بشيء ، أي بالبحث عن وظيفة ، دون أي خبرة. قررت تقييم الوضع مع المناصب المفتوحة لمثل هؤلاء المرشحين.
عدد الوظائف الشاغرة مشجع للعمل السريع. ولا أعرف مدى واقعية الحصول على الحد الأقصى للراتب ، ولكن يمكنك حتى العيش على متوسط الأرقام بطريقة أو بأخرى.
الاسم | متوسط الراتب | الحد الأدنى للراتب | الراتب الأقصى | رقم |
---|
الاستشارة | 62601 | 1500 | 221850 | 2504 |
البناء والعقارات | 55855 | 20 | 949989 | 6455 |
الإدارة العليا | 50826 | 11310 | 400000 | 111 |
استخراج المواد الخام | 38192 | 8000 | 100000 | 328 |
الأمان | 34617 | 3954 | 100000 | 5844 |
الطب والصيدلة | 34475 | 450 | 200،000 | 11776 |
النقل والخدمات اللوجستية | 33600 | 500 | 150،000 | 8000 |
العلم والتعليم | 31426 | 1100 | 124510 | 1660 |
المبيعات | 30444 | 1 | 350.000 | 52566 |
التركيب والخدمة | 30360 | 8264 | 80،000 | 381 |

أعلى العام
والآن الأكثر إثارة للاهتمام: من هو الأكثر أجرا؟ فرز جميع الشواغر الموجودة دون أي مرشحات.
بالطبع ، هذه هي الإدارة العليا. من يشك في ذلك.
حقيقة غريبة: إذا انتبهت إلى متوسط الراتب في جميع الجداول ، يمكنك أن ترى أنه لا يختلف كثيرًا.
الاسم | متوسط الراتب | الحد الأدنى للراتب | الراتب الأقصى | رقم |
---|
الإدارة العليا | 78789 | 150 | 2،000،000 | 2408 |
استخراج المواد الخام | 61699 | 8000 | 180،000 | 2302 |
الاستشارة | 59797 | 1500 | 500000 | 3762 |
تكنولوجيا المعلومات والإنترنت والاتصالات | 52777 | 26 | 684804 | 25900 |
البناء والعقارات | 48587 | 20 | 949989 | 33229 |
الإنتاج | 42007 | 1 | 261000 | 27269 |
الموظفين العاملين | 41203 | 25 | 200،000 | 43079 |
تجارة السيارات | 38555 | 20 | 824254 | 9269 |
التركيب والخدمة | 38412 | 25 | 180،000 | 2390 |
المشتريات | 37846 | 50 | 261000 | 2658 |

عاملة تنظيف
وإليك أسهل طريقة: لماذا تدرس لمدة 5 سنوات ، إذا كان بإمكانك فقط غسل المكتب؟ فيما يلي نتيجة تصفية أهم الوظائف الشاغرة لطلب البحث "منظف *".
ماذا لو دخلت إلى عدة مكاتب وأتيت في المساء لبضع ساعات للتنظيف؟ لذا يمكنك العيش بترف. سنعتبر هذا اختراقًا للحياة.
الاسم | متوسط الراتب | الحد الأدنى للراتب | الراتب الأقصى | رقم |
---|
الإدارة العليا | 63000 | 40،000 | 87000 | 8 |
التسويق والإعلان والعلاقات العامة | 50،000 | 50،000 | 50،000 | 6 |
استخراج المواد الخام | 45000 | 45000 | 45000 | 3 |
إدارة الموارد البشرية والتدريب | 33246 | 7908 | 87000 | 58 |
المحاسبة والمحاسبة الإدارية وتمويل المشاريع | 32000 | 30000 | 35000 | 10 |
الأمان | 31507 | 20000 | 70000 | 6 |
المبيعات | 29696 | 4737 | 55000 | 159 |
البناء والعقارات | 29024 | 413 | 80،000 | 73 |
النقل والخدمات اللوجستية | 24987 | 10990 | 45000 | 26 |
تجارة السيارات | 24465 | 7124 | 45000 | 61 |

أهم المدن
وأخيرا ، قررت التحقق من عدد الوظائف الشاغرة حسب المدينة. الأماكن الأولى ليست مفاجئة ، ولكن بعد ذلك هناك مواقف غريبة وحتى غير متوقعة.
الاسم | رقم |
---|
موسكو | 31137 |
سانت بطرسبرغ | 11745 |
مينسك | 7608 |
ألماتي | 4386 |
كييف | 3398 |
ايكاترينبرغ | 3182 |
نوفوسيبيرسك | 3097 |
قازان | 3066 |
أوفا | 2980 |
نيجني نوفغورود | 2876 |

المستودع
جميع التعليمات البرمجية من المقالة ، مع التحسينات والتعليمات ، متاحة في المستودع .