如今,在Web上,您可以找到有关最流行的编程语言,库,框架,操作系统和其他实体的大量异构信息,我们称它们为技术。 这些技术的数量正在不断增长,而且很显然,每个想要成为开发人员的人都需要专注于研究与任何关键技术相关的一些最受欢迎的堆栈。
这就提出了第一个问题-一个人如何确定对特定技术的需求? 例如,可以回答以下问题:雇主在描述工作时将其作为求职者的要求时,就存在对技术的需求。 换句话说,如果在查看100个职位空缺时,提到技术A的次数是60次,提到技术B的次数是20次,那么我们可以认为技术A的需求比B更大。
第二个问题是什么被认为是关键技术?
基于对编程语言的流行性分析的文章的浓厚兴趣,我们将编程语言视为关键技术。
因此,该问题可以表述为:在各种职位空缺中,必须突出显示与关键技术关联的子集,并在该子集中计算提及其他技术的频率。
作为职位空缺的数据库,我们将使用hh.ru门户,这是因为它非常受欢迎并且HeadHunter API的可用性。 编程语言是Python 3.4。
为了减少文章的数量,将不会详细考虑获取和处理数据问题的技术方面,但是值得在某些关键点上停止。 该项目的源代码是开放的,可以在GitHub上获得 。
获取工作清单
要获取与Python程序员相关的职位空缺列表,请使用请求库发出以下get请求:
import requests import json l = "Python" params = {"text": " " + l, "search_field": "name", "area": 2, "period": 30, "page": 0} r = requests.get("https://api.hh.ru/vacancies", params=params) jr = json.loads(r.text)
结果,我们得到一个包含以下元素的字典:
- 页面:“ int”类
- 群集:类“ NoneType”
- 每页:类“ int”
- Alternative_url:类'str'
- 找到:类'int'
- 参数:类'NoneType'
- 项目:“列表”类
- 网页:“ int”类
我们感兴趣的是:
- 关键页面,其值包含具有空缺的页面数,
- 项目键,它指向页面上的空缺列表。
在项列表(即字典)中的每个项中,我们需要url键。 该键的值是指向空缺的详细说明的链接。 通过顺序更改page参数,您可以根据要求遍历所有空缺,并创建必要的列表,以进一步分析链接。 为了加快加载作业信息的过程,使用了线程库中的多个并行线程:
from math import ceil import requests from threading import Thread import json class DownloadThread(Thread): def __init__(self, urls, number, res): Thread.__init__(self) self.number = number self.urls = urls self.res = res def run(self): for url in self.urls: resp = requests.get(url) if resp.status_code == requests.codes.ok: self.res.append(json.loads(requests.get(url).text)) else: print("Status code: " + str(resp.status_code)) print(url) def start_dl_threads(urls, th_num, res): threads = [] n = ceil(len(urls) / th_num) for i in range(th_num): t = DownloadThread(urls[i * n: (i + 1) * n], i, res) threads.append(t) t.start() for t in threads: t.join()
在建立了274个空缺的测试集的下载速度对下载线程数量的依赖性之后,决定使用10个线程,因为在这种情况下,实际上数量更多的线程并没有减少脚本的时间。

创建技能词汇表并在职位描述中找到技能
最初,应该手动创建关键技能字典。 但是,在分析了职位描述的结构之后,很明显该过程可以通过许多方式实现自动化。 为此,我们需要一个key_skills-accessible列表,其中包含此空缺的关键技能。 不幸的是,很少有职位空缺包含有关关键技能的信息。 此外,此信息可能与主要描述有所不同。 因此,仅处理此数据将无法获得完整的图像。
职位空缺的所有独特关键技能,名称为“程序员” +(“ Java”,“ JavaScript”,“ 1C”,“ Python”,“ C”,“ C ++”,“ C#”,“ Objective-C”,和“ Perl”,“ Ruby”,“ PHP”)并使用-前150种最常见。
os.makedirs("data", exist_ok=True) langs = ("Java", "JavaScript", "1", "Python", "C", "C++", "C#", "Objective-C", "Perl", "Ruby", "PHP") par = {"text": "", "search_field": "name", "area": 2, "period": 30} o = {"skills": 1, "urls": 0, "vacs": 0} for l in langs: par["text"] = " " + l with open("data\data_" + par["text"] + str(datetime.date.today()) + ".json", "w") as f: json.dump(get_info_from_hh(par, 10, o), f, indent=4, ensure_ascii=False) data = Counter() for fn in os.listdir("data"): if os.path.isfile("data/" + fn): with open("data/" + fn, "r") as rf: data += Counter(json.load(rf)["skills"]) for item in data.most_common(150): print(item) jsdict = {item[0]: item[0] for item in data.most_common(150)} with open("kw.json", "w") as wf: json.dump(jsdict, wf, indent=4, ensure_ascii=False, sort_keys=True)
使用以下形式的正则表达式在职位描述中搜索关键字:
pattern = r"(?i)[^--a-zA-Z0-9_|^]%s[^--a-zA-Z0-9_|$]" % kw[item]
由于某些技术是对更多私有技术的概括,因此,例如在通过sql键进行计算时,使用了以下形式的值:
"sql": "sql|mysql|postgresql|ms sql"
另外,为了考虑与同一技术相关的各种名称,使用了以下形式的表达式:
" ": ".+|.+|design patterns", " ": ".+?|english", " ": ".+?.+?|.+?.+?|neural"
最终的关键字文件可以在GitHub存储库中找到。
在选择关键技术时, 按空缺数量使用了前20种语言的列表(标题中提到) 。 同时,只剩下那些语言,加上标题中的“ Programmer”一词,在圣彼得堡可以提供20多个职位空缺。
结果
处理诸如“程序员”这样的抽象概念的结果很好地反映了行业空缺的整体情况。 首先,很明显,第二个雇主希望从程序员那里获得SQL知识和英语 。 每三位雇主都希望程序员拥有一个git版本控制系统。 由于Web开发的方向,因此html和css是必需的技术。 这对于JavaScript和PHP尤其重要。 出乎意料的是,但是程序员可能不得不团队合作 。
在前二十个中包含的常见技术中,有面向对象的编程 , 数据库 , 算法和设计模式 。
作为操作系统,应该首选Linux 。
在考虑特定语言时,您可以看到第一行旁边是最受欢迎的框架或库。 对于Java,它们是Spring和Hibernate ,对于C# -. net和asp.net , Python程序员可能需要Django ,而JavaScript将需要React 。
特殊且最不苛刻的是家用综合楼1C 。 许多雇主只会对此平台有足够的了解(我不知道多少)。 有用的技能将是: 团队合作 ,对测试过程的理解以及使用数据库的能力。
由于搜索引擎hh的特殊性,应“程序员C”的要求,发布了许多采用1C技术的结果。 因此,该语言的结果被证明是不正确的。
我在圣彼得堡获得的结果如下。







