爬取实习吧与python相关的招聘信息及分析与数据可视化

大数据时代,计算机行业蓬勃发展,越来越多的人投身计算机事业养家糊口。所以该如何选择工作,现在社会需要怎么样的计算机人才,我们该如何对应的提升自己的本领都是尤为重要的。这篇文章就是对实习吧招聘网站有关python职位信息的一个简单分析与可视化。希望通过这些数据,能得到隐藏的数据背后的秘密。让我们来一起探索吧。


本文就实习吧招聘网站上截止到2020年12月31号有关于python相关的招聘信息共109条做一个简单的爬取和数据分析,尚有很多不足。如有任何错误或纰漏,欢迎指出讨论。

数据爬取

将实习吧刺猬实习里面有关python职位的招聘信息爬取出来,保存在一个CSV文件中。查看招聘网站可以发现,一共有109条数据,其中包含已下架的招聘信息。虽然这部分下架的招聘信息看起来是毫无意义,但其实也能通过其中获取到很多有用的信息。

爬取后的是保存在CSV文件中,文件部分内容如下图所示,爬取的内容主要包含了工作名称、公司名称、公司所在城市、招聘需求学历、实习工资、实习时间、职位描述、公司其他职位以及公司的一下说明:
在这里插入图片描述
就这些数据我们就可以对其进行分析可视化,获得数据背后隐藏的秘密

数据爬取部分的代码如下所示:

import requests
from bs4 import BeautifulSoup
import os.path
import json
import os
import csv

import io
import sys

import jieba
import wordcloud

import traceback
import cgitb

#要加上这一句和import 否则后续一直会报'gbk'的错误
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')#'gb18030'

class shixi():

	#发爬虫机制,加Headers,异常处理URLError类,用try-except语句来包围并捕获相应的异常
	def get_html(self,url):
		try:
			headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'}#伪装爬虫
			resp = requests.get(url, headers = headers)
			return resp.text
		except:
			print ('url is wrong') #异常后输出语句
			

	#将爬取信息存入CSV操作
	def dict2cvs(self,dic,filename):

		file_exists=os.path.isfile(filename)
		#a访问方式为追加,newline=''是为了防止写入的文件总有空行的问题
		with open(filename,'a',encoding='utf-8',newline='') as f: 
			
			headers=dic.keys()
			w =csv.DictWriter(f,delimiter=',', lineterminator='\n', fieldnames=headers)
			
			if not file_exists :
				w.writeheader()

			#writerow()逐行写入,writerrow()是多行写入
			w.writerow(dic)
		print('当前行写入csv成功!')	

	#爬取职位信息页面
	def draw_base_list(self,url):
		html = self.get_html(url)

		##json.loads 实现json字符串转化为python的数据类型
		data = json.loads(html)
		try:
		#json的语法 "[]"迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)这样就将lists选择出来
			news = data['data']['lists']
			for n in news:

				jobid=n['jobid']
				#二级页面的URL,这个网址就用来爬取职位描述,因为这一部分是静态的
				url2='https://www.ciwei.net/internship/job/'+str(jobid)

				#这个网址是用来爬其他职位的网址,这是一个动态的,所以虽然和上面都在一个网页,但是网址不一样
				company_id=n['company_id']
				url3='https://www.ciwei.net/api/Shixi_V2_Job/getJobByCid?page=1&pageSize=10&company_id='+str(company_id)

				title = n['title']    
				comfullname = n['comfullname'] 
				comname = n['comname']
				cityName = n['cityName']
				education = n['education']  
				salary = n['salary']  
				fulltime_type_string = n['fulltime_type_string'] 
				label= n['label']
				dat2={
					'city':cityName
				}
				self.dict2cvs(dat2,'城市信息.csv')
				self.draw_detail_list(url2,url3,jobid,title,comname,cityName,education,salary,fulltime_type_string,label)	
		except Exception as e:
		# except Exception,e:#这样会报错,SyntaxError: invalid syntax,因为except Exception, e: 这个语法需要用python2版本去运行,我们使用的是python3。所以要换成except Exception as e:
			print(repr(e))
			print('draw_base_list is wrong')
		pass


	#爬取二级详情页
	def draw_detail_list(self,url,url1,jobid,title,comname,cityName,education,salary,fulltime_type_string,label):
	# def draw_detail_list(self,url):
		#职位描述部分
		html = self.get_html(url)
		soup=BeautifulSoup(html,'lxml')
		#爬取职位描述的部分
		try:
			lilist=soup.find('ul',{'class':'job-desc___3cBCa'})
			l=lilist.find_all('span')
			l2=lilist.find_all('h5')#是ResultSet类型不能写'.text'# print(type(l[0]))可迭代 类型Tag 就可以写'.text'
			s=''
			s4=''
			for i in range(len(lilist)):
				s=l2[i].text.strip()+l[i].text.strip()+'\n'+'\n'
				s4=s4+s
			#爬取其他职位部分,因为是动态网页,所以要重新用json解析一下
			html1 = self.get_html(url1)
			data1 = json.loads(html1)
			news1 = data1['data']['jobList']
			t=''
			for n in news1:
				tit=n['title']+'\n'
				t=tit+t
			print(t)
			dat={
				'jobid':jobid,
				'工作名称':title,
				'公司名称':comname,
				'城市':cityName,
				'要求学历':education,
				'工资':salary,
				'实习时间':fulltime_type_string,
				'职位描述':s4,
				'其他职位':t,
				'说明':label
				}
			dat1={
				'职位描述':s4,
			}
			#将信息存入CSV文件
			self.dict2cvs(dat1,'职位描述.csv')
			self.dict2cvs(dat,'所有信息.csv')

		#捕捉异常并输出错误信息
		except Exception as e:
			print(repr(e))
			print('draw_detail_list is wrong')
		pass

s=shixi()
if __name__ == '__main__':
	print('爬取实习吧')
	for page in range(1,12):
		url='https://www.ciwei.net/api/Shixi_Pc/search?city=0&getCount=1&key=Python&s_c=1&page='+str(page)+'&source=pc'
		print(url)
		s.draw_base_list(url)
	pass


数据处理

爬取后保存在CSV文件中的样式就是如最上面那个图一样,然后我们就对这些数据来进行处理,因为不是所有的数据都是有用的,我们可以选择性的对数据先处理一遍,使之成为我们需要的东西,在对数据进行可视化分析

对数据处理使用的是jupyter notebook。

读取文件

import pandas as pd
import random
import ipywidgets as widegts
data=pd.read_csv(r'C:\Users\DELL\Desktop\Python\答辩\所有信息.csv',encoding='utf8')
data

删除无意义列

文件存储里的jobid列是网页获取时的一个关键id,根据jobid我们就可以构造网页从而进行后续的爬取,但是对于我们现在的有关招聘信息的数据分析来说是没有意义的,所以我们就将其删除掉。对于其他职位来列来说也是,因为我们是分析跟python有关的这些招聘信息,所以对于这个公司还招聘的其他职位我们目前不做分析,也就将这一行删除掉

删除使用的是drop()方法;最后就留下了工作名称、公司名称、城市、要求学历、工资、实习时间、职位描述、说明这几列数据

#删除jobid和其他职位列
data=data.drop(columns=["jobid","其他职位"])#这两种都是删除列的方法
data

删除重复的值

因为有些公司可能发布重复的招聘信息,所以将职位名称和公司名称相同的招聘信息删除掉

运用data.duplicated(subset=[])方法,首先查询一共有多少个重复的行,得到的结果是有19行是重复的数据

#检查是否有重复的行
duplicated_data=data.duplicated(subset=['工作名称','公司名称'])
data=data[duplicated_data]
len(data)

#19

然后就将重复的行删除掉,一共有109行把重复的19行删除掉那么就剩下90行数据

# 删除掉重复的行,只保留最开始出现的
data.drop_duplicates(subset=['工作名称','公司名称'], keep='first', inplace=True)
data
len(data)

#90

数据可视化

工资信息可视化

对于工资,各个公司提供的工资表示范围不完全不同,有些是以天为单位,有些是以月为单位,有些是面议,故不能直接比较大小判断工资水平,所以我选择了饼图来展示,对所有出现了的工资情况总体画一个饼图,根据工资的占比情况来分析各个公司的招聘工资情况

首先是将所有的工资情况和每个工资出现了多少次计算出来生成data2

data1=data.drop_duplicates(subset=['工资'])
data2=pd.DataFrame(data1['工资'],columns=['工资'])
data2['工资数']=[len(data[data['工资']=='200-300元/天']),len(data[data['工资']=='120-180元/天']),
              len(data[data['工资']=='150-200元/天']),len(data[data['工资']=='150-300元/天']),
              len(data[data['工资']=='面议']),len(data[data['工资']=='300-500元/天']),
              len(data[data['工资']=='100-180元/天']),len(data[data['工资']=='100-150元/天']),
              len(data[data['工资']=='1-2K/月']),len(data[data['工资']=='2-4K/月']),
             len(data[data['工资']=='4-6K/月']),len(data[data['工资']=='60-100元/天'])]
data2

在这里插入图片描述
一共有12种薪资情况,再根据次数画出饼图如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

#解决汉字乱码问题
matplotlib.rcParams['font.sans-serif']=['SimHei']  #使用指定的汉字字体类型(此处为黑体)

plt.figure(figsize=(6,6))
label=data2['工资'].values.tolist()
explode=[0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01]

plt.pie(x=data2['工资数'].values.tolist(),explode=explode,labels=label,autopct='%1.1f%%')
plt.title('工资分布情况')
plt.savefig('饼图.png')
plt.show()

在这里插入图片描述
注意一点如果在图中是有汉字的话,要对编码进行处理,否则汉字是显示不出来的,例如matplotlib.rcParams[‘font.sans-serif’]=[‘SimHei’]这个就是将指定汉字为黑体

折线图:

# 定义画图的数据
x = data2.工资
y = data2.工资数

# 定义颜色
color1 = '#0085c3'
color2 = '#7ab800'
color3 = '#dc5034'

# 设置图像大小
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111)

# 绘制折线图
ax.plot(x, y, marker='o', color=color1)

在这里插入图片描述

 150-200元/天换算过来即为4500-6000/月,所以可以看出工资占比4-6K/月是占比最多的,剩下200-300元/天即6-9K/月
 的工资也比其他占比大一些,由图也可以看出面议的占比也不算少数,所以也会有较多公司选择面议的方式来决定工资,
 也就是取决于个人的水平了

城市信息可视化

一样的先统计所有招聘信息出现的城市,并且统计次数

data1=data.drop_duplicates(subset=['城市'])
data2=pd.DataFrame(data1['城市'],columns=['城市'])
data2['城市数']=[len(data[data['城市']=='上海']),len(data[data['城市']=='深圳']),len(data[data['城市']=='杭州']),len(data[data['城市']=='北京']),
             len(data[data['城市']=='广州']),len(data[data['城市']=='无锡']),len(data[data['城市']=='厦门']),len(data[data['城市']=='武汉']),
             len(data[data['城市']=='南京']),len(data[data['城市']=='沈阳']),len(data[data['城市']=='长沙']),len(data[data['城市']=='大连']),
             len(data[data['城市']=='西安']),len(data[data['城市']=='成都'])]
    
data2

得到的结果:
在这里插入图片描述
将这些情况画成柱状图

plt.rcParams['figure.figsize']=[13,8]#这是这个表的大小

lable=data2['城市'].values.tolist()#刻度标签
plt.bar(range(14),data2['城市数'].values.tolist(),width=0.5)#14根柱子,对应值,宽度


#下面两个是x轴,y轴的表是的是啥
plt.ylabel('城市数',fontsize=15)
plt.xlabel("城市",fontsize=15)

#每一个柱子代表的城市
plt.xticks(range(14),lable)
plt.title('招聘城市情况')
plt.show()

在这里插入图片描述
画成散点图:

data2.plot.scatter(x='城市',y='城市数')

在这里插入图片描述
折线图:

# 定义画图的数据
x = data2.城市
y = data2.城市数

# 定义颜色
color1 = '#0085c3'
color2 = '#7ab800'
color3 = '#dc5034'

# 设置图像大小
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111)

# 绘制折线图
ax.plot(x, y, marker='o', color=color1)

在这里插入图片描述

	清楚的可以看到对于python相关职业的招聘,北上广这样的大城市是更多的。尤其是北京,所以如果想找
	有关与python方面的工作的话,北上广是不错的选择,其次就是武汉、深圳、南京这三个城市,就业机会
	也相对多一点。有想从事这方面的工作的伙伴们,这几个城市是不错的选择呀。

同时对与城市信息也可用词云图来分析,在爬取的时候就顺便将城市信息单独保存了一个CSV文件,所以直接读取文件生成词云即可

f=open('C:/Users/DELL/Desktop/Python/答辩/城市信息.csv',encoding='utf-8')
t=f.read()
f.close()
l=jieba.lcut(t)
string=' '.join(l)
w=wordcloud.WordCloud(background_color='white',font_path='C:/Windows/Fonts/STKAITI.TTF',width=1000,height=900,)#font_path是字体,
w.generate(string)#向wordcloud对象w中加载文本txt
w.to_file(r"城市.png")#将词云输出为图像文件

图片生成如下
在这里插入图片描述

	由词云图片看到的信息也跟上面的柱状图是一样的。北京是就业机会最多的。其次是上海、广州,在就是深圳、武汉、南京。
	所以想要从事这方面的伙伴们也要冲冲冲。北上广机会多,但是挑战也多。所以还是要丰富自己了才能找到好的工作。

实习时间信息可视化

先对实习时间总体做一个统计,得到这样一个结果
在这里插入图片描述
然后将其画成饼图

plt.figure(figsize=(6,6))
label=data2['实习时间'].values.tolist()
explode=[0.01,0.01,0.01]

plt.pie(x=data2['实习时间数'].values.tolist(),explode=explode,labels=label,autopct='%1.1f%%')
plt.title('实习时间分布情况')

plt.show()

结果如下
在这里插入图片描述

	由图我们可以看出,对于所有的招聘,实习时间都是要求至少3或4或5天,对于要求至少4天、5天的公司占多数

把实习时间和城市做一个撒点图来看一下之间的关系:

data.plot.scatter(x='实习时间',y='城市')

得到的图就如下所示:
在这里插入图片描述

	同样的,通过散点图也可以看到选择实习至少4天和5天的公司占大多数。选择三天的城市都比较少了。通俗来说一般实习
	公司还是希望你能实习久一点,那些干几天就放弃的人公司一般来说是不会喜欢的。

Jieba分词对职位描述可视化

首先我们来对Jieba做一个简单的介绍
(1) jieba库概述:jieba是优秀的中文分词第三方库

  • 中文文本需要通过分词获得单个的词语
  • jieba是优秀的中文分词第三方库,需要额外安装
  • jieba库提供三种分词模式,最简单只需掌握一个函数

(2) jieba分词的原理: Jieba分词依靠中文词库

  • 利用一个中文词库,确定汉字之间的关联概率
  • 汉字间概率大的组成词组,形成分词结果
  • 除了分词,用户还可以添加自定义的词组

(3) jieba分词的三种模式:精确模式、全模式、搜索引擎模式

  • 精确模式:把文本精确的切分开,不存在冗余单词
  • 全模式:把文本中所有可能的词语都扫描出来,有冗余
  • 搜索引擎模式:在精确模式基础上,对长词再次切

(4) jieba库常用函数
在这里插入图片描述
注意到有.cut()和.lcut()这两种方法。lcut()就是返回的列表类型,对于我们后续在进行一下操作来说会更加方便一点。

在本文就是用的就是Jieba._lcut(a)进行分词。在进行分词时由于需要分词的句子或者段落中包含一些语气助词、副词、介词、连接词等通常自身并无明确意义却大量存在的词语,如的、在、于是、因此、一般、无论等等之类的词语,称之为停用词,需要在分词的时候将这些停用词处理掉。本文在进行分词处理的时候也将句子进行了去停用词的处理。同时在这些招聘信息上经过反复的提取查看也发现了很多在句子中没有实际意义且还频繁出现的词语,例如具有、深入、熟悉、良好、较好、使用、描述、获得、职位、任职等词语。这些无意义的都添加进入停用词表。

然后通过stopwords = [line.strip() for line in open(‘C:/Users/DELL/Desktop/stopwords.txt’,encoding=‘UTF-8’).readlines()]这样去除停用词。

在分词的时候还需要添加自定义的词表以便包含 Jieba 词库里没有的词,像开源框架、设计模式、MySQL、RTOS、GitHub、GitLab、DevOps、Linux、shell、STM32、大数据等一些不希望在分词的时候被分隔开,所以将这些词语添加到自定义词表中去,再通过 jieba.load_userdict(“C:/Users/DELL/Desktop/自定义.txt”)加载自定义词表。这样在进行分词的时候就不会将这些词语分开,虽然 Jieba 有新词识别能力,但是自行添加新词可以得到更好的分词效果。

这是我整理好的停用词表和自定义文件:链接(百度网盘):https://pan.baidu.com/s/12Lkb7kLahKm8h_ilnAXmhQ
提取码:k9xh
有需要的可以自取。这个停用词表也是参考了其他人已经做好的。后续根据需要在自行添加了一些。

这是这一部分的完整代码,职位描述已经提前保存好到CSV文件中。

import jieba
import wordcloud
from jieba import load_userdict
jieba.load_userdict("C:/Users/DELL/Desktop/自定义.txt")#载入自定义词典:每一行包括词语、词频(可省略)、词性(可省略)
import jieba.posseg as pseg

  # 创建停用词列表
def stopwordslist():
	stopwords = [line.strip() for line in open('C:/Users/DELL/Desktop/stopwords.txt',encoding='UTF-8').readlines()]
	return stopwords

f1=open('C:/Users/DELL/Desktop/Python/答辩/职位描述.csv',encoding='utf-8')
t1=f1.read()
stopwords = stopwordslist()

l1=jieba.lcut(t1)
outstr = ''
for word in l1:
	print(word)
	print('------------')

for word in l1:
	if word not in stopwords:
		if word != '\t':
			outstr += word
			outstr += " "

w1=wordcloud.WordCloud(background_color='white',font_path='C:/Windows/Fonts/STKAITI.TTF',width=1200,height=1200,)#font_path是字体,
w1.generate(outstr)
w1.to_file(r"职位描述1.png")

得到的词云图片为:
在这里插入图片描述

我们来仔细看一下这个词云图片,Python当然是重中之重,既然是要找有关与python的工作。那么python的技术一定要过硬
再来看其他几个醒目的单词有维护、沟通、设计、数据分析、编程、本科以上学历、强、Linux等这些。说明找工作首先还是要自身本领过硬,同时工作更多的还是一个团队合作的事情,沟通能力等也是要较好的。
所以说要想找到好的工作我们还是要自身本领强硬,只有身上有本领就不会愁没饭吃

对于公司的说明词云可视化

还是按照上述一样的方法运用停用表和自定义词表来生成词云图片。

得到的结果如下图所示:
在这里插入图片描述

	可以看到,对于大多数公司来说招揽人才都会选择有职业发展机会有更高的发挥空间、有助于职业帮助的这样语句。
	因为对于招聘的人们来说,这些才是更有助于职业道路后续发展的“真材实料”,所以大多数公司都会给出这样的招聘信息。
	当然在真正招聘的时候不能只是看这些,还是要对公司进行一个更全面的了解再做打算

总结

对于实习吧招聘网站的信息分析可视化就到此告一段落。

总的来说,现在是一个大数据时代,对于计算机方面的工作充满机遇与挑战。
越来越多的人投身入计算机行业,就上述的各个招聘信息可视化来看可以知道,对于像北上广那样的大城市,对于这方面的工作就会相对多一些,从工资信息可视化来看有关Python相关的职业的工资也是较为可观的。当然通过招聘信息的职位描述可视化能更清晰明了的知道现在的市场需要什么样的人才,首先一定是自身有关python方面的本领过硬,其次很多项目都是团队合作的,对于团队相处有优势的人群也会更容易受到青睐,总的来说只要我们自身的本领过硬,那么在面对就业时也能相对轻松很多。

对于向我们这些即将毕业即将走入社会走进职场的学子们来说,通过这样的可视化可以直观的看到很多我们想要知道的信息,能知道市场需要什么样的人才,我们也能相应的根据这些内容来提升自己、来丰富自己,让自己能在走入社会的时候不那么迷茫,多一份筹码。其实还是一句老话,只有身上有真本事就不怕没饭吃。只要我们踏踏实实的勤劳的工作,我相信一定会有更美好的未来。只有自身的本领强悍,才能让别人折服,才能找到理想的工作。
同时这可视化不仅仅能让求职者得到很多信息,对于招聘者来说,通过这些可视化,也能知道求职市场大部分都是怎么进行招聘的,那么自己的公司有什么样的方面能更受到求职者的青睐怎么能招聘到更优秀的求职者呢。这些都可以通过可视化看到,比如说从薪资方面、从公司福利方面等。都有可以改进以期找到更多更优秀求职者的东西。

只有不停学习不停进步才不会被社会淘汰,一起努力的小伙伴们冲冲冲!

本文还有很多不足,如果有什么错误和遗漏,欢迎到评论区一起讨论呀。创作不易、小猪叹气,如果喜欢我的文章就点赞评论留下痕迹吧。嘿嘿嘿
在这里插入图片描述

  • 58
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 48
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值