本来想用request爬取拉勾数据的额,后来爬了一两页就被封了IP,所以找资料去使用selenium去爬取,爬虫代码在文章后面
企业对数据挖掘/数据分析岗位用人的“学历”需求


- 本科学历的比重最多
- 学历要求:数据挖掘 > 数据分析,数据挖掘硕士以上比例明显增加
数据挖掘:不同学历薪资情况(单位千元)


- 数据挖掘最低薪资:本科 < 硕士
- 数据挖掘最高薪资:本科和硕士差别不大,60K以上,只要有能力,就不看学历了
- 企业对本科薪资弹性最大,可能是本科生可塑性更有优势
数据分析:不同学历薪资情况(单位千元)


- 450个数据岗位中就只有1个需要博士(- -)
- 数据挖掘最低薪资依旧是本科
总结: - 薪资水平:数据挖掘 > 数据分析,无论本科硕士,基本20K以上,
- 数据挖掘需要的高学历人才比例更多
企业对数据挖掘/数据分析岗位用人的“经验”需求


- 数据挖掘/数据分析的应届毕业生比例极少,都需要有经验的(1-3年,3-5年,5-10年)
- 数据挖掘最需要3-5年经验,数据分析最需要1-3年经验
数据挖掘:不同工作经验薪资情况


数据分析:不同工作经验薪资情况


总结:
- 应届毕业生薪资偏低 -> 对行业的本身的知识和经验都是缺乏的
- 数据挖掘以及数据分析工作3年以上的薪资都很可观
- 数据挖掘非常需要工作经验高的人才

- 学历:本科(硕士)
- 薪资:20K
- 工作经验: 3-5年
-
技能:学历(hhh)、Hadoop、Spark、MapReduce、Scala、Hive、聚类、决策树、GBDT、算法
综合:数据挖掘这个岗位,在学历要求是最高的,虽然还是本科居多,但硕士比例明显增加,还有公司要求博士学历。在专业知识上也有很大要求,得会Linux操作系统基本操作、大数据框架Hadoop、Spark以及数据仓库Hive的使用等计算机相关知识,总体来说难道还是比较大。薪资待遇上特别优厚,基本在20k以上,薪资在30k-40k的比例也有近40%,对工作经验要求还是比较高,大部分的企业要求工作经验要达到3年以上。
数据分析技能
- 学历:本科
- 薪资:10K
- 工作经验: 1-5年
- 技能:SAS、SPSS、Hadoop、Hive、数据库、Excel、统计学、算法
综合:数据分析这个岗位在学历要求上比爬虫要求稍微高一些,硕士比例有所提升,专业知识上有一定要求。薪资待遇上也还算比较优厚,基本在10k以上,同时薪资在30k-40k的比例也有所上升。对工作经验要求还是比较高,大部分的企业要求工作经验要达到3年以上。
数据挖掘和数据分析岗都是相通的,你中有我,我中有你。
不过数据挖掘岗中算法是第一位要求,更高级,更难
爬虫代码
from lxml import etree
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
import xlrd,xlwt,re,codecs,time
import pandas as pd
class LagouSpider():
def __init__(self):
self.url = 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?px=default&city=%E5%85%A8%E5%9B%BD#filterBox'
driver = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'
self.browser = webdriver.Chrome(executable_path=driver)
self.wait = WebDriverWait(self.browser,10)
self.data_list = []
self.max_page = 30
def run(self):
self.browser.get(self.url)
page = 0
while True:
if page == self.max_page:
df = pd.DataFrame(self.data_list)
df.to_csv('lagou_data_mining.csv', index=False, encoding='utf_8_sig')
return
page += 1
text = self.browser.page_source
# 提取具体页面的url
self.parse_page(text)
# 提取下一页的按钮,注意class的值中有空格不可用。
next_btn = self.wait.until(EC.presence_of_element_located((By.XPATH,'//div[@class="pager_container"]/span[last()]')))
# 判断是否是最后一页,如果是,退出while循环
if 'pager_next pager_next_disabled' in next_btn.get_attribute('class'):
df = pd.DataFrame(self.data_list)
df.to_csv('lagou_data_mining.csv', index=False, encoding='utf_8_sig')
break
else:
next_btn.click()
time.sleep(1)
# 提取具体页面的url
def parse_page(self,text):
html = etree.HTML(text)
# 判断所需元素是否加载出来
self.wait.until(EC.presence_of_element_located((By.XPATH,'//a[@class="position_link"]')))
detial_urls = html.xpath('//a[@class="position_link"]/@href')
for detial_url in detial_urls:
# 请求详情页
self.request_detial_url(detial_url)
time.sleep(1)
# 提取之后,把当前的页面关闭
# 请求详情页
def request_detial_url(self,detial_url):
# 解析具体页面的字段信息时候,打开了另一个页面,覆盖原来的页面,我们这里做的是利用while True循环来获取全部页面的字段信息
# 所以第一个页面的窗口不能关闭
self.browser.execute_script("window.open('%s')" % detial_url) # 打开另一个窗口
self.browser.switch_to.window(self.browser.window_handles[1]) # 切换到另一个窗口
source = self.browser.page_source
# 解析详情页的具体字段
self.parse_detial_url(source)
# 请求完之后关闭当前详情页的页面
self.browser.close()
# 切换回第一页
self.browser.switch_to.window(self.browser.window_handles[0]) # 切换到首页
# 解析详情页的具体字段
def parse_detial_url(self,source):
text = etree.HTML(source)
# 判断所需元素是否加载出来
self.wait.until(EC.presence_of_element_located((By.XPATH,'//span[@class="name"]')))
name = text.xpath('//span[@class="name"]/text()')[0]
company = text.xpath('//div[@class="company"]/text()')[0]
salary = text.xpath('//dd[@class="job_request"]/p[1]/span[1]/text()')[0].strip()
city = text.xpath('//dd[@class="job_request"]/p[1]/span[2]/text()')[0]
city = re.sub(r'[\s/]', '', city)
work_years = text.xpath('//dd[@class="job_request"]/p[1]/span[3]/text()')[0]
work_years = re.sub(r'[\s/]', '', work_years)[2:]
edu = text.xpath('//dd[@class="job_request"]/p[1]/span[4]/text()')[0]
edu = re.sub(r'[\s/]', '', edu)[:2]
job_advantage = text.xpath('//dd[@class="job-advantage"]/p/text()')[0]
desc = ''.join(text.xpath('//dd[@class="job_bt"]//text()')).strip()
content = text.xpath('//*[@id="job_detail"]/dd[2]/div/p/text()')
work_duty = ''
work_requirement = ''
state = 0
for i in range(len(content)):
content[i] = content[i].replace('\xa0', ' ')
if content[i][0].isdigit():
if content[i][0] == '1':
state += 1
if state > 2:
break
if state == 1:
work_duty = work_duty + content[i] + '/'
else:
work_requirement = work_requirement + content[i] + '/'
with open('lagou_data_analy_work_request.txt','a', encoding='utf-8') as f:
f.write(work_requirement)
f.write('\n')
model = {'name':name, 'company':company,'salary':salary,'city':city,'work_years':work_years,'edu':edu,'job_advantage':job_advantage,
'work_duty':work_duty,'work_requirement':work_requirement}
self.data_list.append(model)
def main():
spider = LagouSpider()
spider.run()
if __name__ == '__main__':
main()
网友评论