目标
爬取前程无忧北上广深各国际学校招聘信息,统计一线城市国际学校员工(老师,非老师)薪酬水平。可用数据实际不够准确,数量很少,这里只是提供一套demo进行一遍操作。原始数据如下:
环境搭配
- Useful Packages
- requests,与服务器建立连接
- beautifulsoup, 抓取网页信息
- xlwt,可将所爬取数据存入Excel
- pandas, numpy 数据清理
- plotnine python里调用R语言的可视化包ggplot
- Anaconda - Jupyter Notebook
难点
这里不想过多说怎么具体爬取页面,网上有很多类似例子并不难,最后页我也附录了爬虫代码。主要讲一下爬取这类招聘网站所遇到的难点。
学校名称匹配
- 其实只是单一的爬取数据并不复杂,网上有很多共享代码。那么问题来了!第一,如果规定好了几所国际学校,所爬取数据应该只包含这几所国际学校;第二;由于招聘网站上录入学校名称并不一定完全和真正的名称一致,从而导致错失了一部分数据,例如‘深圳益田国际学校’有可能在招聘网站上显示为‘深圳益田国际部‘,但其实两者一样。 程序并不会帮你自动区分其中区别。
薪酬单位
- 薪酬不统一。原始数据中,薪酬被分为(万/月,万/年,千/月,元/天)。
解决方案
学校名称匹配
- 利用正则表达也就是 regular expression 检索每一条所爬数据,如果符合条件则爬下来并储存,否则就跳过检索下一条。举个例子,前程无忧上某一条要爬数据显示学校名称为‘深圳益田国际部’ 我们可以通过建立一个字典即dictionary 储存关键字‘益田’和‘国际’,从而省略检索最后一个‘部’使其同时可匹配学校两字。唯一不足是字典需要手动判断并输入关键字。代码如下:
# 交大可匹配:交大剑桥或者交大国际
d_guangzhou = {
'英国': '学校', '华南师范': '国际',
'交大': '剑桥|国际', '第二外国语': '国际'
}
for key, value in d_shenzhen.items():
regexp_key = re.compile(r'{}'.format(key)) # 匹配第一个词
regexp_value = re.compile(r'{}'.format(value)) # 匹配第二个词
if regexp_key.search(company) and regexp_value.search(company): # 如果两个字同时存在于所检索的company中
# Extact the data
薪酬单位
- 同样还是利用正则表达。匹配‘万千元’以及‘月年天’,统一薪酬单位为每月收入多少万。代码如下:
# 创建新的dataframe"薪水_万每月"
job["薪水_万每月"] = ''
for i in range(len(job["薪水"])):
str