
一旦对我来说变得有趣,但是如果您尝试分析空缺并为其绘制一些顶部该怎么办。 找出谁的薪水最高,谁的需求最大,还有更多。
作为数据源,我使用了著名的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")"
完整的工作数据
但是,搜索结果仅包含部分工作数据。 要获取所有内容,您需要单独请求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")"
搜索限制绕过
HeadHunter API具有一项功能-无论找到多少,最多将返回2000,在这种情况下,实际找到的数字也将返回到搜索结果的found
字段中。 因此,您可以确定是否已收到所有请求的数据,或者是否有丢失。
为了解决此限制,我提出了以下建议。 搜索时,您可以指定发布感兴趣的空缺的时间长度(通过date_from
和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)"
薪资处理
为了收集统计信息,有必要根据某些标准对空缺进行分组。 在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
结果分析
现在该显示数字了。
远程工作
可能许多阅读这篇文章的人都希望在远程站点上工作。 但是,正如您所看到的,在我们国家,在家工作还没有被引用。 薪水要低得多,空缺的数目要少得多。 因此,申请人的选择余地更少。
这很奇怪,因为在许多专业和许多公司中(根据任务的具体情况),根本不需要一个人在办公室里。 但这是一个永恒的争论。
名称 | 平均工资 | 最低工资 | 最高工资 | 编号 |
---|
家庭员工 | 112536 | 10977 | 130,000 | 19 |
信息技术,互联网,电信 | 55225 | 1000 | 30万 | 2828 |
高层管理人员 | 47687 | 9474 | 100,000 | 23 |
原料提取 | 46579 | 20000 | 90898 | 80 |
安装与服务 | 45439 | 11874 | 69600 | 9 |
公共服务,非营利组织 | 44911 | 20000 | 90,000 | 19 |
工作人员 | 44218 | 9499 | 67860 | 37 |
生产量 | 42388 | 2372 | 100,000 | 236 |
建筑,房地产 | 39896 | 70 | 110000 | 329 |
运输,物流 | 37662 | 9490 | 100,000 | 223 |

残疾申请人
但是,针对残疾人的空缺人数甚至更少。 这完全是不合逻辑的-即使雇主不希望被解雇,但在准备为此的雇主中,为什么很少有人考虑残疾人呢? 如果您不在乎此人在三个时区的身分,对您有什么影响,例如,他能走路吗?
你们中的许多人可能对残疾人很熟悉。 我也是,我想知道他们找工作有多难,以及他们能指望什么。
名称 | 平均工资 | 最低工资 | 最高工资 | 编号 |
---|
公共服务,非营利组织 | 69675 | 8700 | 90,000 | 8 |
高层管理人员 | 48705 | 30000 | 82425 | 15 |
信息技术,互联网,电信 | 45321 | 4350 | 200,000 | 1050 |
科学,教育 | 45056 | 3158 | 90,000 | 376 |
采购流程 | 43591 | 15,000 | 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 | 400,000 | 111 |
原料提取 | 38192 | 8000 | 100,000 | 328 |
安全性 | 34617 | 3954 | 100,000 | 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 | 18万 | 2302 |
心理咨询 | 59797 | 1500 | 500,000 | 3762 |
信息技术,互联网,电信 | 52777 | 26 | 684804 | 25900 |
建筑,房地产 | 48587 | 20 | 949989 | 33229 |
生产量 | 42007 | 1个 | 261000 | 27269 |
工作人员 | 41203 | 25 | 200,000 | 43079 |
汽车业务 | 38555 | 20 | 824254 | 9269 |
安装与服务 | 38412 | 25 | 18万 | 2390 |
采购流程 | 37846 | 50 | 261000 | 2658 |

清洁女工
这是最简单的方法:如果可以洗办公室,为什么还要学习5年? 以下是过滤查询“ cleaner *”的空缺职位的结果。
如果您进入几个办公室,晚上来几个小时打扫怎么办? 这样您就可以过上奢华的生活。 我们将认为这是一门生活。
名称 | 平均工资 | 最低工资 | 最高工资 | 编号 |
---|
高层管理人员 | 63000 | 40,000 | 87000 | 8 |
市场营销,广告,公关 | 50,000 | 50,000 | 50,000 | 6 |
原料提取 | 45000 | 45000 | 45000 | 3 |
人力资源管理,培训 | 33246 | 7908 | 87000 | 58 |
会计,管理会计,企业财务 | 32000 | 30000 | 35,000 | 10 |
安全性 | 31507 | 20000 | 70,000 | 6 |
营业额 | 29696 | 4737 | 55,000 | 159 |
建筑,房地产 | 29024 | 413 | 80,000 | 73 |
运输,物流 | 24987 | 10990 | 45000 | 26 |
汽车业务 | 24465 | 7124 | 45000 | 61 |

热门城市
最后,我决定检查按城市列出的空缺职位数。 最初的位置不足为奇,但是随后的位置却充满了好奇甚至是出乎意料的位置。
名称 | 编号 |
---|
莫斯科 | 31137 |
圣彼得堡 | 11745 |
明斯克 | 7608 |
阿拉木图 | 4386 |
基辅 | 3398 |
叶卡捷琳堡 | 3182 |
新西伯利亚 | 3097 |
喀山 | 3066 |
乌法 | 2980 |
下诺夫哥罗德 | 2876 |

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