大家好啊,我是小护士。今天,我将会陆续编写招聘工程学相关的内容,并以此给大家带来全新的技术博客阅读体验,希望大家喜欢,谢谢。
如你所见,招聘工程学是一种利用计算机软件技术重新定义招聘的工作方法。这里说的招聘,并不是传统意义上站在雇主的角度去看待的事情。老板可以招聘员工,员工也可以招聘老板,这是双向的选择。我认为传统招聘都是基于过程式流程式的事务处理,从雇主发布招聘信息开始,然后人选投递简历,再到简历筛选、通知面试、通知招聘结果,最后进行入职流程。招聘工程学没有那么简单,它需要先采集大量无效信息,然后经过自动化处理后提取有用的信息,帮助雇主和人选进行有效的匹配,节省招聘时间,提高招聘效率。这里可能描述得有点抽象,不管怎么样,我会用时间来证明它的价值。招聘工程学不是小护士个人画的大饼,它是基于一个个实在的软件工程任务组合起来的方法论。而今天,它的第一个主要任务就是寻觅有钱的公司。
首先,我会严选一下需要用哪些工具完成今天的任务。
工具 | 性质 | 用途 | 官网链接 |
---|---|---|---|
Python 3.4 | 编程语言 | 完成任务逻辑 | https://docs.python.org/3/ |
MongoDB 4.0 | NoSQL数据库 | 存储数据 | https://docs.mongodb.com/v4.0/ |
Requests | Python代码库 | 处理HTTP协议网络任务 | http://docs.python-requests.org/en/master/ |
Beautiful Soup 4 | Python代码库 | 解析HTML格式文本 | https://www.crummy.com/software/BeautifulSoup/bs4/doc/ |
Pymongo | Python代码库 | 处理MongoDB存储任务 | http://api.mongodb.com/python/current/tutorial.html |
以上这些工具,我是非常推荐大家去经常使用的。它们代表着前沿的技术潮流,非常酷炫,用起来犹如回到未来。但是,在本篇博客中,我不会介绍如何在开发环境或者生产环境去安装这些工具。这些事情只能靠大家自己动手去实践,如果不知道从何开始,那就先准备好一杯尚好的咖啡,挨着点击上面的官网链接,花一个小时阅读里面的安装指南。
第二件事情就是在Github建立一个不太著名的开源项目(代码仓库)。
这是我的代码仓库地址,以enginploy命名:
https://github.com/william8188/enginploy
然后,用一个简单的命令下载已经建好的仓库:
git clone [email protected]:william8188/enginploy.git
非常简单,是不是。
如果大家还没准备好ssh公私钥来连接Github,可以点击下面的链接学习如何生成它:
https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/
All right, getting started the main mission. Where to find the rich companies? 36kr website !
万事俱备,开始今天的主要任务!但去哪找有钱的公司呢?我就以36氪为例吧。
开干之前,必须先检查robots.txt文件:
https://www.36kr.com/robots.txt
# robots.txt
User-agent: *
Disallow: /users
Disallow: /xiaozhi
Disallow: /asynces
Disallow: /goods
我是一个诚实谦虚的程序猿,我发誓我应该会遵守机器排他性协议并且合法地获取公开信息。大家也可以参考一下。
所以,我不可以直接抓取 /users
, xiaozhi
, /asynces
, /goods
这些URL路径。
在浏览网站几分钟后,我终于知道如何从查找到那些最近非常有钱的公司了。何种公司才算有钱呢?公开宣布融资信息算是一种。因此,我打算这么做:
import requests
URL = r'https://www.36kr.com/search/articles/36%E6%B0%AA%E9%A6%96%E5%8F%91'
r = requests.get(URL)
print(r.text)
一旦打印了request对象的text,就可以了解HTML格式的文本了。
from bs4 import BeautifulSoup
import re
html_stuff = r.text
soup = BeautifulSoup(html_stuff, 'html.parser')
script_list = soup.find_all('script', string=re.compile('window.initialState='))
print(len(script_list))
print(script_list[0])
那些文本有很多无效的信息,需要裁剪处理一下。
裁剪后,得到如下文本:
<script>window.initialState={"searchResultData":{"code":0,"data" ... script>
继续裁剪文本,然后获得一个干净的JSON格式的文本。
html_string = str(script_list[0])
html_string = html_string.replace('','')
json_string = html_string
print(json_string)
我把那个JSON格式的文本复制到这个网站上进行观察:
https://www.json.cn/
然后,我就可以清晰的知道在哪个层级获取文章标题。
{
"searchResultData":{
"code":0,
"data":{
"searchResult":{
"code":0,
"data":{
"items":[
{
"id":5169947,
"title":"36氪首发 | 做零售门店营销工具小程序,「企迈云商」获5000万元A轮融资",
"project_id":"1",
...
import json
json_dict = json.loads(json_string)
items = json_dict['searchResultData']['data']['searchResult']['data']['items']
titles = []
for item in items:
titles.append(item['title'])
print(item['title'])
处理后,会得到如下打印结果:
36氪首发 | 做零售门店营销工具小程序,「企迈云商」获5000万元A轮融资
36氪首发 |「新声信息技术」完成A轮融资,将建设多家新兴产业引领中心
36氪首发 | 母婴经济正当时,高端月子护理品牌「圣贝拉」获 5000 万元 A 轮融资
36氪首发 |「阿博茨科技」宣布完成 3000 万美元 B 轮融资,人工智能在金融领域落地加速
36氪首发 | 「iFaster 甄快」获 1000 万天使轮融资,想用快充解决方案切入电动车充电市场
这里,我用了正则表达式来提取公司名称,简单问题简单解决。
PATTERN = '.*「(.+)」.*'
infos = []
for title in titles:
if re.match(PATTERN, title):
res = re.search(PATTERN, title)
infos.append(
{
'name': res.groups()[0],
'title': title
}
)
Pretty close. Now I have store these infomation to MongoDB. But before that, hash code should be calculated.
今天的任务差不多要完成了,现在我只需要把这些公司信息存储到MongoDB就行了。但在此之前,先计算好哈希值,以此代表那些公司信息的唯一性。
import hashlib
for info in infos:
m = hashlib.md5()
m.update(info['title'].encode())
hashcode = m.hexdigest()
info['hashcode'] = hashcode
print(info['name'], info['hashcode'])
打印一下!
兰渡文化 f0ff5f576ca8f049514ed9a4e27c6a82
畅行智能 ffcc09b6431364a01f06f373f0aa26f3
捍宇医疗 0c7eb712f09cb5d2d4a8cc089d89b185
葡萄智学 40d7f2a903e448f6ed683817a181392c
锐吉科技 8c0bec2c846974cb59f13adcc51f6795
import pymongo
mongo_client = pymongo.MongoClient('mongodb://localhost:27017/')
db = enginploy_db = mongo_client['enginploy']
company_36kr = db['company_36kr']
for info in infos:
company_36kr.find_one_and_replace(
{'hashcode': info['hashcode']}, info, upsert=True)
经过处理后,我在命令行窗口检查MongoDB的数据情况,查询到如下结果:
> db.company_36kr.find()
{ "_id" : ObjectId("5c29e56338c7150eb0a59fcd"), "name" : "企迈云商", "hashcode" : "116f850e060823ae38425b493ef6f7b2", "title" : "36氪首发 | 做零售门店营销工具小程序,「企迈云商」获5000万元A轮融资" }
{ "_id" : ObjectId("5c29e56338c7150eb0a59fcf"), "name" : "新声信息技术", "hashcode" : "3321713e18ddd40a35b9109dd3ec0a35", "title" : "36氪首发 |「新声信息技术」完成A轮融资,将建设多家新兴产业引领中心" }
{ "_id" : ObjectId("5c29e56338c7150eb0a59fd1"), "name" : "圣贝拉", "hashcode" : "3565af0ab172c112a78be8ebee309f8c", "title" : "36氪首发 | 母婴经济正当时,高端月子护理品牌「圣贝拉」获 5000 万元 A 轮融资" }
大功告成。
现在,我终于完成今天的任务了,迈出了一小步,有点小开心。
说实在,当招聘工程学的想法从脑海中闪现出来时,我就决定花一个下午去整理开发环境,阅读必要技术文档,然后对程序进行一次又一次的调试。而且我非常喜欢在探究发现问题的同时写代码解决问题。
这里是招聘工程学第一集-寻觅有钱的公司。我希望大家喜欢这样全新的博客。我会继续推出更多招聘工程学的内容。我是小护士,我们下次再见。
注:中文版内容不是纯粹的翻译,对英文版内容有所补充。