『昊明有态度』哪类人才和技能最受热捧?,Python爬取近10万条程序员招聘数据


『昊明有态度』哪类人才和技能最受热捧?,Python爬取近10万条程序员招聘数据
文章图片
来源:凹凸数据
本文约5800字 , 建议阅读15分钟
本文带你了解当下企业究竟需要招聘什么样的人才?需要什么样的技能?
『昊明有态度』哪类人才和技能最受热捧?,Python爬取近10万条程序员招聘数据
文章图片
随着科技的飞速发展 , 数据呈现爆发式的增长 , 任何人都摆脱不了与数据打交道 , 社会对于“数据”方面的人才需求也在不断增大 。 因此了解当下企业究竟需要招聘什么样的人才?需要什么样的技能?不管是对于在校生 , 还是对于求职者来说 , 都显得很有必要 。
本文基于这个问题 , 针对51job招聘网站 , 爬取了全国范围内大数据、数据分析、数据挖掘、机器学习、人工智能等相关岗位的招聘信息 。 分析比较了不同岗位的薪资、学历要求;分析比较了不同区域、行业对相关人才的需求情况;分析比较了不同岗位的知识、技能要求等 。
做完以后的项目效果如下:
『昊明有态度』哪类人才和技能最受热捧?,Python爬取近10万条程序员招聘数据
文章图片
动态效果如下:
『昊明有态度』哪类人才和技能最受热捧?,Python爬取近10万条程序员招聘数据
文章图片
信息的爬取(基于51job招聘网站的数据爬取)
爬取岗位:大数据、数据分析、机器学习、人工智能等相关岗位;爬取字段:公司名、岗位名、工作地址、薪资、发布时间、工作描述、公司类型、员工人数、所属行业;说明:基于51job招聘网站 , 我们搜索全国对于“数据”岗位的需求 , 大概有2000页 。 我们爬取的字段 , 既有一级页面的相关信息 , 还有二级页面的部分信息;爬取思路:先针对某一页数据的一级页面做一个解析 , 然后再进行二级页面做一个解析 , 最后再进行翻页操作;使用工具:Python+requests+lxml+pandas+time网站解析方式:Xpath1)导入相关库
importrequestsimportpandasaspdfrompprintimportpprintfromlxmlimportetreeimporttimeimportwarningswarnings.filterwarnings(''ignore'')2)关于翻页的说明
#第一页的特点https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE,2,1.html?#第二页的特点https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE,2,2.html?#第三页的特点https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE,2,3.html?注意:通过对于页面的观察 , 可以看出 , 就一个地方的数字变化了 , 因此只需要做字符串拼接 , 然后循环爬取即可 。
3)完整的爬取代码
importrequestsimportpandasaspdfrompprintimportpprintfromlxmlimportetreeimporttimeimportwarningswarnings.filterwarnings(''ignore'')foriinrange(1,1501):print(''正在爬取第''+str(i)+''页的数据'')url_pre=''https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE,2,''url_end=''.html?''url=url_pre+str(i)+url_endheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/73.0.3683.86Safari/537.36'}web=requests.get(url,headers=headers)web.encoding=''gbk''dom=etree.HTML(web.text)#1、岗位名称job_name=dom.xpath('//div[@class=''dw_table'']/div[@class=''el'']//p/span/a[@target=''_blank'']/@title')#2、公司名称company_name=dom.xpath('//div[@class=''dw_table'']/div[@class=''el'']/span[@class=''t2'']/a[@target=''_blank'']/@title')#3、工作地点address=dom.xpath('//div[@class=''dw_table'']/div[@class=''el'']/span[@class=''t3'']/text()')#4、工资salary_mid=dom.xpath('//div[@class=''dw_table'']/div[@class=''el'']/span[@class=''t4'']')salary=[i.textforiinsalary_mid]#5、发布日期release_time=dom.xpath('//div[@class=''dw_table'']/div[@class=''el'']/span[@class=''t5'']/text()')#6、获取二级网址urldeep_url=dom.xpath('//div[@class=''dw_table'']/div[@class=''el'']//p/span/a[@target=''_blank'']/@href')RandomAll=[]JobDescribe=[]CompanyType=[]CompanySize=[]Industry=[]foriinrange(len(deep_url)):web_test=requests.get(deep_url[i],headers=headers)web_test.encoding=''gbk''dom_test=etree.HTML(web_test.text)#7、爬取经验、学历信息 , 先合在一个字段里面 , 以后再做数据清洗 。 命名为random_allrandom_all=dom_test.xpath('//div[@class=''tHeadertHjob'']//div[@class=''cn'']/p[@class=''msgltype'']/text()')#8、岗位描述性息job_describe=dom_test.xpath('//div[@class=''tBorderTop_box'']//div[@class=''bmsgjob_msginbox'']/p/text()')#9、公司类型company_type=dom_test.xpath('//div[@class=''tCompany_sidebar'']//div[@class=''com_tag'']/p[1]/@title')#10、公司规模(人数)company_size=dom_test.xpath('//div[@class=''tCompany_sidebar'']//div[@class=''com_tag'']/p[2]/@title')#11、所属行业(公司)industry=dom_test.xpath('//div[@class=''tCompany_sidebar'']//div[@class=''com_tag'']/p[3]/@title')#将上述信息保存到各自的列表中RandomAll.append(random_all)JobDescribe.append(job_describe)CompanyType.append(company_type)CompanySize.append(company_size)Industry.append(industry)#为了反爬 , 设置睡眠时间time.sleep(1)#由于我们需要爬取很多页 , 为了防止最后一次性保存所有数据出现的错误 , 因此 , 我们每获取一夜的数据 , 就进行一次数据存取 。 df=pd.DataFrame()df[''岗位名称'']=job_namedf[''公司名称'']=company_namedf[''工作地点'']=addressdf[''工资'']=salarydf[''发布日期'']=release_timedf[''经验、学历'']=RandomAlldf[''公司类型'']=CompanyTypedf[''公司规模'']=CompanySizedf[''所属行业'']=Industrydf[''岗位描述'']=JobDescribe#这里在写出过程中 , 有可能会写入失败 , 为了解决这个问题 , 我们使用异常处理 。 try:df.to_csv(''job_info.csv'',mode=''a+'',header=None,index=None,encoding=''gbk'')except:print(''当页数据写入失败'')time.sleep(1)print(''数据爬取完毕 , 是不是很开心!!!'')这里可以看到 , 我们爬取了1000多页的数据做最终的分析 。 因此每爬取一页的数据 , 做一次数据存储 , 避免最终一次性存储导致失败 。 同时根据自己的测试 , 有一些页数进行数据存储 , 会导致失败 , 为了不影响后面代码的执行 , 我们使用了“try-except”异常处理 。