找了这么久的工作,为什么一直都找不到啊
来自: 财会职场人(财务职业规划财务职场问题可问我)
3不少小伙伴正在物色新的工作机会,但当下尚未结束的国内疫情及经济下行的压力,给跳槽增加了更多的不确定性,让小伙伴们直呼,什么时候才能收到自己满意的offer,我也是这样。
这次,我修修改改前后花了大半个月的时间,边学边用,写了上千行代码,把前程无忧招聘网站上,全国范围内2000页10万个财会类职位的信息爬取下来,并进行整理分析,以此来了解下目前国内的财会类职位招聘大概是个什么情况,看看下一份工作该何去何从。
整个过程分为如下三步:
1、取得前程无忧网站上当前招聘财会类职位的所有原始数据信息
2、对取得的所有原始数据进行清洗、整理
3、将整理好的数据进行可视化分析,以便了解当前招聘现状并提供指引
阅读全文大约需要10分钟,如果时间不够,可以先直接看第3步的结论部分,收藏此文等空了再慢慢看其他部分的内容,对代码不感兴趣的,也可直接跳过代码。
1.取得前程无忧网站上当前招聘财会类职位的所有原始数据信息
先截出招聘网站界面,这是大家熟悉的51job招聘网站,红彤彤的界面,生活要过的红火,找工作也要红红火火。
我选择的是“近一周”内的所有“全职”的“财务”职位,一共2000页,10万条职位信息,对这个界面的基本信息进行爬取。
因为搜索的是全文中含有“财务”的10万条职位信息,但我们不知道是职位名称中含有“财务”,还是职位介绍中含有“财务”,所以只能先把所有信息获取下来,然后再筛选出我们需要的有用信息。
我先取得了这10万条职位中每一个职位对应的网址链接,也就是点击进去后能看到职位信息、公司信息等详情页信息的网址,代码如下。
1foriinrange(1,2001):#控制循环爬取2000页数据信息 2ur
l='https://search.51job.com/list/000000,000000,0000,00,2,99,'+key_word+',2,'+str(i)+'.html' 3driver.g
et(url) 4time.sleep(2
)#等待2秒,防止反爬虫 5all_links=driver.
find_element_by_class_name('j_joblist').find_elements_by_class_name('e') 6forlinkinall_links: 7jo
b_link=link.find_element_by_
class_name('el').get_attribute('href') 8jobs_list.append(job_link) 9print('正在写入第
{}条数据'.format(len(jobs_list)))
这10万条职位的详情页网址,有很多是重复的,为了减少重复爬取,减轻接下来的爬取任务,需进行初步的去重处理,代码如下。
1new_jobs_list=[] 2
foriinjobs_list: 3ifi
innew_jobs_list: 4pass 5else
:6new_jobs_li
st.append(i
)7print('去重后共有{}条数据'.format(len(
new_jobs_list)))
然后我再对上面获得的将近10万个详情页网址,采用多协程爬取的方式,取得每一个详情页网址上所招聘的职位名称、招聘单位、工资待遇、工作地址、经验要求、学历要求、所属行业以及岗位职责等信息。
获取代码如下。
1work=Queue()
2fornew_job_listinnew_jobs_list: 3wo
rk.put_nowait(new_job_list) 4 5def
job
_crawler(): 6whileno
twork.empty(): 7url_crawler=w
ork.get_nowait() 8headers={ 9'Host':'sea
rch.51job.com', 10'Upg
rade-Insecure-Requests':'1', 11'User-Agent
':'Mozilla/5.0(WindowsNT6.3;Win64;x64)AppleWebKi
t/537.36(KHTML,likeGecko)Chrome/84.0.4147.125Safari/537.36' 12} 13http=['http://155.246.12.163:3128','http://133.1.74.163:3124','http://199.239.1
36.200:80','http
://129.24.211.26:3128','http://129.24.211.25:3124','http://62.41.85.113:0','http://49.85.1.79:31666','http://124.72.109.183:8118'] 14my_proxies={ 15'http':random.choice(http) 16} 17res_job=requests.get(url_crawler,headers=headers,proxies=
my_proxies) 18s=requests.
session() 19s.keep_alive=False 20res_job.
encoding='gbk' 2
1tCompany=html.fromstring(res_job.text) 22position=tCompany.xpath('//div[@class="
tHeadertHjob"]//h1/text()')[0].st
rip() 23words=['财务','出纳','会计']#
只挑选出职位名称里带有“财务”、“出纳”、“会计”字眼的信息,其它职位
的信息统统不要 24foriinwords: 25ifiinposition: 26company=t
Company.xpath('//p[@class="cname"]/a/text()')[0].strip()#公司名称 27try: 28salary=tCompany.xpat
h('//div[@class="cn"]//strong/text()')[0].strip()#工资待遇 29except: 30salary='' 31a
rea=tCompany.xpath('//p[@c
lass="msgltype"]/text()')[0].str
ip()#工作地址 32experience=tCompany.xpath('//p[@class="msgltype"]/text()')[1].strip()#经验要求 33educ
ation=tCompany.xpath('/
/p[@class="msgltype"]/text()')[2].strip()#学历要求 34industry=tCompany.xpath('//div[@class="com_tag"]/p/
a/text()')[0].strip()#所属行业
35describe=tCompany.xpath('//div[
@class="bmsgjob_msginbox"]/p/text()')#岗位职责描述 36ifdescribe==[]: 37describe='' 38ifposition!='
'andcompany!=''andsalary!=''andarea!=''andexperience!=''andeducation!=''andindustry!=''anddescribe
!='': 39sheet.append([url_crawler,position,company,salary,area,experience,education,industry,str(
describe)])
这样,静静等待一个多小时的时间,通过代码自动进行去重处理,剔除职位名称中不带“财务”、“出纳”、“会计”字眼的信息,以及剔除信息不全的职位,10万条职位中筛选到剩下将近2万条有用信息,这将近2万条职位基本信息的原始数据都已经取到并乖乖的躺在我本地电脑的excel表格里了。
2.对取得的所有原始数据进行清洗、整理
从上面的excel表中可以看到,此时的数据还存在重复行信息。
需要进一步去重处理,代码如下。
1data=pd.DataFrame(pd.read_excel(r'd:\F:学习\python\51job\51job_crawling.xlsx',sheet_name='全国财务招聘岗位信息汇总',header=0))
2print(data)
3re_row=data.duplicated() 4
print(re_row) 5
no_re_row=data.drop_duplicates(['详情页网址']) 6pri
nt(no_re_row) 7no_
re_row.to_excel(r'd:\F:学习\python\51job\51job_crawling_new.xlsx')
刀哥以第一个列元素“详情页网址”为依据,进行去重,若以其他列元素也是同样的去重效果,因为是整行重复。
经过进一步去重后,18675行信息删减为不重复的16267行信息。
1[18675rowsx9columns] 20
False 31False 4
2False 53False
64False 7... 81
8670False 918671
False 1018672Fals
e1118673False
1218674False 13Le
ngth:18675,dtype:
bool 14详情页网址...岗位
职责 150https://job
s.51job.com/fosha
n-sdq/125191822.ht......['岗位职
责:','1.负责中心直营业务,跟进结算开票及回款','2.负责中心自有及渠道... 161https://jobs.51job.com/haikou/125185928.html?s......['1、应收账款管理:对账、收款、
超期追踪、信用控制、应收分析;','2、每月与销售 17人员一... 182https://jobs.51job.com/qingyuan/125198973.html......['工作职责:','1、报表编制与分析、管理:经营
月会报表编制,过程分析,支持统筹的 19操作流... 203https://jobs.51job.com/shanghai-pdxq/122853642......['Responsibility,','ü\xa0Sup
portFinan
ceBP... 214https://jobs.51job.com/changsha/125183617.html......['1、按规定要求编制公司管理报表;','2、审定各单位上报的会计报表,确认其会计报 22表
的准... 23.
........... 2418670https://jobs.51job.com/chengdu-pdq/120104547.h......['岗位职责:','负责公司全盘账务处理,主要包括:','\u3000','\xa0'.
.. 2518671https://jobs.51job.com/changzhou-wjq/124153343......['工作职责:','1、根据财务管理制度,负责办理现金管理、银行结算业务;','2、审核 26.
.. 271867
2https://jobs.51job.com/hangzhou-scq/124692429.......['1、编制和维护公司的总帐和明细帐,及时准确地记录公司业务往来;','2、向公 28司... 2918673https:/
/jobs.51job.com/shanghai/122546145.html......['\xa01、统招大学本科及以上学历,财务管理、会计或相关专业;','\xa02、熟悉会...18674https://jobs.51jo
b.com/shenzhen-baq/125007233.......['岗位职责:','1、负责完成会计账务处理等工作;','2、负责各项税务申报等工作;'... 30 31[16267rowsx9columns]
去重后,还要对格式进行统一清洗和整理,才能进行下一步的可视化分析。
①招聘职位名称的处理
职位名称中,有“财务稽查助理”、“区域财务专员”、“项目经理”等各种各样的叫法,我将其统一分类为“财务实习生”、“财务出纳”、“财务会计”、“财务主管”、“财务经理”和“财务总监”六类,可能会有一定的误判,但这样的情况较大,不会影响最终的结果判断,处理代码如下。
1defget_position(position):#清洗整理招聘职位名称数据 2
if'出纳'inposition: 3positio
n='财务出纳' 4elif'主管'inpositio
n: 5position='财务主管' 6elif'实
习'inposition: 7position='财务
实习生' 8elif'培'inposition: 9p
osition='财务实习生' 10elif'经理'inp
osition: 11position='财务经理' 1
2elif'分析'inposition: 13positi
on='财务分析' 14elif'总监'inpositio
n: 15position='财务总监' 16elif'
BP'inposition: 17position='财务
总监' 18else: 19position='财务会计
'20returnposition
②工资待遇的处理
工资待遇有的是月薪、有的是年薪,有的是一个区间,有的是一个数,统一处理代码如下。
1defget_salary(salary):#清洗整理工资待遇,统一为“千/月” 2
if'-'insalary:#处理区间工资 3low_salar
y=re.findall(re.compile('(\d*\.?\d+)'),salary)[0] 4high_salary=re.find
all(re.compile('(\d?\.?\d+)'),salary)[1] 5ifu'万'insalaryandu'年'insalary
:6low_salary=float(low_salary)/12*10 7high_sa
lary=float(high_salary)/12*10 8elifu'万'insalaryand
u'月'insalary: 9low_salary=float(low_salary)*10 10hig
h_salary=float(high_salary)*10 11salary=(float(low
_salary)+float(high_salary))/2 12else:#处理非区间工资 1
3salary=re.findall(re.compile('(\d*\.?\d+)'),salar
y)[0] 14ifu'万'insalaryandu'年'insalary: 15salary=float(salary)/12
*10 16elifu'万'insalary
andu'月'insalary: 17salary=float(salary)*10 18elifu'元'insalaryandu'天
'insalary: 19salary=float(salary)/1000*22 20else
:21salary=0 22#salary=float('%.2f'%salary)
23if0<=float(salary)<3:#以下是统一划分为九档工资区间 24salary='
0-3K' 25elif3<=float(salary)<5: 26salary
='3-5K' 27elif5<=float(salary)<8: 28salary='5-8K'
29elif8<=float(salary)<10: 30salary='8-10K' 3
1elif10<=float(s
alary)<12: 32salary='10-1
2K' 33elif12<=float(salary)<18: 34sal
ary='12-18K' 35elif18<=float(salary)<25: 36sa
lary='18-25K' 37elif25<=fl
oat(salary)<35: 38salary='25-35
K' 39else: 40salary='35k以上
'41returnsalary
③工作地址的处理
工作地址有的到某个城市的某个区,有的只显示为某个城市,统一处理代码如下。
1defget_area(area):#清洗整理工作地址,删掉城市后面具体的区 2h
ead,sep,tail=area.partition('-') 3returnh
ead
④经验要求的处理
有的职位在网页上并没有注明经验要求、学历要求,信息缺失导致取得的信息错位,统一处理代码如下。
1defget_experience(experience):#清洗整理经验要求 2
experi=re.sub('招.*?人','无',experience) 3string
1=['经验','需','以上','年'] 4foriinrange(
len(string1)): 5experi=re.sub(strin
g1[i],'',experi) 6string2=['在校生/应届生','中专','中技',
'大专','高中','本科','硕士'] 7foriinrange(len(string2)): 8experi
=re.sub(string2[i],'无',experi) 9if'
-'inexperi: 10low_experi=re.findall(re.compile('(
\d*\.?\d+)'),experi)[0]
11high_experi=re.findall(re.compile('(\d?\.?\d+)'),experi)[1] 12experi=
(float(low_experi)+float(high_experi))/2 13else: 14ifexperi!='无': 15expe
ri=float(experi) 16ifexperi!='无':#以下是统一划分为七个经验要求区间 17iffloat
(0)<experi<=
float(1): 18experi='1年以下经验'
19eliffloat(1)<experi<=float(3): 20ex
peri='1-3年经验' 21eliffloat(3)<experi<=float
(5): 22experi='3-5年经验' 23eliffloat(5)<ex
peri<=float(7): 24experi='5-7年经验
'25eliffloat(7)<experi<float(10): 26exper
i='7-10年经验' 27eliffloat(10)<=exp
eri: 28experi='10年以上经验' 29else: 30experi='
无需经验' 31returnexperi
⑤学历要求的处理
同④,也是由于信息缺失导致信息错位,并且有些叫法并不统一,比如“中专”也叫“中技”,统一处理代码如下。
1defget_edu(education):#清洗整理学历要求 2e
du=re.sub('招.*?人','无学历要求',education) 3edu=re.
sub('.*?发布','无学历要求',edu) 4edu=re.sub('中
技','中专',edu) 5returnedu
岗位职责信息也需要处理,但先暂不动,后有它用。
经过上述处理后,除了岗位职责描述的信息根据招聘职责的不同,分别保存在TXT文档里,其他均另存在新的excel表格中,代码如下。
1defmain():#清洗整理并保存数据 2
data=load_from_xlsx(r'd:\F:学习\python\51job\51job_crawling_new.xlsx') 3table=
data[0] 4nrows=data[1
]5print('一共有{}行数据,开始
清洗数据'.format(nrows)) 6foriinrange(1,nrows):
7url=table.row_values(i)[0] 8
position=table.row_values(i)[1] 9compa
ny=table.row_values(i)[2] 10salary=table.row
_values(i)[3] 11area=table.row_values(i)[4]
12experience=table.row_values(i)[5] 13edu
cation=table.row_values(i)[6] 14industry
=table.row_values(i)[7] 15describe=table.row_v
alues(i)[8] 16position=get_position(position)
17salary=get_salary(salary) 18area=get_area
(area) 19experience=get_experience(experienc
e) 20education=get_edu(education) 21data=[ur
l,position,company,salary,area,experie
nce,education,industry] 22print(
'正在写入第{}行'.format(i)) 23forcolx,valueinenumerate(d
ata): 24sheet.write(i,colx,value) 25ifpos
ition=='财务出纳':#以下岗位职责描述保存为txt文件,以做词云展示用,其他信息保存为excel文件 26withopen(r'd:\F:学习\python
\51job\岗位职责描述_财务出纳.txt','a',encoding='
utf-8')asf: 27f.write(describe) 28ifposition=
='财务主管': 29withopen(r'd:\F:学习\python\51j
ob\岗位职责描述_财务主管.txt','a',encoding='utf-8')asf: 30f.write(describe) 31ifpositi
on=='财务实习生': 32withopen(r'd:\F:学习\python\51job\岗位职责描述_财务实习生.txt','a',encoding='utf-8')asf: 3
3f.write(describe) 34ifposition=='财务
经理': 35withopen(r'd:\F:学习\python\
51job\岗位职责描述_财务经理.txt','a',encoding='utf-8')asf: 36f.write(describe) 37ifposition=='财务分析': 3
8withopen(r'd:\F:学习\python\51job\岗位职
责描述_财务分析.txt','a',encoding='utf-8'
)asf: 39f.write(describe) 40ifposition=='财务总监': 41withopen(r'd:\F:学习\python\51job\岗位职责描述_财务总监
.txt','a',encoding='utf-8')asf: 42f.
write(describe) 43ifposition=='财务
会计': 44withopen(r'd:\F:学习\python\51job\岗位职责描述_财务会计.txt','a',encoding='utf-8')asf: 45f.write(
describe)
最后得到如下比较干净整洁的excel数据信息。
以及保存在txt文件中的各类职位职责描述。
呼~,历经千山万水,终于有了可以进行分析用的数据,不简单,喝口水活动下筋骨,顺便为刀哥点个赞,加个关注,然后咱们继续。
3.将整理好的数据进行可视化分析
①各大城市招聘财会类职位的数量分布
代码如下。
1df=pd.read_excel(r'd:\F:学习\python\51job\51job_data_cleaned.xls')
2data=df['工作地址'].value_counts() 3c
ity=list(data.index)[:30] 4num
s=list(data.values)[:30] 5print
(city) 6print
(nums) 7mpl.r
cParams['font.family']='SimHei' 8plt.bar
(city,nums,width=0.5) 9plt.tit
le('各城市招聘职位数量分布',fontsize=16) 10plt.xla
bel('城市',fontsize=12) 11plt.yla
bel('职位数量',fontsize=12) 12plt.sho
w()
结果显示如下。
可以看出,招聘需求大的还是以上广深一线城市为主,其次是武汉、成都、杭州、南京等新一线城市,北京作为一线城市,当前招聘需求量不大,可能与此前疫情爆发有关。
②招聘职位对学历的要求
代码如下。
1df=pd.read_excel(r'd:\F:学习\python\51job\51job_data_cleaned.xls')
2data=df['学历要求'].value_counts() 3e
du=['无学历要求','高中','中专','大专','本科','硕士'] 4num
s=[data[i]foriinedu] 5print(edu
)6print(num
s) 7mpl.rcPar
ams['font.family']='SimHei' 8fig=plt.fig
ure() 9plt.pie(nums,
labels=edu,autopct='%1.2f%%')#画饼图(数据,数据对应的标签,百分数保留两位小数点) 10plt.title("招聘职
位对学历的要求") 11plt.show()
结果显示如下。
可以看出,财会类职位的工作,对学历的要求以大专、本科为主,要求硕士及以上学历的比例很少。此类工作相较于学历,更加看重工作经验,毕竟财会类工作更加注重实操,更加需要解决实际问题的能力。
③招聘职位对工作经验的要求
代码如下。
1df=pd.read_excel(r'd:\F:学习\python\51job\51job_data_cleaned.xls')
2data=df['经验要求'].value_counts() 3e
xperi=['无需经验','1年以下经验','1-3年经验','3-5年经验','5-7年经验','7-10年经验','10年以上经验'] 4num
s=[data[i]foriinexperi] 5mpl.rcPar
ams['font.family']='SimHei' 6colors=['#F
F0000','#0000CD','#00BFFF','#008000','#FF1493','#FFD700','#FF4500','#00FA9A','#191970','#9932CC'] 7plt.style.use('ggplot'
)#设置显示风格 8plt.figure(figsize=(7,4)
,dpi=100)#设置大小,像素 9plt.barh(experi,nums,height=
0.7,color=colors)#绘制水平柱状图 10plt.title('招聘岗位对工作经验的要求',fontsize
=16) 11plt.xlabel('岗位数量',fontsize=12) 12p
lt.show()
结果显示如下。
可以看出,工作经验要求在1到7年的,招聘数量均较多,无需经验的招聘职位量也少不了多少,可能是即将来临的应届生秋招需求量比较大。
而不同岗位、不同级别的财会类职位,对工作经验的要求程度不同,级别越高的职位,越要求有丰富的工作经验。
④不同行业招聘职位需求情况
代码如下。
1df=pd.read_excel(r'd:\F:学习\python\51job\51job_data_cleaned.xls')
2data=df['所属行业'].value_counts() 3i
ndustrys=list(data.index)[:] 4num
s=list(data.values)[:] 5mpl.r
cParams['font.family']='SimHei' 6colors=
['#FF0000','#0000CD','#00BFFF','#008000','#FF1493','#FFD700','#FF4500','#00FA9A','#191970','#9932CC'] 7plt.figure(figsize
=(6,4),dpi=100)#设置图形大小,像素 8plt.tick_params(labels
ize=5)#设置字体大小 9plt.barh(industrys,nums,
height=0.7,color=colors)#绘制水平柱状图 10plt.title('不同行业招聘职位需求情况',font
size=16) 11plt.xlabel('职位数量',fontsize=12)
12plt.show()
结果显示如下。
可以看出,目前招聘需求量比较大的有建筑/建材/工程、互联网、贸易/进出口、房地产、电子技术/半导体/集成电路等行业。
在国内外疫情以及贸易战背景下,互联网、电子技术类企业更加重视自主研发,扩大规模,通过掌握更多的核心技术逐步实现进口替代,对各类人才的需求也相应增加。
建筑工程、房地产类企业,到处修铁路、造桥梁、建房子,正在建设中的类似北京大兴国际机场、港珠澳大桥、海底隧道等大型工程及一个又一个的办公楼宇或住宅,造就了中国“基建狂魔”称号。
而传统的银行业、采掘/冶炼等行业,也许正处于升级转型,调整战略,降薪裁员中,此类企业的招聘需求较为低迷。
⑤招聘职位工资待遇情况
工资待遇是我们大家最关心的,代码如下。
1df=pd.read_excel(r'd:\F:学习\python\51job\51job_data_cleaned.xls')
2data=df['工资待遇(千/月)'].value_counts() 3e
xperi=['0-3K','3-5K','5-8K','8-10K','10-12K','12-18K','18-25K','25-35K','35k以上'] 4num
s=[data[i]foriinexperi] 5mpl.rcPar
ams['font.family']='SimHei' 6colors=['#F
F0000','#0000CD','#00BFFF','#008000','#FF1493','#FFD700','#FF4500','#00FA9A','#191970','#9932CC'] 7plt.style.use('ggplot'
)#设置显示风格 8plt.figure(figsize=(7,4)
,dpi=100)#设置大小,像素 9plt.barh(experi,nums,height=
0.7,color=colors)#绘制水平柱状图 10plt.title('招聘职位月薪工资待遇情况',fontsize
=16) 11plt.xlabel('职位数量',fontsize=12) 12p
lt.show()
结果显示如下。
可以看出,财会类职位月薪工资主要在5-8K之间,其次是3-5K和8-10K,所以要想月薪过万,还真是需要搏一搏,敢于搏一搏,单车很快变摩托。
另外,我还对比了①中目前招聘需求量最大的前六个城市的各个职位的月平均工资,对比结果如下。
可以看出,无论是哪个城市,职级越高,工资待遇越高,亦即所谓的地位越高收入越高,再次印证了20%的人掌握着80%的财富,为了能成为那20%的人,我们都得加油鸭~。
从城市来看,上海、深圳、杭州的月平均工资普遍高于其他三个城市,希望获得高工资的同学,想往哪个方向走,现在大概心中有数了吧。
最后再来看看,各类财会职位分别需要完成哪些工作内容,有什么样的任职要求,各自词云展示如下。
财务实习生▽ 出纳▽
会计▽ 财务分析▽
财务经理▽ 财务总监▽
以上内容不知是否对你找工作有帮助,说说目前自己找工作的感受吧,一起交流交流。
ps:正在找工作的朋友,如果想高效精准投简历,可以找我,我运行一下代码最新招聘信息就出来了,你可以拿去自己筛选
你的回应
回应请先 登录 , 或 注册相关内容推荐
最新讨论 ( 更多 )
- 复制文案 兼职 (秋风渡)
- 请帮我选择offer (💧)
- 中级会计现在学来得及吗 (wekasoul)
- 财会及文史哲书籍阅读讨论 (敖其尔)
- 求推荐实用的会计实操课程 (猛犸扒牙)