爬取拉勾网,并进行数据分析
来源:互联网 发布:搭配发型的软件 编辑:程序博客网 时间:2024/06/15 11:56
拉勾网是现在互联网招聘比较火热的一个网站,本篇文章主要是爬取拉勾网“数据分析师”这个岗位,并且对所爬取到的信息,进行数据分析。
数据采集
拉勾网的岗位信息主要是用json文件存储,在position这个json文件中,我们找到了所需要的岗位信息
接着便开始写爬虫了:
# -*- coding: UTF-8 -*-import json import requestsheaders = { "Cookie": "user_trace_token=20171010163413-cb524ef6-ad95-11e7-85a7-525400f775ce; LGUID=20171010163413-cb52556e-ad95-11e7-85a7-525400f775ce; JSESSIONID=ABAAABAABEEAAJAA71D0768F83E77DA4F38A5772BDFF3E6; _gat=1; PRE_UTM=m_cf_cpt_baidu_pc; PRE_HOST=bzclk.baidu.com; PRE_SITE=http%3A%2F%2Fbzclk.baidu.com%2Fadrc.php%3Ft%3D06KL00c00f7Ghk60yUKm0FNkUsjkuPdu00000PW4pNb00000LCecjM.THL0oUhY1x60UWY4rj0knj03rNqbusK15yDLnWfkuWN-nj0sn103rHm0IHdDPbmzPjI7fHn3f1m3PDnsnH9anDFArH6LrHm3PHcYf6K95gTqFhdWpyfqn101n1csPHnsPausThqbpyfqnHm0uHdCIZwsT1CEQLILIz4_myIEIi4WUvYE5LNYUNq1ULNzmvRqUNqWu-qWTZwxmh7GuZNxTAn0mLFW5HDLP1Rv%26tpl%3Dtpl_10085_15730_11224%26l%3D1500117464%26attach%3Dlocation%253D%2526linkName%253D%2525E6%2525A0%252587%2525E9%2525A2%252598%2526linkText%253D%2525E3%252580%252590%2525E6%25258B%252589%2525E5%25258B%2525BE%2525E7%2525BD%252591%2525E3%252580%252591%2525E5%2525AE%252598%2525E7%2525BD%252591-%2525E4%2525B8%252593%2525E6%2525B3%2525A8%2525E4%2525BA%252592%2525E8%252581%252594%2525E7%2525BD%252591%2525E8%252581%25258C%2525E4%2525B8%25259A%2525E6%25259C%2525BA%2526xp%253Did%28%252522m6c247d9c%252522%29%25252FDIV%25255B1%25255D%25252FDIV%25255B1%25255D%25252FDIV%25255B1%25255D%25252FDIV%25255B1%25255D%25252FH2%25255B1%25255D%25252FA%25255B1%25255D%2526linkType%253D%2526checksum%253D220%26ie%3Dutf8%26f%3D8%26ch%3D2%26tn%3D98010089_dg%26wd%3D%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591%26oq%3D%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591%26rqlang%3Dcn%26oe%3Dutf8; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F%3Futm_source%3Dm_cf_cpt_baidu_pc; _putrc=347EB76F858577F7; login=true; unick=%E6%9D%8E%E5%87%AF%E6%97%8B; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=63; TG-TRACK-CODE=index_search; _gid=GA1.2.1110077189.1507624453; _ga=GA1.2.1827851052.1507624453; LGSID=20171011082529-afc7b124-ae1a-11e7-87db-525400f775ce; LGRID=20171011082545-b94d70d5-ae1a-11e7-87db-525400f775ce; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1507444213,1507624453,1507625209,1507681531; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1507681548; SEARCH_ID=e420ce4ae5a7496ca8acf3e7a5490dfc; index_location_city=%E5%8C%97%E4%BA%AC", "Host": "www.lagou.com", 'Origin': 'https://www.lagou.com', 'Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3408.400 QQBrowser/9.6.12028.400'}post_data = {'first': 'false', 'kd':'数据分析师' }#这是请求网址的一些参数def start_requests(pn): html = requests.post(myurl + str(pn), data=post_data, headers=headers, verify=False) html_text = html.text content = json.loads(html_text) #loads()暂时可以理解为把json格式转为字典格式,而dumps()则是相反的 pagesize = content.get('content').get('pageSize') #这是Pytho字典中的get()用法 return pagesizedef get_result(pagesize): for page in range(1, pagesize+1): content_next = json.loads(requests.post(myurl + str(page), data=post_data, headers=headers, verify=False).text) company_info = content_next.get('content').get('positionResult').get('result') if company_info: for p in company_info: line = str(p['city']) + ',' + str(p['companyFullName']) + ',' + str(p['companyId']) + ',' + \ str(p['companyLabelList']) + ',' + str(p['companyShortName']) + ',' + str(p['companySize']) + ',' + \ str(p['businessZones']) + ',' + str(p['firstType']) + ',' + str( p['secondType']) + ',' + \ str(p['education']) + ',' + str(p['industryField']) +',' + \ str(p['positionId']) +',' + str(p['positionAdvantage']) +',' + str(p['positionName']) +',' + \ str(p['positionLables']) +',' + str(p['salary']) +',' + str(p['workYear']) + '\n' file.write(line)if __name__ == '__main__': title = 'city,companyFullName,companyId,companyLabelList,companyShortName,companySize,businessZones,firstType,secondType,education,industryField,positionId,positionAdvantage,positionName,positionLables,salary,workYear\n' file = open('%s.txt' % '爬虫拉勾网', 'a') #创建爬虫拉勾网.txt文件 file.write(title) #把title部分写入文件作为表头 cityList = [u'北京', u'上海',u'深圳',u'广州',u'杭州',u'成都',u'南京',u'武汉',u'西安',u'厦门',u'长沙',u'苏州',u'天津',u'郑州'] #这里只选取了比较热门的城市,其他城市只几个公司提供职位 for city in cityList: print('爬取%s' % city) myurl = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city={}&needAddtionalResult=false&pn='.format( city) pagesize=start_requests(1) get_result(pagesize) file.close()
值得说明的是header()里面需要添加所有的header信息,不然拉勾网的反爬虫会让程序报错。
数据清洗
在上面的数据中,我们发现了一些缺失数据以及脏数据,因此,在数据分析之前,首先应该把数据进行清洗。
在数据清洗之前,我把刚刚的txt文件转换成CSV UTF-8格式,名字改成英文格式,以便于pycharm的读取。
# -*- coding:utf-8 -*-import pandas as pdimport numpy as npdf=pd.read_csv('C:\\Users\\Administrator\\Desktop\\DataAnalyst .csv')print(df.head())#读取前五行
从上面的图中,我们能看出关于工资方面应该做出处理,这里只是一个工资的区间,下面我们把工资清理成平均值形式,并且以数据可视化显示出来:
df_duplicates=df.drop_duplicates(subset='positionId',keep='first')def cut_word(word,method): position=word.find('-') length=len(word) if position !=-1: bottomsalary=word[:position-1] topsalary=word[position+1:length-1] else: bottomsalary=word[:word.upper().find('K')] topsalary=bottomsalary if method=="bottom": return bottomsalary else: return topsalarydf_duplicates['topsalary']=df_duplicates.salary.apply(cut_word, method="top")df_duplicates['bottomsalary']=df_duplicates.salary.apply(cut_word, method="bottom")df_duplicates['topsalary']=df_duplicates.salary.apply(cut_word,method="top") # apply()函数形式:apply(func,*args,**kwargs),*args相当于元组,**kwargs相当于字典df_duplicates["bottomsalary"]=df_duplicates.salary.apply(cut_word,method="bottom")#apply()函数作用:用来间接的调用一个函数,并把参数传递给函数df_duplicates.bottomsalary.astype('int')# 字符串转为数值型df_duplicates.topsalary.astype('int')df_duplicates["avgsalary"]=df_duplicates.apply(lambda x:(int(x.bottomsalary)+int(x.topsalary))/2,axis=1) #lambda是一种函数,举例:lambda x:x+1,x是参数,x+1是表达式;axis=1表示作用于行#选出我们想要的内容进行后续分析df_clean=df_duplicates[['city','companyShortName','companySize','education','positionName','positionLables','workYear','avgsalary','industryField']]import matplotlib.pyplot as pltplt.style.use("ggplot") #使用R语言中的ggplot2配色作为绘图风格,为好看from matplotlib.font_manager import FontProperties #matplotlib.Font_manager 是一种字体管理工具zh_font = FontProperties(fname="C:\\WINDOWS\\Fonts\\simsun.ttc")#matplotlib.Font_manager.FontProperties(fname) 是指定一种字体,C:\\WINDOWS\\Fonts\\simsun.ttc 是字体路径,直接复制到电脑搜索,你看能不能找到fig=plt.figure(figsize=(8,5)) #关于绘图方面,文末放了一个链接,讲述的比较详细ax=plt.subplot(111)rect=ax.hist(df_duplicates["avgsalary"],bins=30)ax.set_title(u'薪酬分布',fontProperties=zh_font)ax.set_xlabel(u'K/月',fontProperties=zh_font)plt.show(plt.xticks(range(5,100,5)) ) #xticks为x轴主刻度和次刻度设置颜色、大小、方向,以及标签大小。
从上面的图可以看出数据是偏右分布,其中大多数据集中在10K~20K,也有极少数人获得高薪。
不同城市的薪酬分布情况:
ax=df_clean.boxplot(column='avgsalary',by='city',figsize=(9,7))for label in ax.get_xticklabels(): label.set_fontproperties(zh_font)
北京市薪酬分布中位数大约在20k,居全国首位。其次是上海、杭州、深圳,中位数大约为15k左右,而广州中位数只大约为12k。
不同学历的薪酬分布
ax=df_clean.boxplot(column='avgsalary',by='education',figsize=(9,7))for label in ax.get_xticklabels(): label.set_fontproperties(zh_font)
北京上海工作经验不同薪酬分布情况
df_bj_sh=df_clean[df_clean['city'].isin(['上海','北京'])]ax=df_bj_sh.boxplot(column='avgsalary',by=['workYear','city'],figsize=(19,6))for label_x in ax.get_xticklabels(): label_x.set_fontproperties(zh_font)
从图中我们能够得出,对于工作一年以下的,上海和北京两个地方薪资基本一致,但是有能力的人在北京能够得到较高的薪水。对于工作1-3年的人,北京工资的中位数都要比上海的上四分位数要大了。如果你的工作经验还不大充足,你想好去哪里发展了吗?
北上广深对数据分析职位需求量
def topN(df,n=5): counts=df.value_counts() #value_counts()统计所有非零元素的个数 return counts.sort_values(ascending=False)[:n] #sort_values()对数据进行排序,ascending是设置升序和降序df_bj_sh_gz_sz=df_clean[df_clean['city'].isin(['上海','北京','广州','深圳'])]df_bj_sh_gz_sz.groupby('city').positionName.apply(topN)
city上海 数据分析师 79 大数据开发工程师 37 数据产品经理 31 大数据工程师 26 高级数据分析师 20北京 数据分析师 238 数据产品经理 121 大数据开发工程师 69 分析师 49 数据分析 42广州 数据分析师 31 需求分析师 23 大数据开发工程师 13 数据分析专员 10 数据分析 9深圳 数据分析师 52 大数据开发工程师 32 数据产品经理 24 需求分析师 21 大数据架构师 11Name: positionName, dtype: int64
我们现在可以看出,虽然想抓取的是数据师职位的情况,但得到的是和数据分析相关的职位,自己还是要在获取数据、数据清理方面多下功夫啊。
不管怎样我们还是能够得出来,观察北上广深的数据分析师职位数量,还是北京力压群雄啊。
公司所处行业领域词云图分析
import re #re模块提供了对正则表达式的支持import jieba as jbfrom wordcloud import WordCloudword_str = ','.join(df_clean['industryField']) # 以','为分隔符,将所有的元素合并成一个新的字符串,注意:csv文件中,单元格之间有逗号。#对文本进行分词word_split = jb.cut(word_str) #精确模式#使用|作为分隔符word_split1 = "|".join(word_split)pattern=re.compile("移动|互联网|其他|金融|企业|服务|电子商务|O2O|数据|服务|医疗健康|游戏|社交网络|招聘|生活服务|文化娱乐|旅游|广告营销|教育|硬件|信息安全")#匹配所有文本字符;pattern 我们可以理解为一个匹配模式,用re.compile()方法来获得这个模式word_w=pattern.findall(word_split1) #搜索word_split1,以列表形式返回全部能匹配的子串word_s = str(word_w)my_wordcloud = WordCloud(font_path="C:\\WINDOWS\\Fonts\\simsun.ttc",width=900,height=400,background_color="white").generate(word_s)plt.imshow(my_wordcloud)plt.axis("off") #取出坐标轴plt.show()
如图所示:对于数据分析这一职位需求量大的主要是在互联网、移动互联网、金融、电子商务这些方面,所以找工作的话去这几个领域获得职位的几率估计是比较大的。我想这可能还有另一方面的原因:拉勾网本身主要关注的就是互联网领域,等自己技术成熟了,要爬虫获得一份包含所有行业的数据进行一次分析。
分析结论
从总体薪酬分布情况上,数据分析这一职业工资普遍较高的,大多人是在10k-25之间每月,但这只是拉勾网显示的工资,具体的就不太清楚了。
从不同城市薪资分布情况得出,在北京工作的数据分析师工资中位数在20k左右,全国之首。其次是上海、杭州、深圳,如果要发展的话,还是北、上、深、杭比较好啊。
从不同学历薪资情况得出,学历越高发展所获得工资是越高,其中专科生略有劣势,我想的是数据分析应该对数学有一定要求,毕竟大学是学了数理统计、高等数学还线性代数的。
根据北京上海工作经验不同薪酬分布情况,得出如果有些工作经验去北京比上海获得的工资要高一些。
分析北上广深的数据分析师职位需求数量,北京以238个获得最高。
根据公司所处行业领域词云图分析,对于数据分析师需求量大的行业主要是互联网、电子商务、金融等领域。
- 爬取拉勾网,并进行数据分析
- adams导出图形数据,并导入matlab进行分析
- 怎么进行数据分析
- 从Kafka topic中获取数据并在Storm中进行分析
- 从Kafka topic中获取数据并在Spark中进行分析
- 如何用Perl对Excel的数据进行提取并分析
- ArcGIS对矢量进行缓冲分析,并将缓冲区域转化为栅格数据
- 利用python调用elasticsearch-api来分析数据并作图进行日报邮件发送
- 程序员怎么获取股票实时数据,并进行技术指标分析呢?
- 我是怎样爬下6万共享单车数据并进行分析的(附代码)
- 我是怎样爬下6万共享单车数据并进行分析的(附代码)
- 我是怎样爬下6万共享单车数据并进行分析的(附代码)
- 利用随机森林和梯度替身决策树对titanic数据进行分类,并对结果进行分析
- 按流程进行数据分析
- matplotlib进行绘图分析数据
- 使用python进行数据分析
- 使用 Pig 进行数据分析
- 利用Hive进行数据分析
- 数据结构-循环链表
- 参加话题活动送算法入门畅销书《趣学算法》(话题已结束,书已经全部送出,中奖者请注意查收!)
- UIViewController的生命周期及iOS程序执行顺序
- meshlab编译过程(3)-编译mpir-2.7.2
- 习题5.5
- 爬取拉勾网,并进行数据分析
- JVM打印GC参数配置
- 解决WordPress无法上传媒体文件以及无法下载和安装主题与插件的问题
- Java设计模式(十二) 策略模式
- c++函数和指针
- 2017-10-31
- springboot整合mybatis xml方式配置SQL
- 删除null 字段
- Android socket通过UDP的方式发送,接收数据