当前位置: 首页 > 科技观察

北京Python开发就业现状分析

时间:2023-03-14 21:57:54 科技观察

相信小伙伴们都或多或少在拉勾投过简历。今天突然想了解下北京Python开发的薪资水平,招聘要求,福利,公司地点。既然要分析,那肯定是已有的数据样本。本文通过爬虫和数据分析向大家展示北京Python发展现状,希望对大家的职业规划有所帮助!!!爬虫的第一步自然是从分析请求和网页源代码开始。从网页源代码中,我们无法查到发布的招聘信息。但是在请求中,我们看到如下图这样的POST请求,我们可以知道url:https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false请求方式:post结果:针对发布的招聘信息totalCount:针对招聘信息的条数通过实践发现,lagou.com除了headers之外,还有对ip访问频率的限制.一开始会提示‘访问太频繁’,如果继续访问就会把ip拉进黑名单。但是,它会在一段时间后自动从黑名单中删除。对于这种策略,我们可以限制请求频率,缺点是影响爬虫效率。其次,我们也可以通过代理ip进行爬取。网上可以找到免费的代理ip,但大多都不稳定。支付的价格不是很实惠。具体要看你如何选择1idea。通过分析请求,我们发现每页返回15条数据,totalCount告诉我们该位置信息的总条数。四舍五入以获得总页数。然后将生成的数据保存到csv文件中。这样,我们就得到了进行数据分析的数据源!post请求的FormData先传三个参数:是否是首页(没用)pn:页码kd:搜索关键字2nobb,showcode#GetRequestResult#kind搜索关键字#page页码为1bydefaultdefget_json(kind,page=1,):#post请求参数param={'first':'true','pn':page,'kd':kind}header={'Host':'www.lagou.com','Referer':'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=','User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_12_6)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3497.100Safari/537.36'}#设置代理proxies=[{'http':'140.143.96.216:80','https':'140.143.96.216:80'},{'http':'119.27.177.169:80','https':'119.27.177.169:80'},{'http':'221.7.255.168:8080','https':'221.7.255.168:8080'}]#Requestedurllurl='https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'#使用代理访问#response=requests.post(url,headers=header,data=param,proxies=random.choices(proxies))response=requests.post(url,headers=header,data=param,proxies=proxies)response.encoding='utf-8'ifresponse.status_code==200:response=response.json()#requestresponse中的positionResult包括查询总数和本页的招聘信息(公司名称、地址、工资、福利等)returnresponse['content']['positionResult']returnNone接下来我们只需要在每次翻页时调用get_json获取请求的结果然后遍历获取所需的招聘信息即可if__name__=='__main__':#默认情况下,先查询第一页的数据kind='python'#请求获取一次的总条数position_result=get_json(kind=kind)#总条数total=position_result['totalCount']print('{}发展职位,总招聘信息{}条.....'.format(kind,total))#每页15条取整计算总页数page_total=math.ceil(total/15)#所有查询结果search_job_result=[]#foriinrange(1,total+1)#为了节省效率只抓取前100页ofdataforiinrange(1,100):position_result=get_json(kind=kind,page=i)#每次爬取完成后暂停一会,防止被服务器拦截time.sleep(15)#当前页面招聘信息page_python_job=[]forjinposition_result['result']:python_job=[]#公司全称python_job.append(j['companyFullName'])#公司简称python_job.append(j['companyShortName'])#公司规模python_job.append(j['companySize'])#financingpython_job.append(j['financeStage'])#areapython_job.append(j['district'])#titlepython_job.append(j['positionName'])#Requiredworkingyearspython_job.append(j['workYear'])#招聘学位ppython_job.append(j['education'])#薪资范围python_job.append(j['salary'])#福利待遇python_job.append(j['positionAdvantage'])page_python_job.append(python_job)#把所有放在listsearch_job_result+=page_python_jobprint('第{}页的数据已被爬取,当前总排名:{}'.format(i,len(search_job_result)))#每次爬取完成后,暂停一会,防止被服务器拉黑time.sleep(15)ok!我们已经获取到数据了,最后一步需要保存数据#将总数据转换成dataframe,然后输出df=pd.DataFrame(data=search_job_result,columns=['公司全名','公司简称','公司规模','融资阶段','地区','职位','工作经历','学历要求','薪资','工作福利'])df.to_csv('lagou.csv',index=False,encoding='utf-8_sig')运行main方法,直接上传结果:数据分析通过分析cvs文件,为了方便我们统计,需要清洗数据,比如剔除招募以及实习岗位的工作如果年限没有要求或者应届毕业生按0年处理,薪资区间需要计算一个大概值,没有学历要求的按大专#读取数据df=pd.read_csv('lagou.csv',encoding='utf-8')#数据清洗,去掉实习职位df.drop(df[df['职位'].str.contains('实习')].index,inplace=True)#print(df.describe())#因为CSV文件中的数据是字符串形式,先用正则表达式将字符串转换成列表,然后取区间均值pattern='d+'df['work_year']=df['workexperience'].str.findall(pattern)#数据处理后的workingyearsavg_work_year=[]#workingyearsforiindf['work_year']:#如果工作经验为'unlimited'或'freshgraduate',则匹配值为空,工作年限为0iflen(i)==0:avg_work_year.append(0)#如果匹配值为一个值,则返回值eliflen(i)==1:avg_work_year.append(int(''.join(i)))#如果匹配值为一个interval,然后取平均值else:num_list=[int(j)forjini]avg_year=sum(num_list)/2avg_work_year.append(avg_year)df['workexperience']=avg_work_year#将字符串转成list,然后取第一部分区间25%,更接近实际df['salary']=df['salary'].str.findall(pattern)#月薪avg_salary=[]forkindf['salary']:int_list=[int(n)fornink]avg_wage=int_list[0]+(int_list[1]-int_list[0])/4avg_salary.append(avg_wage)df['monthlysalary']=avg_salary#以不限学历为最低认定职位要求education:juniorcollegedf['educationRequirements']=df['EducationalRequirements'].replace('Unlimited','College')数据简单清洗后,开始我们的统计1画工资直方图#画频率直方图并保存plt.hist(df['月薪'])plt.xlabel('salary(千元)')plt.ylabel('frequency')plt.title("薪资直方图")plt.savefig('salary.jpg')plt.show()结论:北京Python开发者薪资居多都在15到25k之间2公司分布饼图#画饼图保存count=df['area'].value_counts()plt.pie(count,labels=count.keys(),labeldistance=1.4,autopct='%2.1f%%')plt.axis('equal')#让饼图成为正圆plt.legend(loc='upperleft',bbox_to_anchor=(-0.1,1))plt.savefig('pie_chart.jpg')plt.show()结论:Python开发最多的公司在海淀区,其次是朝阳区准备去北京工作的朋友大概都知道去哪里租房子。3学历要求直方图#{'本科':1304,'大专':94,'硕士':57,'博士':1}dict={}foriindf['学历要求']:ifinotindict.keys():dict[i]=0else:dict[i]+=1index=list(dict.keys())print(index)num=[]foriinindex:num.append(dict[i])print(num)plt.bar(left=index,height=num,width=0.5)plt.show()结论:在Python招聘中,大部分公司要求本科及以上学历。但学历只是敲门砖。如果你努力提高自己的技能,这些都不是事。4福利待遇词云图#绘制词云,总结jobbenefits中的字符串text=''forlineindf['jobbenefits']:text+=line#使用jieba模块将字符串拆分成词表cut_text=''。join(jieba.cut(text))#color_mask=imread('cloud.jpg')#设置背景图cloud=WordCloud(background_color='white',#中文操作必须指定字体font_path='yahei.ttf',#mask=color_mask,max_words=1000,max_font_size=100).generate(cut_text)#保存词云图cloud.to_file('word_cloud.jpg')plt.imshow(cloud)plt.axis('off')plt.show()总结:弹性工作是大部分公司的福利,其次是五险一金,少数公司还会提供六险一金。团队氛围和扁平化管理也是很重要的方面。至此,本次分析到此结束。有需要的同学也可以查看其他职位或地区的招聘信息~希望能帮助大家定位自己的发展和职业规划。