本文以Python爬蟲他去、數(shù)據(jù)分析毙驯、后端、數(shù)據(jù)挖掘灾测、全棧開發(fā)爆价、運維開發(fā)、高級開發(fā)工程師、大數(shù)據(jù)铭段、機器學習骤宣、架構(gòu)師 這10個崗位,從拉勾網(wǎng)上爬取了相應的職位信息和任職要求序愚,并通過數(shù)據(jù)分析可視化憔披,直觀地展示了這10個職位的平均薪資和學歷、工作經(jīng)驗要求爸吮。
1芬膝、先獲取薪資和學歷、工作經(jīng)驗要求
由于拉勾網(wǎng)數(shù)據(jù)加載是動態(tài)加載的拗胜,需要我們分析蔗候。分析方法如下:
F12分析頁面數(shù)據(jù)存儲位置
我們發(fā)現(xiàn)網(wǎng)頁內(nèi)容是通過post請求得到的,返回數(shù)據(jù)是json格式埂软,那我們直接拿到json數(shù)據(jù)即可锈遥。
我們只需要薪資和學歷、工作經(jīng)驗還有單個招聘信息勘畔,返回json數(shù)據(jù)字典中對應的英文為:positionId,salary, education, workYear(positionId為單個招聘信息詳情頁面編號)所灸。相關操作代碼如下:
文件存儲:
def file_do(list_info):
# 獲取文件大小
file_size = os.path.getsize(r'G:lagou_anv.csv')
if file_size == 0:
# 表頭
name = ['ID','薪資', '學歷要求', '工作經(jīng)驗']
# 建立DataFrame對象
file_test = pd.DataFrame(columns=name, data=list_info)
# 數(shù)據(jù)寫入
file_test.to_csv(r'G:lagou_anv.csv', encoding='gbk', index=False)
else:
with open(r'G:lagou_anv.csv', 'a+', newline='') as file_test:
# 追加到文件后面
writer = csv.writer(file_test)
# 寫入文件
writer.writerows(list_info)
基本數(shù)據(jù)獲取:
# 1. post 請求 url
req_url = '網(wǎng)頁鏈接
# 2.請求頭 headers
headers = {
'Accept': 'application/json,text/javascript,*/*;q=0.01',
'Connection': 'keep-alive',
'Cookie': '你的Cookie值炫七,必須加上去',
'Host': 'www.lagou.com',
'Referer': '網(wǎng)頁鏈接,
'User-Agent': str(UserAgent().random),
}
def get_info(headers):
# 3.for 循環(huán)請求(一共30頁)
for i in range(1, 31):
# 翻頁
data = {
'first': 'true',
'kd': 'Python爬蟲',
'pn': i
}
# 3.1 requests 發(fā)送請求
req_result = requests.post(req_url, data=data, headers=headers)
req_result.encoding = 'utf-8'
print("第%d頁:"%i+str(req_result.status_code))
# 3.2 獲取數(shù)據(jù)
req_info = req_result.json()
# 定位到我們所需數(shù)據(jù)位置
req_info = req_info['content']['positionResult']['result']
print(len(req_info))
list_info = []
# 3.3 取出具體數(shù)據(jù)
for j in range(0, len(req_info)):
salary = req_info[j]['salary']
education = req_info[j]['education']
workYear = req_info[j]['workYear']
positionId = req_info[j]['positionId']
list_one = [positionId,salary, education, workYear]
list_info.append(list_one)
print(list_info)
# 存儲文件
file_do(list_info)
time.sleep(1.5)
運行結(jié)果:
2爬立、根據(jù)獲取到的`positionId`來訪問招聘信息詳細頁面
根據(jù)`positionId`還原訪問鏈接:
position_url = []
def read_csv():
# 讀取文件內(nèi)容
with open(r'G:lagou_anv.csv', 'r', newline='') as file_test:
# 讀文件
reader = csv.reader(file_test)
i = 0
for row in reader:
if i != 0 :
# 根據(jù)positionID補全鏈接
url_single = "網(wǎng)頁鏈接%row[0]
position_url.append(url_single)
i = i + 1
print('一共有:'+str(i-1)+'個')
print(position_url)
訪問招聘信息詳情頁面,獲取職位描述(崗位職責和崗位要求)并清理數(shù)據(jù):
def get_info():
for position_url in position_urls:
work_duty = ''
work_requirement = ''
response00 = get_response(position_url,headers = headers)
time.sleep(1)
content = response00.xpath('//*[@id="job_detail"]/dd[2]/div/p/text()')
# 數(shù)據(jù)清理
j = 0
for i in range(len(content)):
content[i] = content[i].replace(' ',' ')
if content[i][0].isdigit():
if j == 0:
content[i] = content[i][2:].replace('万哪、',' ')
content[i] = re.sub('[侠驯;;.0-9。]','', content[i])
work_duty = work_duty+content[i]+ '/'
j = j + 1
elif content[i][0] == '1' and not content[i][1].isdigit():
break
else:
content[i] = content[i][2:].replace('奕巍、', ' ')
content[i] = re.sub('[吟策、;;.0-9的止。]','',content[i])
work_duty = work_duty + content[i]+ '/'
m = i
# 崗位職責
write_file(work_duty)
print(work_duty)
# 數(shù)據(jù)清理
j = 0
for i in range(m,len(content)):
content[i] = content[i].replace(' ',' ')
if content[i][0].isdigit():
if j == 0:
content[i] = content[i][2:].replace('檩坚、', ' ')
content[i] = re.sub('[、诅福;;.0-9匾委。]', '', content[i])
work_requirement = work_requirement + content[i] + '/'
j = j + 1
elif content[i][0] == '1' and not content[i][1].isdigit():
# 控制范圍
break
else:
content[i] = content[i][2:].replace('、', ' ')
content[i] = re.sub('[氓润、赂乐;;.0-9。]', '', content[i])
work_requirement = work_requirement + content[i] + '/'
# 崗位要求
write_file2(work_requirement)
print(work_requirement)
print("-----------------------------")
運行結(jié)果:
duty
require
3咖气、四種圖可視化數(shù)據(jù)+數(shù)據(jù)清理方式
矩形樹圖:
# 1.矩形樹圖可視化學歷要求
from pyecharts import TreeMap
education_table = {}
for x in education:
education_table[x] = education.count(x)
key = []
values = []
for k,v in education_table.items():
key.append(k)
values.append(v)
data = []
for i in range(len(key)) :
dict_01 = {"value": 40, "name": "我是A"}
dict_01["value"] = values[i]
dict_01["name"] = key[i]
data.append(dict_01)
tree_map = TreeMap("矩形樹圖", width=1200, height=600)
tree_map.add("學歷要求",data, is_label_show=True, label_pos='inside')
玫瑰餅圖:
# 2.玫瑰餅圖可視化薪資
import re
import math
'''
# 薪水分類
parameter : str_01--字符串原格式:20k-30k
returned value : (a0+b0)/2 --- 解析后變成數(shù)字求中間值:25.0
'''
def assort_salary(str_01):
reg_str01 = "(d+)"
res_01 = re.findall(reg_str01, str_01)
if len(res_01) == 2:
a0 = int(res_01[0])
b0 = int(res_01[1])
else :
a0 = int(res_01[0])
b0 = int(res_01[0])
return (a0+b0)/2
from pyecharts import Pie
salary_table = {}
for x in salary:
salary_table[x] = salary.count(x)
key = ['5k以下','5k-10k','10k-20k','20k-30k','30k-40k','40k以上']
a0,b0,c0,d0,e0,f0=[0,0,0,0,0,0]
for k,v in salary_table.items():
ave_salary = math.ceil(assort_salary(k))
print(ave_salary)
if ave_salary < 5:
a0 = a0 + v
elif ave_salary in range(5,10):
b0 = b0 +v
elif ave_salary in range(10,20):
c0 = c0 +v
elif ave_salary in range(20,30):
d0 = d0 +v
elif ave_salary in range(30,40):
e0 = e0 +v
else :
f0 = f0 + v
values = [a0,b0,c0,d0,e0,f0]
pie = Pie("薪資玫瑰圖", title_pos='center', width=900)
pie.add("salary",key,values,center=[40, 50],is_random=True,radius=[30, 75],rosetype="area",is_legend_show=False,is_label_show=True)
普通柱狀圖:
# 3.工作經(jīng)驗要求柱狀圖可視化
from pyecharts import Bar
workYear_table = {}
for x in workYear:
workYear_table[x] = workYear.count(x)
key = []
values = []
for k,v in workYear_table.items():
key.append(k)
values.append(v)
bar = Bar("柱狀圖")
bar.add("workYear", key, values, is_stack=True,center= (40,60))
詞云圖:
import jieba
from pyecharts import WordCloud
import pandas as pd
import re,numpy
stopwords_path = 'H:PyCodingLagou_analysisstopwords.txt'
def read_txt():
with open("G:lagouContentywkf_requirement.txt",encoding='gbk') as file:
text = file.read()
content = text
# 去除所有評論里多余的字符
content = re.sub('[,挨措,魏蔗。.
]', '', content)
segment = jieba.lcut(content)
words_df = pd.DataFrame({'segment': segment})
# quoting=3 表示stopwords.txt里的內(nèi)容全部不引用
stopwords = pd.read_csv(stopwords_path, index_col=False,quoting=3, sep="", names=['stopword'], encoding='utf-8')
words_df = words_df[~words_df.segment.isin(stopwords.stopword)]
words_stat = words_df.groupby(by=['segment'])['segment'].agg({"計數(shù)": numpy.size})
words_stat = words_stat.reset_index().sort_values(by=["計數(shù)"], ascending=False)
test = words_stat.head(200).values
codes = [test[i][0] for i in range(0, len(test))]
counts = [test[i][1] for i in range(0, len(test))]
wordcloud = WordCloud(width=1300, height=620)
wordcloud.add("必須技能", codes, counts, word_size_range=[20, 100])
wordcloud.render("H:PyCodingLagou_analysiscloud_pitywkf_bxjn.html")
python爬蟲崗位
學歷要求
工作月薪
工作經(jīng)驗要求
爬蟲技能
關鍵詞解析:
學歷:本科
工作月薪:10k-30k
工作經(jīng)驗:1-5年
技能:分布式焕参、多線程葛菇、框架痹扇、Scrapy悯舟、算法担租、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫
綜合:爬蟲這個崗位在學歷要求上比較放松抵怎,大多數(shù)為本科即可奋救,比較適合想轉(zhuǎn)業(yè)的老哥小姐姐,學起來也不會特別難反惕。而且薪資待遇上也還算比較優(yōu)厚尝艘,基本在10k以上。不過唯一對工作經(jīng)驗要求還是比較高的姿染,有近一半的企業(yè)要求工作經(jīng)驗要達到3年以上背亥。
python數(shù)據(jù)分析崗位
學歷要求
工作月薪
工作經(jīng)驗要求
數(shù)據(jù)分析技能
關鍵詞解析:
學歷:本科(碩士比例有所增高)
工作月薪:10k-30k
工作經(jīng)驗:1-5年
技能:SAS、SPSS悬赏、Hadoop狡汉、Hive、數(shù)據(jù)庫闽颇、Excel盾戴、統(tǒng)計學、算法
綜合:數(shù)據(jù)分析這個崗位在學歷要求上比爬蟲要求稍微高一些兵多,碩士比例有所提升尖啡,專業(yè)知識上有一定要求。薪資待遇上也還算比較優(yōu)厚剩膘,基本在10k以上衅斩,同時薪資在30k-40k的比例也有所上升。對工作經(jīng)驗要求還是比較高援雇,大部分的企業(yè)要求工作經(jīng)驗要達到3年以上矛渴。
python后端崗位
學歷要求
工作月薪
工作經(jīng)驗要求
后端技能
關鍵詞解析:
學歷:本科
工作月薪:10k-30k
工作經(jīng)驗:3-5年
技能:Flask、Django惫搏、Tornado具温、Linux、MySql筐赔、Redis铣猩、MongoDB、TCP/IP茴丰、數(shù)學(哈哈)
綜合:web后端這個崗位對學歷要求不高达皿,但專業(yè)知識上有很大要求天吓,得會Linux操作系統(tǒng)基本操作、三大主流數(shù)據(jù)庫的使用峦椰、以及三大基本web框架的使用等計算機相關知識龄寞,總體來說難道還是比較大。薪資待遇上也比較優(yōu)厚汤功,基本在10k以上物邑,同時薪資在30k-40k的比例也有近20%。對工作經(jīng)驗要求還是比較高滔金,大部分的企業(yè)要求工作經(jīng)驗要達到3年以上色解。
python數(shù)據(jù)挖掘崗位
學歷要求
工作月薪
工作經(jīng)驗要求
希望小編的文章能幫助你找到心儀的工作,關注小編餐茵。文章持續(xù)推送科阎。
小編準備了一份2018年最新的python零基礎系統(tǒng)學習資料,加群 735934841 免費領确拮濉锣笨!