【Python趣味干货系列】第三期:如何利用Python爬虫,获取招聘网站岗位数据
千锋python
2021年04月21日 11:13
收录于文集
共34篇

虽说年后的招聘高峰期已到尾声,但是我们还是可以通过Boss直聘、拉勾等网站获取更多的招聘信息加以分析。

前两天看到一篇文章说今年招聘销售最吃香。那我们就以北京的【销售岗位分析】作为我们本次文章的干货的分享。

本次的干货整体的思路是:

代码块
JavaScript
自动换行
复制代码
1.使用Python爬虫获取更多的职位信息
2.进行数据展示和清洗
3.可视化展示
复制成功

第一部分爬取职位信息

我们本次获取的是Boss直聘的信息,我们打开Boss直聘搜索🔍【销售】,但是很遗憾boss直聘的反爬措施不能直接使用requests库获取信息,所以采用webdriver自动化方式获取网页源代码。

代码块
JavaScript
自动换行
复制代码
webdriver的使用需要大家:
pip3 install selenium
配置chrome浏览器的chrome driver。
a. 查看当前chrome浏览器的版本,在浏览器的地址栏输入:chrome://version
b. 去这个网址下载对应版本的driver:http://npm.taobao.org/mirrors/chromedriver/
c. 将下载的chromedriver放到
Win:复制webdriver到Python安装目录下 Mac:复制webdriver到/usr/local/bin目录下
复制成功

这是webdriver就可以使用啦!下面开始在浏览器查询【销售】,查询后的页面如下:

点击了多页之后,发现地址栏的地址变化如下:

代码块
JavaScript
自动换行
复制代码
https://www.zhipin.com/c101010100/?query=销售&page=1&ka=page-1
https://www.zhipin.com/c101010100/?query=销售&page=2&ka=page-2
https://www.zhipin.com/c101010100/?query=销售&page=3&ka=page-3
复制成功

所以我们就发现了地址的规律变化,因此代码如下:

代码块
JavaScript
自动换行
复制代码
import re,matplotlib,time,random   #导入正则表达式,绘图,时间,随机模块
from bs4 import BeautifulSoup    #BeautifulSoup用于处理获取的网页数据
import pandas as pd   #数据分析必备类库
import seaborn as sns   #绘图模块
from selenium import webdriver   #自动化控制浏览器模块

job="销售"      #设置需要爬取的职业信息
page=6         #设置爬取页数
htmls_list =[] #建立网页信息存储列表
for num in range(1,page,1):
    url = "https://www.zhipin.com/c101010100/?query={}&page={}&ka=page-{}".format(job,num,num)
    driver=webdriver.Chrome()   #初始化webdriver
    driver.get(url)  #自动化运行页面
    time.sleep(8)  # 爬取的时候网速比较慢,所以打开的时候加了一个延时,保证能获取到数据
    htmls=driver.page_source #获取页面信息
    htmls_list.append(str(htmls)) #将获取页面信息添加至网页存储列表
    driver.close() #关闭浏览器 
    ran_time = random.randint(10,20) #随机生成停顿时间
    time.sleep(ran_time) #程序休眠  
print(htmls_list)
复制成功

此时执行代码,发现htmls_list中有好多的数据。

这下也就放心了,说明我们获取到了网页的数据。

有了数据我们就开始遍历htmls_list,因为htmls_list存放着多页的数据,我们要一页一页的获取并提取里面的职位、薪资等信息。

提取的过程我们使用的是BeautifulSoup,具体的使用说明这里不在赘述,大家可以查看文档。https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

使用BeautifulSoup提取的数据我们都存放在job_list=[]这个列表中。页面分析如下:

岗位名称

以此类推,我们都可以找到对应的标签。这里就不再逐个截图给大家展示

通过chrome的开发者工具帮助我们分析,我们可以得到如下的代码:

代码块
JavaScript
自动换行
复制代码
job_list=[]   #建立获取职位信息存储列表
for htmls in htmls_list:
    soup= BeautifulSoup(htmls) #解析网页    
for i in soup.find_all("div", class_="job-primary"):
        job = i.find_all("a")  #获取招聘岗位信息
        area = i.find_all('span', class_='job-area') #获取工作地点 
        salary = i.find_all('span', class_='red') #获取薪酬信息
        title = i.find_all("h3")[1].get_text() #获取企业名称
        industry = i.find_all('a',class_="false-link")[0].get_text() #获取所属行业
        edu = i.find_all('p')[0].text  #获取学历要求
        scale = i.find_all('p')[1].text #获取条件信息
        url = "https://www.zhipin.com/" + i.find_all("div", class_="primary-box")[0]['href'] #获取详情页信息
        job_list.append([title, industry, job[0]['title'],area[0].get_text(),edu,scale, salary[0].get_text(),url])#将所有信息保存至列
复制成功

到此我们就完成了所有爬虫部分的内容,其中比较关键的知识点就是通过Beautifulsop模块解析到所需内容。

第二部分数据清洗

这样我们就将所有的信息保存到了job_list中,下面我们就开始数据分析和展示了,使用Pandas加载数据

代码块
JavaScript
自动换行
复制代码
data = pd.DataFrame(job_list,columns=['企业名称', '所属行业', '招聘岗位', '工作地点', '条件', '企业信息', '薪资','URL'])
复制成功

看一下加载出来的数据:

在数据可视化前我们要对数据进行简单的处理,比如去重、整理薪资的数据类型为数值型。

去重我们使用drop_duplicates对企业名称进行去重,使用正则和lambda进行数值类型转换。

代码块
JavaScript
自动换行
复制代码
data =data.drop_duplicates(subset='企业名称',keep='first') 
#将数据按照招聘企业去重处理 
data['max_salary'] = data['薪资'].map(lambda x:re.findall("-(\d.*?)K", x)[0])
data['max_salary'] = data['max_salary'].astype(int) *1000
#通过正则表达式获取薪资的最大值,并整理为数值型

data['min_salary'] = data['薪资'].map(lambda x:re.findall("(\d.*?)-", x)[0])
data['min_salary'] = data['min_salary'].astype(int) *1000
#通过正则表达式获取薪资的最小值,并整理为数值型

data.head()
复制成功

查看数据发现多出来了两列的内容就是:薪资的最大值和最小值

按照所属的行业进行分组查看,分别获取各个行业的最高薪资的平均值和最低薪资的平均值

代码块
JavaScript
自动换行
复制代码
df1 = data.groupby("所属行业")['max_salary'].mean().round(2).reset_index().rename(columns={"max_salary":"salary"})
df2 = data.groupby("所属行业")['min_salary'].mean().round(2).reset_index().rename(columns={"min_salary":"salary"})
最高薪资部分数据:
复制成功

最高薪资部分数据:

最低薪资部分数据:

现在我们要把最高和最低整合到一张表中,我们就使用到了concat表的连接。

代码块
JavaScript
自动换行
复制代码
# 分别对df1和df2添加标签label
df1['label'] = 'max_salary'
df2['label'] = 'min_salary'
df = pd.concat((df1,df2))
复制成功

查看结果如下:

第三部分数据可视化

接下来进行可视化显示

代码块
JavaScript
自动换行
复制代码
from matplotlib import pyplot  as  plt
# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
%config InlineBackend.figure_format = 'svg'
# 设置大小
plt.figure(figsize=(15,6))
sns.barplot(x='所属行业',y='salary',hue='label',data=df, palette="Set2")
复制成功

可视化后的结果是:

当然大家也可以获取多个城市的职位信息,按照城市分组查看。

如何获取多个城市的信息呢?查看链接发现链接:https://www.zhipin.com/c101010100/?query=销售&page=1&ka=page-1

中【c101010100】为城市代码,城市代码也可以通过https://www.zhipin.com/wapi/zpgeek/common/data/citysites.json获取所有城市的代码。需要大家通过requests获取后进行json解析就可以获取,结构很简单。

OK!剩下交给各位了!赶快试试看吧!