8月份已经正式离职,这两个月主要在做新书校对工作。9月份陆续投了几份简历,参加了两次半面试,第一次是家做办公自动化的公司,开的薪水和招聘信息严重不符,感觉实在是在浪费时间,你说你给不了那么多为什还往上发布?第二次是家做业务系统的中型公司,结果面试我的技术总监直接被我按在地上摩擦,估计没戏了。还有半次,是个研究所,电话和微信简单沟通了一下,结果感觉自己有点被摩擦的意思,不愧挂着研究俩字。后两家公司的薪水区间几乎相同,但人员的技术水平却相差很大,这让我有些好奇,忍不住想分析一下苏州类似岗位的薪资水平。

我在51job上搜索了一下苏州,计算机软件,互联网/电子商务,计算机服务,近一月的java相关职位,一共33页。

第1页的URL是:

https://search.51job.com/list/070300,000000,0000,00,3,99,java,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=

第2页是:

https://search.51job.com/list/070300,000000,0000,00,3,99,java,2,2.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=

不同之处在 java2,1.html 和 java2,2.html 看来那个不同的数字就是翻页信息。

在浏览器F12一下,页面dom布局大概是这样:

于是爬取了一下全部数据:

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
import csv
from itertools import chain
import threadingdef get_jobs(url):'''根据url爬取职位信息:param url::return: 职位列表,每个元素是一个四元组(职位名, 薪资,发布时间,详情页面url)'''try:html = urlopen(url)except HTTPError as e:print('Page was not found')return []jobs = []try:bsObj = BeautifulSoup(html.read())jobs_div = bsObj.find('div', {'id': 'resultList'}).findAll('div', {'class':'el'})for div in jobs_div[1:]:span_list = div.findAll('span')job_name = span_list[0].a.get_text().strip() # 职位名称job_url = span_list[0].a.attrs['href'].strip() # 职位详情urljob_comp = span_list[1].a.get_text().strip() #公司名称job_salary = span_list[3].get_text().strip() # 薪资job_date = span_list[4].get_text().strip() # 日期jobs.append((job_comp, job_name, job_salary, job_date, job_url))except AttributeError as e:print(e)return []return jobsdef crawl():'''分页苏州市近一月内的java相关职位:return: 职位列表,每个元素是一个四元组(职位名, 薪资,发布时间,详情页面url)'''# 查询条件:java;苏州;计算机软件、计算机服务(系统、数据服务、维修)、互联网/电子商务;近一月url = 'https://search.51job.com/list/070300,000000,0000,01%252C38%252C32,9,99,java,2,{0}.html?' \'lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99' \'&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1' \'&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='all_jobs = []def _crawl(page_start, page_end):'''分页爬取数据:param page_start: 起始页:param page_end: 终止页:return:'''print('crawl {0}~{1} start...'.format(page_start, page_end))for i in range(page_start, page_end):# 翻页urlpage_url = url.format(str(i))jobs = get_jobs(page_url)if len(jobs) == 0:breakall_jobs.append(jobs)print('crawl {0}~{1} over'.format(page_start, page_end))# 线程列表thread_list = []start_nums = list(range(0, 45, 5))end_nums = list(range(5, 50, 5))# 每5页一个线程, 最多50页for i in range(len(start_nums)):t = threading.Thread(target=_crawl, args=(start_nums[i], end_nums[i]))thread_list.append(t)print('开始爬取数据...')for t in thread_list:t.start()for t in thread_list:t.join()print('爬取结束')return all_jobsdef save_data(all_jobs):'''将职位信息保存到joblist.csv:param all_jobs: 二维列表,每个元素是一页的职位信息'''print('正在保存数据...')with open('joblist.csv', 'w', encoding='utf-8', newline='') as fp:w = csv.writer(fp)# 将二维列表转换成一维t = list(chain(*all_jobs))w.writerows(t)print('保存结束,共{}条数据'.format(len(t)))if __name__ == '__main__':# 爬取数据all_jobs = crawl()# 保存数据save_data(all_jobs)

为了爬的快点,开了多个线程,最后把数据保存在joblist.csv中。近一个月共有967个java相关职位:

打开csv,发现里面的数据并不太好:

……

江苏未至科技股份有限公司,实施工程师(苏州),4-8千/月,09-25,https://jobs.51job.com/suzhou-gxq/105762963.html?s=01&t=0
江苏未至科技股份有限公司,交付工程师,6-7千/月,09-25,https://jobs.51job.com/suzhou-gxq/104253078.html?s=01&t=0
易程创新科技有限公司苏州分公司,高级软件工程师,1-2万/月,09-25,https://jobs.51job.com/suzhou-gxq/100292396.html?s=01&t=0
江苏未至科技股份有限公司,项目经理,0.8-1.6万/月,09-25,https://jobs.51job.com/suzhou-gxq/85646230.html?s=01&t=0
达内时代教育集团,咨询顾问底薪4-7K+五险一金,1-1.5万/月,09-25,https://jobs.51job.com/suzhou-gsq/113505714.html?s=01&t=0
达内时代教育集团,搜索顾问底薪4-7K-上市企业,1-1.5万/月,09-25,https://jobs.51job.com/suzhou-gsq/113505583.html?s=01&t=0
苏州工业园区测绘地理信息有限公司...,Web前端开发工程师,6-15万/年,09-25,https://jobs.51job.com/suzhou-gyyq/86942466.html?s=01&t=0
江苏云坤信息科技有限公司,项目经理,1-1.8万/月,09-25,https://jobs.51job.com/suzhou-gyyq/112994728.html?s=01&t=0
江苏云坤信息科技有限公司,前端开发工程师,0.8-1.5万/月,09-25,https://jobs.51job.com/suzhou-gyyq/70761080.html?s=01&t=0
苏州智享云信息科技有限公司,系统架构师,1.6-2.5万/月,09-25,https://jobs.51job.com/suzhou/108411172.html?s=01&t=0
英诺赛科(苏州)半导体有限公司,MES 工程师,0.6-1万/月,09-25,https://jobs.51job.com/suzhou-wjq/115142646.html?s=01&t=0
苏州麦芒软件科技有限公司,软件测试助理工程师,4-6千/月,09-25,https://jobs.51job.com/suzhou/115511688.html?s=01&t=0
三门峡崤云信息服务股份有限公司,大数据挖掘工程师,0.8-2万/月,09-25,https://jobs.51job.com/sanmenxia/110394655.html?s=01&t=0
苏州春慷咨询管理有限公司,软件实施工程师,0.3-1万/月,09-25,https://jobs.51job.com/suzhou-gsq/115617730.html?s=01&t=0
苏州佑捷科技有限公司,高级开发工程师,1.5-2万/月,09-25,https://jobs.51job.com/suzhou-gxq/114727492.html?s=01&t=0
苏州佑捷科技有限公司,Android开发工程师,1-2.5万/月,09-25,https://jobs.51job.com/suzhou-gxq/114726758.html?s=01&t=0
瑞泰信息技术有限公司,.NET开发工程师(实习生),6.5-8.5千/月,09-25,https://jobs.51job.com/suzhou/108055469.html?s=01&t=0
北京直真科技股份有限公司,前端开发工程师(苏州),1.1-1.7万/月,09-25,https://jobs.51job.com/suzhou/113018219.html?s=01&t=0

……

职位包含测试、项目经理、售前、Android,还有一部分.net也混进来了,所以分析前需要过滤掉这些数据。'测试', '.Net', '运维', '嵌入式','前端',这些职位都不要,’总监', '主管', '技术', '研发', '开发', '经理', 'java', 'JAVA', 'Java', '工程师’ ,这些需要保留。

薪资的单位也不统一,有万/年,万/月,千/月, 统一转换成万/年,没写薪资的也不要。

import csv
from decimal import Decimal
import pandas as pd
import numpy as npdef load_datas():'''从joblist.csv中装载数据:return: 数据集 datas'''datas = []with open('joblist.csv', encoding='utf-8') as fp:r = csv.reader(fp)for row in r:datas.append(row)return datasdef clear(datas):'''数据清洗规则:1.没有标明薪资的,直接去掉;2.万/月和千/月转换成万/年:param datas: 原始数据:return: 清洗后的数据'''result = []for d in datas:# 清洗后的数据new_d = []new_d.append(d[0]) # 公司job = filter_job(d[1]) # 公司# 去掉公司不符合的数据if job == '':continuenew_d.append(d[1]) # 职位salary_start, salary_end = salary_trans(d[2])# 去掉没写薪资的数据if salary_start == '':continueelse:new_d.append(salary_start)new_d.append(salary_end)new_d.append(d[3]) # 发布日期new_d.append(d[4]) # 详细页面URLresult.append(new_d)return resultdef filter_job(job):'''过滤职位名称:param job: 职位:return: 如果被过滤掉,返回'''''# 黑名单black = ['测试', '.Net', '运维', '嵌入式', '前端']# job在黑名单中if [job.find(x, 0, len(job)) for x in black].count(-1) < len(black):return ''# job在白名单white = ['总监', '主管', '技术', '研发', '开发', '经理', 'java', 'JAVA', 'Java', '工程师']if [job.find(x, 0, len(job)) for x in white].count(-1) > 0:return jobreturn ''def salary_trans(salary):'''对薪资进行数据中:param salary: 薪资:return: 二元组(起始年薪(万/年), 终止年薪(万/年))'''start, end = '', '' # 起始年薪, 终止年薪# 将所有薪资单位转换成 万/年if salary.endswith('万/年'):s = salary.replace('万/年', '').split('-')start, end = s[0], s[1]elif salary.endswith('万/月'):s = salary.replace('万/月', '').split('-')start = (Decimal(s[0]) * 12).normalize()end = (Decimal(s[1]) * 12).normalize()elif salary.endswith('千/月'):s = salary.replace('千/月', '').split('-')start = (Decimal(s[0]) * 12 / 10).normalize()end = (Decimal(s[1]) * 12 / 10).normalize()return start, endif __name__ == '__main__':# 读取并清洗数据datas = np.array(clear(load_datas()))print(len(datas))

还剩789条。

分析开始,分别看起始薪资和终止薪资的top5。

def analysis(datas):''' 数据分析 '''df = pd.DataFrame({'comp_name': datas[:, 0],'job_name': datas[:, 1],'salary_start': datas[:, 2],'salary_end': datas[:, 3],'publish_date': datas[:, 4],'url': datas[:, 5]})def _salary_analysis(row_idx, row_name):# 按薪资分组grp_salary = df.groupby(row_idx)# 按薪资排序grp_salary = sorted(grp_salary, key=lambda x: float(x[0]))print('按{}分组,共{}组不同的薪资'.format(row_name, len(grp_salary)).center(40, '-'))print('%-20s%-20s%-20s' % ('No.', row_idx, 'count'))for i, (salary, group) in enumerate(grp_salary):print('%-20d%-20s%-20d' % (i, salary, len(group)))# 薪资最高的 top5salary_top5 = sorted(grp_salary, reverse=True, key=lambda x: float(x[0]))print('\n', row_name, '最高的top5')print('%-20s%-20s%-20s' % ('No.', row_idx, 'count'))for i, (salary, group) in enumerate(salary_top5):if i == 5:breakprint('%-20d%-20s%-20d' % (i, salary, len(group)))# print(group)# 职位最多的 top5count_top5 = sorted(grp_salary, reverse=True, key=lambda x: len(x[1]))print('\n职位最多的top5')print('%-20s%-20s%-20s' % ('No.', row_idx, 'count'))for i, (salary, group) in enumerate(count_top5):if i == 5:breakprint('%-20d%-20s%-20d' % (i, salary, len(group)))_salary_analysis('salary_start', '起始薪资')print()_salary_analysis('salary_end', '终止薪资')

看来大多数职位的起始薪水是9.6~12万/年。

终止薪资的top5:

其中一个居然是360万/年,这有点扯了,在 def analysis(datas) 的第28行放开注释,很容易找打这条数据:

中翔科技(杭州)有限公司,技术总监,20-30万/月,08-05,https://jobs.51job.com/suzhou/115839486.html?s=01&t=0

估计是把年薪写成月薪了。改正这条数据后再分析一次top5:

看来整体行业不是那么景气。

明天继续向下钻取信息,看看高薪岗位的共性。 睡觉。


  作者:我是8位的

  出处:http://www.cnblogs.com/bigmonkey

  本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途!

  扫描二维码关注公作者众号“我是8位的”

苏州市java岗位的薪资状况(1)相关推荐

  1. Java就业前景和薪资状况,究竟怎么样呢?

    在未来5年内,软件人才的需求将远大于供给.Java软件工程师是目前国际高端计算机领域就业薪资较高的一类软件工程师.看到这里有人问了:那Java的现实就业前景和薪资状况,究竟怎么样呢? 1.Java工程 ...

  2. 现在学Java有前途吗?Java岗位饱和了吗?

    现在学Java有前途吗?Java岗位饱和了吗?学Java前途是有的,Java流行的网络编程语言之一,比较不错的语言,java语言在当今信息化社会中发挥着重要的作用.学历是门槛,初中高中学历建议先提升学 ...

  3. java工程师的薪资真的有那么高吗?

    java工程师的薪资 以北京为例,对JAVA工程师岗位的平均工资.不同工作年限的收入水平进行分析对比,供大家在择业.就业的时候参考. 在上图中,北京Java工程师平均薪资为14830/月,取自6397 ...

  4. Java校招期望薪资_2019互联网校招薪资出炉,整体超越 BAT、华为

    原标题:2019互联网校招薪资出炉,整体超越 BAT.华为 BAT---百度.阿里.腾讯: TMD--今日头条.美团.滴滴: 近日,网上曝出了一张互联网大厂2019届校招薪酬表,从表中可以清楚地看到, ...

  5. java开发工程师报名费多少_都说Java工程师的薪资比较高,事实真是如此吗?

    作为IT行业中的热门编程语言,Java不仅可以胜任很多工作岗位,在薪资方面也非常具有竞争优势.因此,Java开发是不少人转行的首选.很多想要学习Java的人都会问,在武汉Java学习后能拿多少工资?可 ...

  6. ui加Java岗位_本人不怕加班,java和ui学哪个好,打算以后往产品经理方向发展?...

    先说下你的几点问题,三个关键词.①:高中学历.②:不怕吃苦.③:学Java好还是学UI? 关键词一:我们选择做任何一个行业,我们都要对其市场行情进行一个了解,就Java和UI两个行业来看,我自己本身做 ...

  7. 在深圳java三年经验薪资多少正常,使用/教程/实例

    互联网行业需要哪些人才?哪个岗位薪酬最高?这份求职指南告诉你杭州薪酬紧追深圳.AI重学历.前端重经验.软件研发与产品经理两者兼具,Java则是研发者重要武器,数据技能成为热门.此外,工业互联网加 经验 ...

  8. Java开发研究生薪资_转行学什么技术最赚钱?选择java,你绝对不会后悔

    学Java的人现在确实很多,一般选择入行做IT做编程开发的人,基本都把Java作为首选语言. 为什么说选择java是比较好的呢,主要是从以下几个方面来看的: 1.高频率使用 java最为当今最火爆的编 ...

  9. 都说Java工程师的薪资比较高,事实真是如此吗?

    作为IT行业中的热门编程语言,Java不仅可以胜任很多工作岗位,在薪资方面也非常具有竞争优势.因此,Java开发是不少人转行的首选.很多想要学习Java的人都会问,在武汉Java学习后能拿多少工资?可 ...

最新文章

  1. java boolean io流_java基础入门-day22-IO流
  2. 记linux与Windows之间实现文件实时同步的方案
  3. Chapter34 创建主窗口/实现应用程序功能
  4. ssh免密登录(普通用户和root用户)
  5. oracle 定时清理表数据,关于Oracle存储过程和调度器实现自动对数据库过期数据清除的问题...
  6. php 获取字符串中的url,php使用正则表达式获取字符串中的URL
  7. __proto__ 和 prototype 到底有什么区别
  8. shell交互式输入
  9. 函数加正则实现简单计算器
  10. zookeeper相关知识与集群搭建
  11. Redis3.0--集群安装部署
  12. php 音乐歌词xml,一篇文章玩转全网音乐信息库MusicBrainz API
  13. Ubuntu安装Microsoft Windows Fonts微软字体库
  14. 人工智能与商业智能,区别、定位与联系
  15. 亚马逊asin关键词排名追踪_图文实操:手把手教你优化亚马逊关键词的自然排名!...
  16. append()函数
  17. 如何高效地阅读英文文献?
  18. Android ListView嵌套ListView的实现方式
  19. 清除 360流氓软件对浏览器的劫持插件B5T,浏览器快捷方式会带参数 123.125y.com
  20. php如何连接postgresql,php如何连接和操作PostgreSQL数据库

热门文章

  1. android maven 仓库地址,Android : 搭建本地和使用Maven仓库
  2. MC Layer Target
  3. 前端工程师的 LeetCode 之旅 -- 周赛 185
  4. 界面热阻和导热系数的测量方法
  5. Opencv的视频捕捉功能+多线程
  6. php2017下载官网,phpmailer 2017官方版最新下载_phpmailer 2017官方版官方免费版 - 软件帝...
  7. 趣图:本宝宝不开森,才不要学什么 JS
  8. Android 相机 LED 做手电筒
  9. 拉易网做HTML邮件格式年会邀请函,又快又好看,赶紧来围观吧!
  10. [答疑]茶叶盒的用例