|
|
51CTO旗下网站
|
|
移动端

Python开发在北京的就业现状分析

相信各位同学多多少少在拉钩上投过简历,今天突然想了解一下北京Python开发的薪资水平、招聘要求、福利待遇以及公司地理位置。既然要分析那必然是现有数据样本。本文通过爬虫和数据分析为大家展示一下北京Python开发的现状,希望能够在职业规划方面帮助到大家!!!

作者:程序员共成长来源:程序员共成长|2018-12-27 15:43

相信各位同学多多少少在拉钩上投过简历,今天突然想了解一下北京Python开发的薪资水平、招聘要求、福利待遇以及公司地理位置。既然要分析那必然是现有数据样本。本文通过爬虫和数据分析为大家展示一下北京Python开发的现状,希望能够在职业规划方面帮助到大家!!!

爬虫

爬虫的第一步自然是从分析请求和网页源代码开始。从网页源代码中我们并不能找到发布的招聘信息。但是在请求中我们看到这样一条POST请求

如下图我们可以得知

  • url:https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false
  • 请求方式:post
  • result:为发布的招聘信息
  • totalCount:为招聘信息的条数 

Python开发在北京的就业现状分析

Python开发在北京的就业现状分析

通过实践发现除了必须携带headers之外,拉勾网对ip访问频率也是有限制的。一开始会提示 '访问过于频繁',继续访问则会将ip拉入黑名单。不过一段时间之后会自动从黑名单中移除。

针对这个策略,我们可以对请求频率进行限制,这个弊端就是影响爬虫效率。

其次我们还可以通过代理ip来进行爬虫。网上可以找到免费的代理ip,但大都不太稳定。付费的价格又不太实惠。

具体就看大家如何选择了

1思路

通过分析请求我们发现每页返回15条数据,totalCount又告诉了我们该职位信息的总条数。

向上取整就可以获取到总页数。然后将所得数据保存到csv文件中。这样我们就获得了数据分析的数据源!

post请求的Form Data传了三个参数

  • first : 是否首页(并没有什么用)
  • pn:页码
  • kd:搜索关键字

2no bb, show code

  1. # 获取请求结果 
  2. # kind 搜索关键字 
  3. # page 页码 默认是1 
  4. def get_json(kind, page=1,): 
  5.     # post请求参数 
  6.     param = { 
  7.         'first''true'
  8.         'pn': page, 
  9.         'kd': kind 
  10.     } 
  11.     header = { 
  12.         'Host''www.lagou.com'
  13.         'Referer''https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
  14.         'User-Agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36' 
  15.     } 
  16.     # 设置代理 
  17.     proxies = [ 
  18.         {'http''140.143.96.216:80''https''140.143.96.216:80'}, 
  19.         {'http''119.27.177.169:80''https''119.27.177.169:80'}, 
  20.         {'http''221.7.255.168:8080''https''221.7.255.168:8080'
  21.     ] 
  22.     # 请求的url 
  23.     url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false' 
  24.     # 使用代理访问 
  25.     # response = requests.post(url, headers=header, data=param, proxies=random.choices(proxies)) 
  26.     response = requests.post(url, headers=header, data=param, proxies=proxies) 
  27.     response.encoding = 'utf-8' 
  28.     if response.status_code == 200: 
  29.         response = response.json() 
  30.         # 请求响应中的positionResult 包括查询总数 以及该页的招聘信息(公司名、地址、薪资、福利待遇等...) 
  31.         return response['content']['positionResult'
  32.     return None 

接下来我们只需要每次翻页之后调用 get_json 获得请求的结果 再遍历取出需要的招聘信息即可

  1. if __name__ == '__main__'
  2.     # 默认先查询第一页的数据 
  3.     kind = 'python' 
  4.     # 请求一次 获取总条数 
  5.     position_result = get_json(kind=kind) 
  6.     # 总条数 
  7.     total = position_result['totalCount'
  8.     print('{}开发职位,招聘信息总共{}条.....'.format(kind, total)) 
  9.     # 每页15条 向上取整 算出总页数 
  10.     page_total = math.ceil(total/15) 
  11.  
  12.     # 所有查询结果 
  13.     search_job_result = [] 
  14.     #for i in range(1, total + 1) 
  15.     # 为了节约效率 只爬去前100页的数据 
  16.     for i in range(1, 100): 
  17.         position_result = get_json(kind=kind, page= i) 
  18.         # 每次抓取完成后,暂停一会,防止被服务器拉黑 
  19.         time.sleep(15) 
  20.         # 当前页的招聘信息 
  21.         page_python_job = [] 
  22.         for j in position_result['result']: 
  23.             python_job = [] 
  24.             # 公司全名 
  25.             python_job.append(j['companyFullName']) 
  26.             # 公司简称 
  27.             python_job.append(j['companyShortName']) 
  28.             # 公司规模 
  29.             python_job.append(j['companySize']) 
  30.             # 融资 
  31.             python_job.append(j['financeStage']) 
  32.             # 所属区域 
  33.             python_job.append(j['district']) 
  34.             # 职称 
  35.             python_job.append(j['positionName']) 
  36.             # 要求工作年限 
  37.             python_job.append(j['workYear']) 
  38.             # 招聘学历 
  39.             python_job.append(j['education']) 
  40.             # 薪资范围 
  41.             python_job.append(j['salary']) 
  42.             # 福利待遇 
  43.             python_job.append(j['positionAdvantage']) 
  44.  
  45.             page_python_job.append(python_job) 
  46.  
  47.         # 放入所有的列表中 
  48.         search_job_result += page_python_job 
  49.         print('第{}页数据爬取完毕, 目前职位总数:{}'.format(i, len(search_job_result))) 
  50.         # 每次抓取完成后,暂停一会,防止被服务器拉黑 
  51.         time.sleep(15) 

ok! 数据我们已经获取到了,最后一步我们需要将数据保存下来

  1. # 将总数据转化为data frame再输出 
  2.   df = pd.DataFrame(data=search_job_result, 
  3.                     columns=['公司全名''公司简称''公司规模''融资阶段''区域''职位名称''工作经验''学历要求''工资''职位福利']) 
  4.   df.to_csv('lagou.csv'index=False, encoding='utf-8_sig'

运行main方法直接上结果:

Python开发在北京的就业现状分析

数据分析

通过分析cvs文件,为了方便我们统计,我们需要对数据进行清洗

比如剔除实习岗位的招聘、工作年限无要求或者应届生的当做 0年处理、薪资范围需要计算出一个大概的值、学历无要求的当成大专

  1. # 读取数据   
  2. df = pd.read_csv('lagou.csv', encoding='utf-8'
  3. # 数据清洗,剔除实习岗位   
  4. df.drop(df[df['职位名称'].str.contains('实习')].index, inplace=True)   
  5. # print(df.describe()) 
  6. # 由于CSV文件内的数据是字符串形式,先用正则表达式将字符串转化为列表,再取区间的均值   
  7. pattern = 'd+'   
  8. df['work_year'] = df['工作经验'].str.findall(pattern) 
  9. # 数据处理后的工作年限 
  10. avg_work_year = [] 
  11. # 工作年限 
  12. for i in df['work_year']: 
  13.    # 如果工作经验为'不限''应届毕业生',那么匹配值为空,工作年限为0   
  14.    if len(i) == 0:   
  15.        avg_work_year.append(0)   
  16.    # 如果匹配值为一个数值,那么返回该数值   
  17.    elif len(i) == 1:   
  18.        avg_work_year.append(int(''.join(i)))   
  19.    # 如果匹配值为一个区间,那么取平均值   
  20.    else:   
  21.        num_list = [int(j) for j in i]   
  22.        avg_year = sum(num_list)/2   
  23.        avg_work_year.append(avg_year) 
  24. df['工作经验'] = avg_work_year 
  25.  
  26. # 将字符串转化为列表,再取区间的前25%,比较贴近现实   
  27. df['salary'] = df['工资'].str.findall(pattern) 
  28. # 月薪 
  29. avg_salary = []   
  30. for k in df['salary']:   
  31.    int_list = [int(n) for n in k]   
  32.    avg_wage = int_list[0]+(int_list[1]-int_list[0])/4   
  33.    avg_salary.append(avg_wage) 
  34. df['月工资'] = avg_salary 
  35.  
  36. # 将学历不限的职位要求认定为最低学历:大专 
  37. df['学历要求'] = df['学历要求'].replace('不限','大专'

数据通过简单的清洗之后,下面开始我们的统计

1绘制薪资直方图

  1. # 绘制频率直方图并保存   
  2. plt.hist(df['月工资']) 
  3. plt.xlabel('工资 (千元)')    
  4. plt.ylabel('频数'
  5. plt.title("工资直方图")    
  6. plt.savefig('薪资.jpg')   
  7. plt.show()  

 Python开发在北京的就业现状分析

结论:北京市Python开发的薪资大部分处于15~25k之间

2公司分布饼状图

  1. # 绘制饼图并保存   
  2. count = df['区域'].value_counts() 
  3. plt.pie(count, labels = count.keys(),labeldistance=1.4,autopct='%2.1f%%')   
  4. plt.axis('equal')  # 使饼图为正圆形   
  5. plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))   
  6. plt.savefig('pie_chart.jpg')   
  7. plt.show()   

 Python开发在北京的就业现状分析

结论:Python开发的公司最多的是海淀区、其次是朝阳区。准备去北京工作的小伙伴大概知道去哪租房了吧

3学历要求直方图

  1. # {'本科': 1304, '大专': 94, '硕士': 57, '博士': 1} 
  2. dict = {} 
  3. for i in df['学历要求']: 
  4.     if i not in dict.keys(): 
  5.         dict[i] = 0 
  6.     else
  7.         dict[i] += 1 
  8. index = list(dict.keys()) 
  9. print(index
  10. num = [] 
  11. for i in  index
  12.     num.append(dict[i]) 
  13. print(num) 
  14. plt.bar(left=index, height=num, width=0.5) 
  15. plt.show() 

 Python开发在北京的就业现状分析

结论:在Python招聘中,大部分公司要求是本科学历以上。但是学历只是个敲门砖,如果努力提升自己的技术,这些都不是事儿

4福利待遇词云图

  1. # 绘制词云,将职位福利中的字符串汇总   
  2. text = ''   
  3. for line in df['职位福利']:   
  4.    text += line   
  5. # 使用jieba模块将字符串分割为单词列表 
  6. cut_text = ' '.join(jieba.cut(text)) 
  7. #color_mask = imread('cloud.jpg')  #设置背景图 
  8. cloud = WordCloud( 
  9.     background_color = 'white'
  10.     # 对中文操作必须指明字体 
  11.     font_path='yahei.ttf'
  12.     #mask = color_mask, 
  13.     max_words = 1000, 
  14.     max_font_size = 100 
  15.     ).generate(cut_text) 
  16.  
  17. # 保存词云图片 
  18. cloud.to_file('word_cloud.jpg'
  19. plt.imshow(cloud) 
  20. plt.axis('off'
  21. plt.show() 

 Python开发在北京的就业现状分析

结论:弹性工作是大部分公司的福利,其次五险一金少数公司也会提供六险一金。团队氛围、扁平化管理也是很重要的一方面。

至此,此次分析到此结束。有需要的同学也可以查一下其他岗位或者地区的招聘信息哦~

希望能够帮助大家定位自己的发展和职业规划。

【编辑推荐】

  1. 细数 Python 的「八宗罪」,你可认同?
  2. RHEL 8 中不再默认系统 Python 版本
  3. Python 太糟糕了?开发者总结了 8 大原因
  4. 流行的 C++ GUI 开发框架 Qt 开始支持 Python
  5. 圣诞节,用Python给自己加顶“圣诞帽”
【责任编辑:未丽燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Java网络编程精解

本书结合大量的典型实例,详细介绍了用Java来编写网络应用程序的技术。本书的范例都基于最新的JDK 1.5版本,书中内容包括:Java网络编程的...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊