HeadHunter工作分析


一旦对我来说变得有趣,但是如果您尝试分析空缺并为其绘制一些顶部该怎么办。 找出谁的薪水最高,谁的需求最大,还有更多。


作为数据源,我使用了著名的HeadHunter。 今年五月的工作已收集并处理。 仅一个月,因为API不允许您获得更多。


资料收集


HeadHunter API具有出色的文档,该文档位于存储库中 。 应当向安装了User-Agent的域https://api.hh.ru/发出请求,最好采用_/_ (__)的形式(有时其他版本的User-Agent ,但如果服务器不喜欢它,它将返回错误) )


收集逻辑非常简单,因此我使用cURL和jq在bash上实现了它。 但是,我想分享一些细微差别。


分页


要通过各种参数搜索空缺,有一个端点GET /vacancies


 curl -A 'irenica (https://irenica.com/)' 'https://api.hh.ru/vacancies' 

搜索结果将分为页面,由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")" #  $page ((i++)) declare -i totalCount=$(echo "$page" | jq '.pages') if ((i >= totalCount)); then break fi done 

完整的工作数据


但是,搜索结果仅包含部分工作数据。 要获取所有内容,您需要单独请求GET /vacancies/id_形式的端点。


部分作业数据位于搜索结果的items字段中。 首先,我们将从他们那里收集空缺ID:


 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")" #  $vacancy done 

搜索限制绕过


HeadHunter API具有一项功能-无论找到多少,最多将返回2000,在这种情况下,实际找到的数字也将返回到搜索结果的found字段中。 因此,您可以确定是否已收到所有请求的数据,或者是否有丢失。


为了解决此限制,我提出了以下建议。 搜索时,您可以指定发布感兴趣的空缺的时间长度(通过date_fromdate_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)" # ... declare url="https://api.hh.ru/vacancies?per_page=100&page=$i&date_from=$startTimeIso&date_to=$intervalEndIso" # ... startTime=$intervalEnd done 

薪资处理


为了收集统计信息,有必要根据某些标准对空缺进行分组。 在bash上,这已经存在问题,因此我使用了Python。


收集逻辑没什么特别的-关联数组中的数据累积,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 

结果分析


现在该显示数字了。


远程工作


可能许多阅读这篇文章的人都希望在远程站点上工作。 但是,正如您所看到的,在我们国家,在家工作还没有被引用。 薪水要低得多,空缺的数目要少得多。 因此,申请人的选择余地更少。


这很奇怪,因为在许多专业和许多公司中(根据任务的具体情况),根本不需要一个人在办公室里。 但这是一个永恒的争论。


名称平均工资最低工资最高工资编号
家庭员工11253610977130,00019
信息技术,互联网,电信55225100030万2828
高层管理人员476879474100,00023
原料提取46579200009089880
安装与服务4543911874696009
公共服务,非营利组织449112000090,00019
工作人员4421894996786037
生产量423882372100,000236
建筑,房地产3989670110000329
运输,物流376629490100,000223


残疾申请人


但是,针对残疾人的空缺人数甚至更少。 这完全是不合逻辑的-即使雇主不希望被解雇,但在准备为此的雇主中,为什么很少有人考虑残疾人呢? 如果您不在乎此人在三个时区的身分,对您有什么影响,例如,他能走路吗?


你们中的许多人可能对残疾人很熟悉。 我也是,我想知道他们找工作有多难,以及他们能指望什么。


名称平均工资最低工资最高工资编号
公共服务,非营利组织69675870090,0008
高层管理人员48705300008242515
信息技术,互联网,电信453214350200,0001050
科学,教育45056315890,000376
采购流程4359115,00080,0009
建筑,房地产4214822250000210
生产量4096910,000130500189
会计,管理会计,企业财务363872610113100125
律师343082610160,000131
安全性334142290,000178


学生们


我们所有人都从没有任何经验的事情开始,即找工作。 我决定评估这些候选人的职位情况。


空缺的数量对于快速就业是令人鼓舞的。 而且我不知道获得最高薪水有多现实,但是您甚至可以以某种平均水平生活。


名称平均工资最低工资最高工资编号
心理咨询6260115002218502504
建筑,房地产55855209499896455
高层管理人员5082611310400,000111
原料提取381928000100,000328
安全性346173954100,0005844
医药,药学34475450200,00011776
运输,物流33600500150,0008000
科学,教育3142611001245101660
营业额304441个350,00052566
安装与服务30360826480,000381


总体排名


现在最有趣的是:谁的薪水最高? 排序所有找到的空缺,不带任何过滤器。


当然,这是高层管理人员。 谁会怀疑。


一个奇怪的事实:如果您关注所有表格中的平均薪水,您会发现它并没有太大的不同。


名称平均工资最低工资最高工资编号
高层管理人员787891502,000,0002408
原料提取61699800018万2302
心理咨询597971500500,0003762
信息技术,互联网,电信527772668480425900
建筑,房地产485872094998933229
生产量420071个26100027269
工作人员4120325200,00043079
汽车业务38555208242549269
安装与服务384122518万2390
采购流程37846502610002658


清洁女工


这是最简单的方法:如果可以洗办公室,为什么还要学习5年? 以下是过滤查询“ cleaner *”的空缺职位的结果。


如果您进入几个办公室,晚上来几个小时打扫怎么办? 这样您就可以过上奢华的生活。 我们将认为这是一门生活。


名称平均工资最低工资最高工资编号
高层管理人员6300040,000870008
市场营销,广告,公关50,00050,00050,0006
原料提取4500045000450003
人力资源管理,培训3324679088700058
会计,管理会计,企业财务320003000035,00010
安全性315072000070,0006
营业额29696473755,000159
建筑,房地产2902441380,00073
运输,物流24987109904500026
汽车业务2446571244500061


热门城市


最后,我决定检查按城市列出的空缺职位数。 最初的位置不足为奇,但是随后的位置却充满了好奇甚至是出乎意料的位置。


名称编号
莫斯科31137
圣彼得堡11745
明斯克7608
阿拉木图4386
基辅3398
叶卡捷琳堡3182
新西伯利亚3097
喀山3066
乌法2980
下诺夫哥罗德2876


资料库


仓库中提供了本文的所有代码以及改进和说明。

Source: https://habr.com/ru/post/zh-CN418281/


All Articles