通过python编写爬虫,爬取了猎聘网关键词“数据分析”的全国范围内1月内发布的企业职位。
本次分析源数据的职位发布日期:2017年9月19日-2017年10月19日
爬虫介绍:爬取猎聘网职位信息
源数据:职位数据
清洗完成后,用于分析的数据2320条
数据清洗Query代码:datacleaning.sql
数据清洗结果:用于分析的数据
猎聘网职位爬取及分析系列文章已全部完成
系列文章一:[requests,pyquery]爬取猎聘网职位信息
系列文章三:[python,pandas]数据分析求职指南——猎聘网数据分析职位解析
数据清洗
观察原始数据(共27633条)情况,并使用MySQL对爬取的原始数据进行清洗。
原始数据字段如下所示:
- JobTitle VARCHAR(255) :职位名称
- company VARCHAR(255):公司名称
- salary VARCHAR(255):薪酬
- position VARCHAR(255):工作地
- PubTime VARCHAR(255):发布时间
- qualification VARCHAR(255):职位要求,包含学历、工作经验、语言、年龄
- tag_list VARCHAR(255):职位标签,’tag1,tag2,…’
- description TEXT:职位描述,详细介绍职位工作内容,任职要求等信息
- industry VARCHAR(255):行业
- industry_detail VARCHAR(255):猎聘更加细化的行业区分
- companySize VARCHAR(255):公司规模,人员数
- is_end INT(255):职位是否已结束,未结束为0,结束为1
薪酬数据
salary格式如’4-5万 72小时反馈’、’面议 24小时反馈’,包含职位反馈时间信息
- 新建字段min_salary INT(255)、max_salary INT(255)、average_salary FLOAT
- 从salary字段中提取min_salary、max_salary,并有average_salary = avg(min_salary,max_salary)
- 薪酬为’面议’时,min_salary = max_salary = average_salary = 0
工作地数据
position格式为’国家’ 、 ‘城市’ 、 ‘城市-区县’,如:’新加坡’、’北京’、’广州-天河区’,将’-‘前后两部分分开
- 新建字段position1 VARCHAR(255)、position2 VARCHAR(255)
- 若position包含’-‘,前一部分为position1,后一部分为position2
- 若position不包含’-‘,则position1 = position,position2 = null
发布时间
PubTime格式为’XXXX年XX月XX日’,是字符串形式
- 新建字段pdate date
- 提取pubtime中年月日,转化成 pdate = ‘%Y-%m-%d’
异常及空值处理
- 因猎聘网职位详情页源码格式问题,若职位未给出公司规模数据,则爬取得到的公司规模字段实际为公司地址,令出现问题的行comAddress = companySize,并删除companySize字段内容
- industry_detail字段为空时,令industry_detail = industry
- comAddress字段为空时,令comAddress = position
- companySize、tag_list、description字段为空,填充’null’
用于分析的数据
根据分析目的筛选用于分析的数据,获得2320条
- 因猎聘网搜索较为模糊,结果中包含’会计助理’、’项目运营’等无关职位,对JobTitle进行筛选:包含’数据分析’、’大数据’、’数据运营’、’data’等
- 只分析未结束职位:is_end = 0
- 去重
源代码
--提取salary,获得min-max-average salary --新建列 ALTER TABLE DATA ADD (
min_salary FLOAT(10),
max_salary FLOAT(10),
average_salary FLOAT(10)
) ;
--when `salary` like '%面议%',min/max/average=0 UPDATE DATA SET `min_salary`=0, `max_salary`=0, `average_salary`=0
WHERE `salary` LIKE '%面议%' ;
--salary不是面谈时,salary格式'min-max万' --min_salary=min UPDATE DATA SET `min_salary`= SUBSTRING_INDEX(`salary`,'-',1)
WHERE `salary` LIKE '%-%万%';
--max_Salary=max UPDATE DATA SET `max_salary`= (SUBSTRING(SUBSTRING_INDEX(`salary`,'万',1),LOCATE('-',SUBSTRING_INDEX(`salary`,'万',1))+1))
WHERE `salary` LIKE '%-%万%';
--average_salary = (min+max)/2 UPDATE DATA SET `average_salary`= (min_salary+max_salary)/2
WHERE `salary` LIKE '%-%万%';
--整理position,XX-XX或XX ALTER TABLE DATA ADD (
position1 VARCHAR(255),
position2 VARCHAR(255)
);
UPDATE DATA SET position1 = position
WHERE position NOT LIKE '%-%';
UPDATE DATA SET position2 = 'null'
WHERE position NOT LIKE '%-%';
UPDATE DATA SET position1 = SUBSTRING_INDEX(`position`,'-',1)
WHERE position LIKE '%-%';
UPDATE DATA SET position2 = SUBSTRING(`position`,LOCATE('-',`position`)+1)
WHERE position LIKE '%-%';
--发布时间pubtime:str->date to newfield:pubdate SELECT @y :=LEFT(data.`PubTime`,4) FROM `data`;
SELECT @m :=mid(pubtime,6,2) FROM `data`;
SELECT @d :=mid(pubtime,9,2) FROM `data`;
UPDATE `data` SET `pubdate`=str_to_Date(
concat(@y,'-',@m,'-',@d),'%Y-%m-%d');
--整理qualification --学历 SELECT substring_index(qualification,' ',1)
FROM `data`;
UPDATE TABLE `data` SET education =
substring_index(qualification,' ',1)
--工作经验 UPDATE `data` SET
`workexperience` = substring(substring_index(qualification,' ',2),char_length(substring_index(qualification,' ',1))+2) ;
--年龄要求 UPDATE `DATA` SET
`age` = substring_index(qualification,' ',-1) ;
--工作语言 UPDATE `data` SET workLANGUAGE =
mid(
qualification,
char_length(substring_index(qualification,' ',2))+2,
char_length(substring(`qualification`,char_length(substring_index(qualification,' ',2))+2))-char_length(`age`)-1
);
--找出comsize内容实际为address的,将其内容赋予comAddr并删除comsize内的内容 UPDATE DATA SET `comAddress`=`companySize`
WHERE (`companySize` NOT LIKE '%-%人%' AND companySize NOT LIKE '%人以上') ;
UPDATE DATA SET `companySize`=' '
WHERE (`companySize` NOT LIKE '%-%人%' AND companySize NOT LIKE '%人以上') ;
--填充空缺内容 --industry_detail为空时,用industry的内容填充 UPDATE DATA SET industry_detail = industry
WHERE `industry_detail`=' ' ;
--addr内容为空时用position内容填充 UPDATE DATA SET `comAddress` = `position`
WHERE `comAddress`=' ' ;
--size内容为空时,填写'null' UPDATE DATA SET `companySize` = 'null'
WHERE `companySize`=' ' ;
--tag_list内容为空时,填写'null' UPDATE DATA SET `tag_list` = 'null'
WHERE `tag_list`=' ' ;
--description内容为空时,填写'null' UPDATE DATA SET `description` = 'null'
WHERE `description`=' ' ;
--查询用于分析的数据 SELECT jobtitle,company,min_salary,max_salary,average_salary,pdate,
tag_list,description,industry,companysize,comaddress,position1,
education,workexperience,worklanguage,age,is_end
FROM `data`
WHERE (
jobtitle LIKE '%数据%分析%'
OR jobtitle LIKE'%大数据%'
OR jobtitle LIKE '%大数据%'
OR jobtitle LIKE '%数据%运营%'
OR jobtitle LIKE '%data%'
)
AND (is_end = 0);