招聘工程学 第二集 - 有钱公司在招什么人

招聘工程学 第二集 - 有钱的公司在招什么人

大家好,我是小护士,欢迎阅读招聘工程学第二集。今天,我们就一起来了解一下有钱的公司到底在招什么人吧。

为了能够达成目标,我们需要列出一个TODO LIST:

  1. 收集最近有融资信息的公司名称(参考第一集)
  2. 准备好一个Python库叫fake-useragent,用于随机生成User-Agent信息
  3. 从某boss官网根据公司名称查询相关职位信息,并存储到MongoDB。
  4. 检查一下最终收集了多少个职位信息。

忘了说,下面是我的Github仓库地址,代码都在那:
https://github.com/william8188/enginploy


工具

按照第一集的传统,先列出使用到的相关工具。

工具 概念 用途 官网链接
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库 连接Mongo http://api.mongodb.com/python/current/tutorial.html
Fake UserAgent Python库 生成随机的User-Agent https://github.com/hellysmile/fake-useragent

说实话,Fake UserAgent这个工具并不是必须要用的。你可以自己弄一个带有User-Agent信息的数组,在做网络请求的时候随机地选择数组中的元素作为HTTP协议请求头的内容之一。


有钱的公司在招什么人

读万卷书不如走万里路,现在开始动手!

1. 收集最近有融资信息的公司名称

import pymongo

# get companies from mongo
mongo_client = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongo_client['enginploy']
company_36kr = db['company_36kr']
companies = company_36kr.find()
mongo_client.close() 

这里的代码就做了几件事:

  • 新建一个MongoDB客户端连接对象,并开始尝试连接MongoDB。
  • 指明一个数据库,名叫enginploy
  • 执行一段查询任务,获取从第一集收集到的一堆公司名称
  • 最后,关闭客户端连接

2. 使用fake-useragent

正如fake-useragent仓库的README文件描述的那样,我们需要手动安装这个库。就像这样:

pip install fake-useragent

然后,在脚本中引入:

from fake_useragent import UserAgent

ua = UserAgent()

现在,我们就可以随意改变协议头信息了:

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
headers['User-Agent'] = ua.random

很简单,是不是 : )

3. 收集职位信息

还是和第一集一样手段,直接用Requests做网络请求,拿到HTML文本后用Beautiful Soup解析处理:

def main():

    # ignore query companies step
    
    URL = r'https://www.zhipin.com/job_detail/?{}'
    ua = UserAgent()
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
    for company in companies:
        param = urlencode({
            'position': '',
            'industry': '',
            'scity': 100010000,
            'query': company['name']
        })
        real_url = URL.format(param)
        headers['User-Agent'] = ua.random
        r = requests.get(real_url, headers=headers)
        soup = BeautifulSoup(r.text, 'html.parser')
        jobs = soup.find_all('div', class_='job-primary')
        mongo_client = pymongo.MongoClient('mongodb://localhost:27017/')
        db = mongo_client['enginploy']
        job_boss = db['job_boss']
        print('Get', company['name'])
        for job in jobs:
            loot(job, job_boss)

# ignore loot() detail

上面的代码处理逻辑如下:

  • 变更User-Agent内容
  • 请求目标URL,获取HTML文本内容
  • 提取关键内容
  • 连接MongoDB
  • 调用loot()函数

接着,看看loot()函数做了什么:

def loot(job, job_boss):
    job_name = job.select(
        'div.info-primary > h3 > a > div.job-title')[0].string
    job_salary = job.select('div.info-primary > h3 > a > span.red')[0].string
    job_tags = job.select('div.info-primary > p')[0].contents
    job_tags = rm_vline(job_tags)
    company_name = job.select('div.info-company > div > h3 > a')[0].string
    company_tags = job.select('div.info-company > div > p')[0].contents
    company_tags = rm_vline(company_tags)
    job_publish = job.select('div.info-publis > p')[0].string
    hash_raw = '{},{},{}'.format(job_name, job_salary, company_name)
    m = hashlib.md5()
    m.update(hash_raw.encode())
    hashcode = m.hexdigest()
    info = {
        'job_name': job_name,
        'job_salary': job_salary,
        'job_tags': job_tags,
        'company_name': company_name,
        'company_tags': company_tags,
        'job_publish': job_publish,
        'hashcode': hashcode
    }
    job_boss.find_one_and_replace({'hashcode': info['hashcode']}, info, upsert=True)
    print(info['job_name'],info['job_salary'],info['company_name'],info['job_tags'],info['company_tags'],info['job_publish'])


def rm_vline(tags):
    return [str(x).replace(r'\'', '') for x in tags if x != None and str(x) != '']


loot()函数逻辑如下:

  • 提取文本
  • 计算职位信息的哈希值
  • 更新插入到MongoDB

4. 检查一下收集了多少职位

在MongoDB Shell查一下collection信息:

> db.job_boss.count()
725

总共,抓了725个职位信息。看过代码的你或许会知道,我们只是把搜索结果页的第一页信息进行收集,并没有进行跳页大规模收集。毕竟君子爱数据,取之有道,下手不能太狠,做人要有底线。

这里列出一下部分收集样本:

产品助理 5k-7k 圣贝拉母婴月子会所 ['珠海  ', '3-5年', '大专'] ['医疗健康', 'A轮', '100-499人'] 发布于12月11日
设计师 8k-12k 圣贝拉母婴月子会所 ['珠海  ', '1-3年', '本科'] ['医疗健康', 'A轮', '100-499人'] 发布于12月13日
大数据研发总监 35k-65k 阿博茨科技 ['北京 海淀区 清河', '5-10年', '本科'] ['互联网', 'A轮', '100-499人'] 发布于11月21日
搜索算法专家 30k-60k 阿博茨科技 ['北京 海淀区 清河', '3-5年', '本科'] ['互联网', 'A轮', '100-499人'] 发布于05月04日
Java高级开发工程师 20k-35k 葡萄智学 ['北京 海淀区 五道口', '3-5年', '本科'] ['在线教育', '天使轮', '100-499人'] 发布于09月13日
Java技术经理/架构师 25k-45k 葡萄智学 ['北京 海淀区 五道口', '3-5年', '本科'] ['在线教育', '天使轮', '100-499人'] 发布于12月04日
搜索研发(高级)工程师 15k-30k 小熊博望 ['北京 海淀区 西二旗', '1-3年', '本科'] ['互联网', '未融资', '100-499人'] 发布于12月17日
后端研发(高级)工程师 15k-30k 小熊博望 ['北京 海淀区 西二旗', '1-3年', '本科'] ['互联网', '未融资', '100-499人'] 发布于12月17日
核算会计 3k-5k 融易算 ['青岛  ', '经验不限', '大专'] ['企业服务', '天使轮', '500-999人'] 发布于11月16日
会计主管 6k-10k 融易算 ['青岛  ', '3-5年', '大专'] ['企业服务', '天使轮', '500-999人'] 发布于11月16日
JAVA工程师 15k-30k 乐行科技 ['广州 天河区 五山', '3-5年', '本科'] ['互联网', 'A轮', '100-499人'] 发布于10月15日
产品运营 12k-20k 乐行科技 ['广州 天河区 五山', '1-3年', '本科'] ['互联网', 'A轮', '100-499人'] 发布于11月19日
Java 10k-20k 乐行科技 ['广州 天河区 五山', '1-3年', '本科'] ['互联网', 'A轮', '100-499人'] 发布于07月04日

任务完成了

我们成功了!算一下,我们现在手头上有一堆刚宣布自己融资的有钱公司,还有他们的职位信息。在下一集,我们将会对这些数据进行可视化处理,并从中尝试总结一些经验。感谢大家的支持,我们下次再见。

你可能感兴趣的:(ENGINPLOY,招聘工程学,小护士,python,fake-useragent)