女王的尿奴为帮女神找工作,我用Python爬了拉勾网-大数据分析和人工智能

    为帮女神找工作,我用Python爬了拉勾网-大数据分析和人工智能
    原创: Zevin来自:赛仕数据圈
    没错,女神就是我老婆,准备转行运营,不过在我发这篇文章之前,女神就已经拿到offer了,前后用了不到一个星期,真是神速。
    言归正传,本文用Python爬取了拉勾网运营相关的职位,并利用Excel图表,简要分析了运营岗位的招聘数量、行业分布、薪资水平,经验和学历要求等基本情况。文章的前半部分主要是爬虫代码,后半部分是对爬取结果的分析。
    第一部分:Python爬虫代码
    分析的前提是获取有用的数据,Python爬虫是获取网络数据的利器。对于Python这样一门语言,很多朋友的兴趣,始于爬虫,爬爬豆瓣、链家、京东、淘宝、招聘网站等信息,觉得挺有意思瑞珠滴眼液 。我学习Python的目主要是用它来做数据分析,也包括一些简单的数据爬取。
    但我对Python的兴趣缘起,不是爬虫,而是想在除了SAS之外,尝试一个新的工具,一门新的编程语言。正如那句名言,“人生苦短,我用Python”,它的确比较简洁,能干很多事谷元廷,而且不需要太“循规蹈矩”。
    '''1.导入所需的模块'''importreimportnumpyasnpimportpandasaspdimporturllib.requestimporturllib.errorimporttimeimportosos.getcwd() #获取当前工作目录os.chdir('D:\') #设置新的工作目录#pwd=%pwd #查看工作目录'''2.设置代理请求'''print('---设置代理服务器并模拟浏览器登录---')#proxy="127.0.0.1:8888"proxy="117.90.3.144:9000"defuse_proxy(proxy_addr,url): try:req=urllib.request.Request(url)req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0")proxy= urllib.request.ProxyHandler({'http':proxy_addr}) opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)urllib.request.install_opener(opener)data = urllib.request.urlopen(req).read().decode('utf-8',"ignore")returndata excepturllib.error.URLErrorase:ifhasattr(e,"code"): print(e.code)ifhasattr(e,"reason"): print(e.reason)time.sleep(5) exceptExceptionase:print("exception:"+str(e))time.sleep(2)

    以上两步是爬取前的准备工作。当然,还有一个非常重要的环节,那就是对所要爬取的网页进行分析。拉勾网的结构较为简单,通过浏览器查看网页源码,找到需要爬取的职位分类目录的标签位置,然后编写提取信息的函数,可以利用BeautifulSoup、Xspath,或者正则表达式,来进行文本信息的提取。本文使用的是正则表达式。
    职位目录,只用爬一次即可。如果只爬取某个岗位的职位列表,也可以直接爬取具体网页的职位列表,而不用再爬整个目录。在下面的第4步中,也可以不用事先爬取职位列表的页数,可以从第一页开始,如果Error就跳过,从下一个岗位的第一页开始,继续爬取。
    '''3.爬取首页的招聘岗位分类'''#拉勾网首页的职位目录非常清晰,比较容易爬取翌景嘉园,且只用爬一次print('---爬取首页职位分类目录---')url='https://www.lagou.com/'cnt=use_proxy(proxy,url)job_class=[]gr_s0='<h2>(.*?)<.*?<div class="menu_sub dn">(.*?)</div>'gr_s1='<span>(.*?)</span>.*?<dd>(.*?)</dd>'gr_s2='zhaopin/(.*?)/".*?>(.*?)</a>'dt_s1=re.compile(gr_s0,re.S).findall(cnt)foriinrange(0,len(dt_s1)): dt_s2=re.compile(gr_s1,re.S).findall(dt_s1[i][1]) forjinrange(0,len(dt_s2)):dt_s3=re.compile(gr_s2,re.S).findall(dt_s2[j][1])forkinrange(0,len(dt_s3)): job_class=job_class+[(str(dt_s1[i][0].replace(' ','').replace(' ','')), str(dt_s2[j][0]),str(dt_s3[k][0]),str(dt_s3[k][1]))]data=pd.DataFrame(job_class,columns=['class_main','class_sub','job_src_key','position'])data['url']='https://www.lagou.com/zhaopin/'+data['job_src_key']data=data[data.job_src_key!='meishushejishi%EF%BC%882D3D%EF%BC%89'] #处理一个异常dataallall=data.copy()dataallall.to_csv('lagou_contents_all.csv')'''4.获取爬取网页的数量'''#这一步尽可能将每次爬取的间隔时间设置长一些,以防被反爬print('---爬取选定职位的网页页数---')data=dataallall[dataallall.position.str.contains("运营")].drop_duplicates(['position'])data=data[~data.position.str.contains("海外|游戏|经理|总监")] data.index=list(np.arange(len(data)))#为了测试代码,筛选一小部分进行爬取#data=data.ix[:1,:]num=[]forindex,iinenumerate(data['url']): numcont=use_proxy(proxy,str(i)) numlist=re.compile('totalNum">(.*?)<',re.S).findall(numcont) print(str(numlist)+'---'+str(index+1)+' / '+str(len(data))+'---'+str(i)) num=num+numlist time.sleep(np.random.randint(180,300))data['pages']=num#为了测试代码,手工调整了爬取的页数,尽量小点儿#data['pages']=['1','1']data=data[data.pages!='0'] #为0的暂时无相关职位data=data.drop_duplicates(['job_src_key']) #去重data.index=list(np.arange(len(data)))data.to_csv('lagou_contents_yunying.csv')

    接下来就是爬取具体的职位列表了。为避免反爬,每一次爬取之间尽量间隔较长时间戴志诚老婆,比如随机1-3分钟。但这样整个爬取的时间也会非常长,不过没关系,让程序它自己去跑吧。
    数据分析师、程序员等,也许就是这样一种人,虽然他已经休息了,打卡下班了,但是他的代码还在继续工作,他的模型还在自动运算。我认为这是一群很酷的人,尤其是那些可以将工作尽可能自动化的人。
    我个人使用SAS多一点,SAS宏帮助我提高了效率,节省了很多时间。作为数据分析师,经常积累一些可以自动化处理的、提高效率的、化繁为简的编程技巧,非常重要。
    '''5.开始爬取选定职位分类的网页'''#这里主要使用了正则表达式来提取所需的数据print('---爬取所有页面数据---')data_All=pd.DataFrame()foriinrange(0,len(data)): forjinrange(1,int(data['pages'][i])+1):url_flag=str(data.url[i])+'/'+str(j)gr_1='职位列表(.*?)相关搜索'gr_2='<li(.*?)</li>' dt_0=use_proxy(proxy,url_flag)#time.sleep(np.random.randint(60,180)) time.sleep(np.random.randint(5,60)) dt_1=re.compile(gr_1,re.S).findall(dt_0.replace(' ',''))dt_2=re.compile(gr_2,re.S).findall(str(dt_1).replace('\n',''))sr1='data-positionid="(.*?)".*?"data-company="(.*?)"data-positionname="(.*?)"data-companyid="(.*?)"data.*?href="(.*?)"target=.*?[<em>.*?</em>].*?format-time">(.*?)</span>.*?money">(.*?)<.*?</i>-->(.*?)</div></div></div><divclass="company"><divclass="company_name"><ahref="(.*?)"target.*?"industry">(.*?)</div></div>.*?"li_b_l">(.*?)</div><divclass="li_b_r">(.*?)</div></div>'sr2="<em>(.*?)</em>"dd= re.compile(sr2,re.S).findall(str(dt_2).lower())dt_3= re.compile(sr1,re.S).findall(str(dt_2).lower())forkinrange(0,len(dt_3)): dt_3[k]=tuple(list(dt_3[k])+[dd[k]])data_page=pd.DataFrame(dt_3)#print(data_page)data_All=pd.concat([data_page,data_All])data_All[data_page.shape[1]+1]=[data['job_src_key'][i]]*len(data_All)print(str(data.job_src_key[i])+' :--- 第 '+str(i+1)+' / '+str(len(data))+' 个岗位 ---第 '+str(j)+' / '+str(int(data['pages'][i]))+' 页 爬取成功------')'''6.初步整理所爬取到的数据'''#数据整理这块主要是用pandas包,列表推导式,以及一些字符处理函数,珍妮巴斯如split、replace等print('---数据整理---')dataAll=data_All.copy()dataAll.index=list(np.arange(len(dataAll)))dataAll.columns=['position_id','company_name','position_title' ,'hrid_id','job_url','post_time','salary','experience','company_url' ,'company_type','job_label','company_mark','district','job_src_key']dataAll=dataAll.drop("company_mark",1)growth_type=[x.split('/')forxindataAll['company_type']]dataAll['growth_type']=pd.DataFrame(growth_type)[1]educational=[x.split('/')forxindataAll['experience']]dataAll['seniority']=pd.DataFrame(educational)[0]dataAll['educational']=pd.DataFrame(educational)[1]salary_tmp=[x.replace("k","").split("-")forxindataAll['salary']]dataAll['salary_left']=pd.DataFrame(salary_tmp)[0]dataAll['salary_right']=pd.DataFrame(salary_tmp)[1]dataAll['job_label']=[str(x).replace('</span><span>',',').replace('<span>','').replace('</span>','')forxindataAll['job_label']]dataALL=pd.merge(dataAll,data,on='job_src_key',how='left')'''7.将爬取的数据写出到Excel中'''print('---写出数据---')dataALL.to_excel('lagou_yunying_all.xlsx')print('------数据写出成功!------')
    整个爬取代码如上。对于Python,我还是个菜鸟,还在渐进学习中,就本文的爬虫而言,不仅代码较多,而且爬取的速度也非常慢,后续还可以进一步优化,比如通过函数封装功能、通过爬虫框架进行爬取、使用代理IP池以防止反爬,将爬取的数据写入本地MySQL数据库等。

    第二部分:整理和分析数据
    受限于爬取效率只爱金泰妍,以上只爬取了86页,而每页的职位列表约显示14条记录信息,这样总计大约是1200条记录。其中产品运营、数据运营、用户运营、活动运营、内容运营、新媒体运营等占比均为12%左右,品类运营、网店运营、商家运营等占比较少。
    通过筛选、整理,最终得到如下字段:
    position_id职位ID
    company_name公司名称
    position_title职位名称
    job_url职位链接
    job_src_key职位分类ID
    post_time发布时间
    salary薪资范围
    experience工作经验和学历
    company_url公司简页链接
    company_type公司类别
    business公司行业
    job_label职位标签
    city工作城市
    district工作城市区域
    growth_type公司融资情况
    seniority工作经验
    educational学历
    salary_left薪资范围下限
    salary_right薪资范围上限
    salary_avg平均薪资
    class_main职位大分类
    position职位小分类
    url职位小分类链接
    这些字段中的部分将用于接下来的分析。比如行业,地区,学历,工作经验,薪资,这些是比较关键的字段澡堂服务员。此外,还可以做一些有意思的分析,例如对职位标签进行词频统计,然后制作词云。
    1、运营岗位需求最多的前十个公司是哪些?
    如图,美团显然最多。

    2、运营岗位需求最多的前十个城市是哪些?
    毫无疑问,北上广深比较靠前,杭州的运营岗位需求也不少。而对于运营岗位的平均薪资来说,北京最高,深圳次之,接下来是上海和杭州,差别不太大,另外成都的平均薪资也相关较高摩的大飚客 。

    3、学历和平均薪资有什么关系?
    学历和平均薪资对等,学历越高,无论是平均薪资,还是薪资范围的上下限,也是越高的。不过对运营岗位,学历的要求似乎并不高,从岗位招聘数量可以看出诉诸无知,硕士学历需求数量实在太少了。如果爬取的是数据挖掘相关的岗位,也许硕士的需求数量就会相对多一些。

    4、工作年限和平均薪资有什么关系?
    工作经验年限也是和平均薪资对等的,工作经验年限越长,平均薪资越高。10年经验以上的数量很少,1-3年经验的最多,其次是3-5年的。毕竟互联网公司的平均年龄都比较低,大多26、27岁上下,工作超过5年的,一般也都积累了一些圈子,人脉牛奋男 ,可以借助这些转换工作,包括一些猎头。

    下面这张表,是工作经验年限和学历的交叉表,其中填入的数字是平均薪资。由于硕士学历、工作10年以上的数量较少,不具有代表性,表格中标注为了灰色;学历和经验不限的,也不太有参考价值。有参考性的部分,以黄色标出。如果你恰好是做运营的,那么可以大概参考下。

    5、对于运营岗来说的热门行业有哪些?
    最后,下面这张图是不同行业的运营岗位的需求数量和平均薪资水平。为了便于作图比较,对职位数量和平均薪资水平女王的尿奴 ,分别做了最大最小值标准化处理,然后进行绘图。

    那些招聘需求量大,而且平均工资高的行业,往往被认为是热门行业。这些热门行业包括O2O、金融(主要是P2P,而非传统金融机构)、电商、教育、文娱。再说明下,这里是从运营岗位出发,进而分析判断,因此虽然游戏行业的运营岗位需求相对较少,但并不能说明游戏行业就不是热门行业。

    成立快1年来,备受数据行业人士的关注,从无到有,已发展成5000+人的高效学习大社区,我们立志做高端、高效的大数据分析学习社区,让数据驱动价值、驱动业务成为职场必备,而随着知识、体系、课程的沉淀,我们的价格也一路上涨,1年内涨价7次,目前价格为1024元
    1、1024真TM......贵?
    答:其实非也
    首先,我们是永久学习的社群,一次加入永久学习,给你全方位的呵护成长
    其实邪行天下 ,我们的课程价值近3000元,进入的话都是免费学习,还有组长带领一起学习,市面上你买人家课,谁会对你这么好?
    最后,我们还有不定期的专题分享,新开发的优质课程也有内部价,光优惠都够你入圈费了,我们玩的情怀、高效
    2、我是数据小白,很白很白那种可以加入吗?
    答:可以的,我们从入门到深入,从技术到工具,从工具到案例,从数据分析的各个流程和工具都有相应的体系课程,也有对应的引导体系,让你少走弯路
    3、授课是什么形式?我该如何学习?
    答:我们的授课是网络授课,小组制的学习方式,每个小组和体系课程都有资深的数据分析师带队学习,每个系列大概45天左右,只需要每天坚持30分钟,持续45天即可,时间安排自由,但你要按照要求打卡,进行考核
    4、学习中遇见困难或者职业疑惑咋办?
    答:每个体系都对应很多的小组组长藤井美菜 ,你在小组学习过程中的问题我们的资深组长都会帮你去解答,解答不了,数据君会找行业的相关专家去解答,当然提问前请先搜索你的问题,我们希望回答你搜索不到的问题,职场类的可以发出来和5000多名圈友一起交流,也可以单独找我互相交流
    5、这个圈子有时间限制吗?大概学习多久?
    答:没有,永久性学习,所有的课程都可以反复去学习,然后我们的体系和监督基本上让你一次学习,终身受用,所以很少有第二次再加入同一个系列的,这就是品质和口碑
    从10大体系的课时来讲,你要学完圈子的课至少是1年
    6、学习的课程和线路是你们安排还是自己安排?
    答:我们的引导其实只是让你知道什么样的数据分析师走什么样的线路,什么样的分析师选择什么样的课程,当然你对自己定位很清晰的话,可以自己选自己适合的课程,满足你多元化的要求
    7、学到什么程度,才能找到工作或者成为数据分析师?
    答:这个问题其实无法解答!任何高效的学习都要看自己的,这是你学习数据分析的态度问题,当然学我们课程出去找个工作问题不大,但首先你学习的功底要硬,我们对每个系列的课程也有层层考核,也有我们自己发的证书
    8、随时进入都可以学习吗?
    答:NO,现在圈子5000多人,没法做到实时开组开黑,所以要等我们上一期对应系列课程小组完成学习,进行中的小组,我们不让新人进入,要保证每一期学习的效果,所以需要等待15天左右,先预约你要学习的系列课程,一般我们当天小组招募,不到半天限定的40人就会满,所以新来的圈友一定记得预约
    9、学习过程中因为有事不能继续坚持,如何处理法尔曼官网 ?
    答:如果真有这个情况,你需要给组长说明原因,然后退出这次学习小组,等你时间合适时再进入相应时间即可,我们不希望这样半路退出,毕竟每一次机会都来之不易,我们的学习强度不大,所以还是坚持的好,有限的时间让你学最有效的数据分析思路和方法,其实已经浓缩了你无效学习的时间
    加入方式:
    加我微信:seedata
    转账1024,先拉微信群,再邀请进小密圈
    另:无论何时进来,我们的课程都要预约,学习过程不加新人