众所周知爬虫是用python编程语言实现的,主要用于网络数据的抓取和处理,例如爬取豆瓣电影TOP250、爬取小说等等...
而爬取岗位对于刚毕业的大学生也是非常有必要的,下面我们来看看如何实现吧(用到的编程工具是python3.7)
一、抓取岗位信息
1.导库
2.模拟浏览器发起请求
3.数据存储
二、数据清洗
三、数据可视化
1.学历要求玫瑰图
2.工作经验要求漏斗图
3.大数据城市需求分布图
四、项目改进
1.改进一
2.改进二
一、抓取岗位信息
1.导库
简单方法:cmd中输入pip install 库名
urllib.request用于模拟浏览器发起HTTP请求
xlwt库是支持python语言对excel表格操作的
re库则是用于对字符串进行正则表达式的匹配和替换
pandas库是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。
读取爬取到的excel表格
这一部分主要使用pycharts来编辑图表,主要库如下图
2.模拟浏览器发起请求
首先指明请求爬取资源的域名'Host':'search.51job.com'
最关键的是使用正则表达式,弄懂字符串是如何存放到正确列表的,例如像findall,就是在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回列表
3.数据存储
二、数据清洗
清洗数据,有空值就删除整行,信息错乱的也删除整行
经数据清洗后的数据
三、数据可视化
使用pandas对第二个excel表格进行操作
-
\d
匹配一个Unicode数字,如果带re.ASCII,则匹配0-9
-
?
匹配前面的字符0次或1次
-
*
匹配前面的字符0次或多次
-
+
匹配前面的字符1次或者多次
#add()用于添加图表的数据和设置各种配置项;
#render()生成.html文件;
#地图的基本使用方法,add_schema()表示增加一个框架,导入地图
#set_series_opts()可设置标签等
#set_global_opts(),也可以设置很多配置项,如:标题、工具箱等
1.学历要求玫瑰图
2.工作经验要求漏斗图
3.大数据城市需求分布图
四、项目改进
以上就是爬岗位项目的所有内容啦,在做完这些内容以后,我和我的小伙伴还想到了一些改进,例如可以增加更多的数据清洗,或者做出更多方便分析岗位情况的图表;关键代码如下:
1.改进一
#转换薪资单位
b3 =u'万/年'
b4 =u'千/月'
li3 = a['薪资']
for i in range(0,len(li3)):
try:
if b3 in li3[i]:
x = re.findall(r'\d*\.?\d+',li3[i])
#print(x)
min_ = format(float(x[0])/12,'.2f') #转换成浮点型并保留两位小数
max_ = format(float(x[1])/12,'.2f')
li3[i][1] = min_+'-'+max_+u'万/月'
if b4 in li3[i]:
x = re.findall(r'\d*\.?\d+',li3[i])
#print(x)
#input()
min_ = format(float(x[0])/10,'.2f')
max_ = format(float(x[1])/10,'.2f')
li3[i][1] = str(min_+'-'+max_+'万/月')
print(i,li3[i])
except:
pass
2.改进二
min_s=[] #定义存放最低薪资的列表
max_s=[] #定义存放最高薪资的列表
for i in range(0,len(experience)):
min_s.append(salary[i][0])
max_s.append(salary[i][0])
#matplotlib模块如果显示不了中文字符串可以用以下代码
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
my_df = pd.DataFrame({'experience':experience, 'min_salay' : min_s, 'max_salay' : max_s}) #关联工作经验与薪资
data1 = my_df.groupby('experience').mean()['min_salay'].plot(kind='line')
plt.show()
my_df2 = pd.DataFrame({'education':education, 'min_salay' : min_s, 'max_salay' : max_s}) #关联学历与薪资
data2 = my_df2.groupby('education').mean()['min_salay'].plot(kind='line')
plt.show()