爬取某招聘网站java、python、c/c++,php四种语言在北京,上海,广州,深圳四个一线城市的公开职位发布信息进行分析,数据样本来自前30页的数据,样本大小大概6058个。

一、数据抓取

非常简单,基本上没有发抓取策略

def downloader(city, keyword, page):''':param city::param keyword::param page::return:'''url ="https://www.lagou.com/jobs/positionAjax.json?city={}&needAddtionalResult=false"\.format(quote(city))data = {"first":"false","pn": page,"kd": keyword}headers = {"Accept":"application/json, text/javascript, */*; q=0.01","Accept-Encoding":"gzip, deflate, br","Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8","Connection":"keep-alive","Content-Length":"26","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8","Host":"www.lagou.com","Cookie":"WEBTJ-ID=20181228093856-167f276e34849d-015bd2bf49274b-6114147a-1327104-167f276e34a334; _ga=GA1.2.651225173.1545961137; _gid=GA1.2.952777220.1545961137; user_trace_token=20181228093740-29e0dba1-0a41-11e9-b14d-525400f775ce; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3D%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591%26rsv_spt%3D1%26rsv_iqid%3D0xdc8f964d00002f4f%26issp%3D1%26f%3D8%26rsv_bp%3D1%26rsv_idx%3D2%26ie%3Dutf-8%26rqlang%3Dcn%26tn%3Dbaiduhome_pg%26rsv_enter%3D1%26oq%3D%2525E4%2525B8%252593%2525E8%2525B5%252584%2525E5%25258A%25259E%26rsv_t%3Df7a1d2gJnPyNK%252FsS4vTWJ9EOKhzAsK05aVgqC43iWtqWmiKpIp0u6YQblMkUzbi3KwO7%26inputT%3D8441%26rsv_pq%3D9f44c2a800002af6%26rsv_sug3%3D57%26rsv_sug1%3D62%26rsv_sug7%3D101%26bs%3D%25E4%25B8%2593%25E8%25B5%2584%25E5%258A%259E; LGUID=20181228093740-29e0e252-0a41-11e9-b14d-525400f775ce; LGSID=20181228093745-2cd1a71c-0a41-11e9-b14d-525400f775ce; PRE_UTM=m_cf_cpc_baidu_pc; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Flp%2Fhtml%2Fcommon.html%3Futm_source%3Dm_cf_cpc_baidu_pc%26m_kw%3Dbaidu_cpc_bj_e110f9_d2162e_%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591; JSESSIONID=ABAAABAAAGGABCB3EDF3AFE52B111A35A8BDCCF214C647F; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1545961137,1545961142,1545961149; index_location_city=%E5%8C%97%E4%BA%AC; TG-TRACK-CODE=index_search; SEARCH_ID=832387387eb944a39636c9973cbd41c4; LGRID=20181228093800-3605ba8a-0a41-11e9-ad84-5254005c3644; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1545961158","Origin":"https://www.lagou.com","Referer":"https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=","User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36","X-Anit-Forge-Code":"0","X-Anit-Forge-Token":"None","X-Requested-With":"XMLHttpRequest"}proxies = {"http":"****","https":"****",}whileTrue:try:response = requests.post(url, data=data, headers=headers, proxies=proxies)response.encoding ="utf-8"ifresponse.status_code ==200:data = json.loads(response.text)result = jsonpath.jsonpath(data,"$.content.positionResult.result")[0]with MongodbTools("dataanalysis") as mongo:lagou = mongo.db["lagou"]forrow in result:row["_id"] ="{}".format(row["positionId"])lagou.update_one({"_id": row["_id"]}, {"$set": row}, upsert=True)print("update or insert data = {}".format(row["_id"]))breakexcept BaseException as e:print(e)pass

直接保存数据到mongodb中。

对人工智能感兴趣的朋友可以加群705673780,一起学习交流

二、数据分析

1、数据清洗,格式化

importpandasaspdimportnumpyasnpfrom matplotlibimportpyplotaspltfrom datetimeimportdatetime,timedeltafrom pymongoimportMongoClientimporttimemongo = MongoClient()["dataanalysis"]["lagou"]values = mongo.find({},{"_id":0,"positionAdvantage":1,"salary":1,"city":1,"positionName":1,"workYear":1,"education":1,"industryField":1,"companySize":1,"financeStage":1,"firstType":1,"secondType":1,"thirdType":1})values = [rowforrowinvalues]df = pd.DataFrame(values)# 格式化公司规模def length(data,type):value =data.valuesifnot value:return0value = value[0]ifnot value:return0ifvalue.find("以上") !=-1:iftype ==1:return2000else:return10000elif value.find("-") !=-1:t = value.replace("人","").split("-")iftype ==1:returnint(t[0])else:returnint(t[1])else:iftype ==1:return0else:return15def min_staff(data):returnlength(data,1)def max_staff(data):returnlength(data,2)df["min_staff"] = df[["companySize"]].apply(min_staff,axis=1)df["max_staff"] = df[["companySize"]].apply(max_staff,axis=1)df = df.drop(["companySize"],axis=1)# 格式化薪资def salary(data,type):value =data.valuesifnot value:return0value = value[0]ifnot value:return0ifvalue.find("-") !=-1:t = value.replace("k","").replace("K","").split("-")iftype ==1:returnint(t[0])*1000elif type ==2:returnint(t[1])*1000else:return(int(t[0])*1000+int(t[1])*1000)/2else:return0def min_salary(data):returnsalary(data,1)def max_salary(data):returnsalary(data,2)def avg_salary(data):returnsalary(data,3)df["min_salary"] = df[["salary"]].apply(min_salary,axis=1)df["max_salary"] = df[["salary"]].apply(max_salary,axis=1)df["avg_salary"] = df[["salary"]].apply(avg_salary,axis=1)# 格式化语言def language(data):value =data.valuesifnot value:returnNonevalue = value[0]ifnot value:returnNonevalue = value.upper()ifvalue.find("PYTHON") !=-1:return"python"ifvalue.find("C++") !=-1:return"c/c++"ifvalue.find("C") !=-1:return"c/c++"ifvalue.find("JAVA") !=-1:return"java"ifvalue.find("PHP") !=-1:return"php"returnNonedf["language"] = df[["positionName"]].apply(language,axis=1)df = df.dropna()

把薪资,语言,公司规模进行格式化数据,删除为Nan的数据。

2、每个城市地区的平均工资图

total_x = Nonetotal_y = []total_city = []for city_name,data in df.groupby(by="city"):result = data.groupby(by=["language"])["avg_salary"].mean().sort_index()plt.figure(figsize=(20,8),dpi=80)_x = result.index_y = result.valuesplt.bar(_x,_y)total_x = _xtotal_y.append(_y)total_city.append(city_name)plt.xlabel("语言")plt.ylabel("平均薪资")plt.title("{}地区编程语言平均薪资".format(city_name))plt.grid()plt

3、平均薪资城市之间的对比

plt.figure(figsize=(20,8),dpi=80)interval =6ind = np.array(range(0,len(total_x) * interval,interval))width =1forindex inrange(len(total_city)):plt.bar(ind - (2- index) * width + width/2,total_y[index],label=total_city[index],width=1)plt.xticks(range(0,len(total_x) * interval,interval),total_x)plt.xlabel("语言")plt.ylabel("平均薪资")plt.title("一线城市编程语言平均薪资")plt.grid()plt.legend()plt

可见大帝都的平均工资最高

4、岗位优势的分析

importredefposition_advantage(data):value = data.valuesifnotvalue:return[]value = value[0]ifnotvalue:return[]value = re.sub(r"[.~]","",value)returnre.split(r'[,,; ;、+-]',value)labels = list(set([iforrowindf[["positionAdvantage"]].apply(position_advantage,axis=1).valuesforiinrowifi]))position_data = pd.DataFrame(np.zeros((df.shape[0],len(labels))).astype(int),columns=labels,index=df.index)forlabelinlabels:position_data[label][df["positionAdvantage"].str.contains(label)] =1result = position_data.sum().sort_values(ascending=False)size = result[:10].valuessize = [rowforrowinsize]labels = result[:10].indexlabels = [rowforrowinlabels]size.append(result.sum() - sum(size))labels.append("其它")explode = [0foriinrange(len(size))]explode[0] =0.1plt.figure(figsize=(10,10),dpi=80)plt.pie(size, explode=explode, labels=labels, autopct='%1.1f%%',shadow=True, startangle=90)plt.title("岗位优势百分比")plt

5、城市之间的岗位优势对比

total_value = []total_label = []labels = [rowforrow in result[:10].index]forindex inrange(len(total_city)):city = total_city[index]data = position_data[df["city"] == city]total_size = data.sum().sum()total_label.append(city)total_value.append((data[labels].sum()/total_size*10000).values.tolist())plt.figure(figsize=(20,8),dpi=80)interval =8ind = np.array(range(0,len(labels) * interval,interval))width =1forindex inrange(len(total_label)):plt.bar(ind - (2- index) * width + width/2,total_value[index],label=total_label[index],width=1)plt.xticks(range(0,len(labels) * interval,interval),labels)plt.xlabel("福利")plt.ylabel("占比(*100)")plt.title("岗位优势占比图")plt.grid()plt.legend()plt

6、工作经验要求占比分析

#工作经验要求占比forcity_name,dataindf.groupby(by="city"):result =data.groupby(by=["workYear"])["avg_salary"].count().sort_values()plt.figure(figsize=(8,8),dpi=80)_x = result.index_y = result.valuesplt.pie(_y, labels=_x, autopct='%1.1f%%',shadow=True, startangle=90)plt.title("{}地区编程语言学历要求占比".format(city_name))plt.grid()plt

7、学历经验要求占比分析

#学历要求占比forcity_name,dataindf.groupby(by="city"):result =data.groupby(by=["education"])["avg_salary"].count().sort_index()plt.figure(figsize=(8,8),dpi=80)_x = result.index_y = result.valuesplt.pie(_y, labels=_x, autopct='%1.1f%%',shadow=True, startangle=90)plt.title("{}地区编程语言学历要求占比".format(city_name))plt.grid()plt

8、绘制岗位优势的词云图

# 生成词图fromscipy.miscimportimreadfromwordcloudimportWordCloudfromwordcloudimportImageColorGeneratorimportmatplotlib.pyplotaspltfromosimportpathcloud = WordCloud(#设置字体,不指定就会出现乱码,文件名不支持中文font_path="C:/simfang.ttf",#font_path=path.join(d,'simsun.ttc'),#设置背景色,默认为黑,可根据需要自定义为颜色background_color='black',#词云形状,#mask=color_mask,#允许最大词汇max_words=400,#最大号字体,如果不指定则为图像高度max_font_size=100,#画布宽度和高度,如果设置了msak则不会生效width=1200,height =800,margin =2,#词语水平摆放的频率,默认为0.9.即竖直摆放的频率为0.1prefer_horizontal =0.8)result = position_data.sum().sort_values(ascending=False)_labels = [rowforrowinresult.index]_frequency = [rowforrowinresult.values]_data = { _labels[index]:_frequency[index]forindexinrange(len(_labels))}wc = cloud.generate_from_frequencies(_data)wc.to_file("cloud.jpg")#保存图片#显示词云图片plt.imshow(wc)#不现实坐标轴plt.axis('off')plt

对人工智能感兴趣的朋友可以加群705673780,一起学习交流

2019年程序员岗位招聘信息分析相关推荐

  1. 福州python招聘_【Python程序员招聘|Python程序员最新招聘信息】-看准网

    立即投递 职位薪资:6000-10000 经验:不限 学历:不限 类型:全职 linux下python编程 对接ai平台做应用 立即投递 职位薪资:8000-13000 经验:不限 学历:本科 类型: ...

  2. Python 分析近2000条“数据分析”相关岗位招聘信息

    文章目录 准备阶段 数据获取 数据清洗 数据可视化 (1)岗位名称 (2)工作地点 (3)公司所属行业 (4)工作经验要求 (5)公司规模情况 (7)学历要求 (8)公司类型 (9)招收人数 (10) ...

  3. 只要35+的程序员,招聘广告开始玩噱头?

    在互联网行业工作,年龄是一个沉重的话题. 进入35岁之后,便走到了人生的一个分水岭,意味着进入一个随时可能被裁掉的阶段.裁员年年有,今年似乎更加严峻.从B站.快手.爱奇艺,再到百度MEG.腾讯PCG. ...

  4. 程序员岗位介绍,我爬取了拉勾网所有技术岗位工资数据,算法工程师平均薪资高达2W

    点击观看视频 ↓↓↓ 程序员岗位介绍,我爬取了拉勾网所有技术岗位工资数据,算法工程师平均薪资高达2W 文字版 大家好,我是宁一,一个多月没有更新视频了,这一个多月我都在准备一个店铺商城的云开发小程序项 ...

  5. C++程序员学习发展方向分析和指导(C++入门学习指导建议必看)

    一路走来,磕磕碰碰,走到现在,历经了千辛万苦,可是路才刚刚开始走,未来还很长,我将会不断的思考和探索. 我想,如果是打算走进C++编程的同志们,请好好看完这篇文章,或许,对你的发展有所启发.但是,不要 ...

  6. 实习僧——数据分析岗招聘信息分析 源代码

    爬取实习僧网站所有数据分析实习相关的岗位信息,对其做数据分析 import pandas as pd import matplotlib.pyplot as plt import seaborn as ...

  7. 基于‘BOSS直聘招聘信息’分析企业到底需要什么样的PHPer

    基于'BOSS直聘招聘信息'分析企业到底需要什么样的PHPer 前两篇文章都没看,好意思直接看结果? Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息 Pyhton爬虫实战 - 抓取 ...

  8. 干货!!不同程序员岗位对不同电脑性能的要求(编程开发选电脑)

    请大家多多点赞,评论,转发,关注!!!谢谢 这次的文章主要是从软件开发的不同岗位需求,对电脑性能要求和配置要求的角度来聊一聊程序员到底该配一个什么配置的电脑. 干货!!不同程序员岗位对不同电脑性能的要 ...

  9. 带你了解IT互联网行业程序员岗位有些什么类型?

    程序可以改变世界,程序员是一种有创造性的职业, 现存一个事实是:程序员也有很多种,程序员之间的差异其实是非常大的, 只有很了解程序员的人才能完全了解这一点, 虽然有大多数的高层管理者对所有的程序员都一 ...

最新文章

  1. LeetCode 54. Spiral Matrix--Python解法--螺旋排序
  2. 使用ThinkPHP实现生成/校验验证码功能
  3. GdiPlus[57]: 图像(九) IGPBitmap 特有的属性与方法
  4. linux grouplist groupinstall groupremove 简介
  5. 学习进度条(第三周)
  6. 怎么设置java的精度值_Java:如何为double值设置Precision?
  7. float浮点数的四舍五入
  8. 10 倍高清不花!大麦端选座 SVG 渲染
  9. DFS(深度优先算法)难
  10. CSDN - 屏蔽百度广告
  11. 50. 熟悉与STL相关的Web站点
  12. POJ 3267 The Cow Lexicon(动态规划)
  13. gcc/g++/make/cmake/makefile/cmakelists的恩恩怨怨
  14. js 操作ntko控件实现编辑文档内容
  15. Java KeyTool 的使用
  16. Android动态设置view的大小及其位置
  17. python+opencv修改图像指定像素的值
  18. 基于java SSM的仿哔哩哔哩视频分享系统
  19. Python程序员面试,这些问题你必须提前准备!
  20. 未来最有发展前景的行业分享

热门文章

  1. 软考高级-系统架构师-企业信息化战略与实施
  2. 太极软件qn的代码_超详细介绍如何利用太极+QN框架制作一个属于自己的QQxml卡片...
  3. keras迁移学习猫狗大战-Vgg16
  4. Ubuntu安装无线网卡(USB)驱动
  5. leetcode 刷题视频(8) - 搜索
  6. 积分会员卡收银系统源码 支持多门店+分销 含详细搭建教程
  7. 《金字塔原理》的读后感作文3100字
  8. Josh 的学习笔记之数字通信(Part 5——通信链路分析)
  9. [论文翻译]Scene text recognition from two-dimensional perspective
  10. android地图论文,Android系统的电子地图论文