最近有读者在后台问,刚参加工做,想选一个职业方法,问我如今python很火,可是貌似就业机会不是不少,因此比较纠结如今究竟是学python,go仍是java. 因此我就想咱们能不能用数听说话,看看python,go,java这三种热门语言,到底在市场上什么行情。html
说到分析,那咱们要先拿到数据,此次的数据仍是来自咱们的爬虫好伙伴,拉勾网,咱们各抓取了这三种语言的市场行情数据来分析,话很少说,咱们看看怎么去爬取数据和分析。java
首先来讲老套路,右击网页----->检查------>network抓包(由于拉勾网是异步加载)python
点击python搜索页,打开network抓包,咱们看看下面的图片json
咱们能够看到此次的请求模式是post请求,而不是get请求,这点要注意,因此咱们代码是请求页面的时候要使用requests.post来请求浏览器
这里还有一点要注意,咱们看到post请求下面还有一条请求,咱们能够看看,它是什么bash
能够看到这是一个get请求,可能咱们会忽略这点,若是忽略了这个get请求,咱们在后面的代码执行时会遇到麻烦,这是拉钩的一种反爬手段,咱们若是采用原来的固定cookies(headers)信息去爬取数据的时候,可能只能爬个4-5页面就会出现下面的错误服务器
{'status': False, 'msg': '您操做太频繁,请稍后再访问', 'clientIp': 'xxxxxxx', 'state': 2402}
复制代码
上面的错误看起来是由于IP地址被封致使的,可是通常IP地址被封,咱们用网页也是打不开的,可是这里你能够试试用网上去访问页面,其实仍是能够正常访问的,因此这里应该不是IP被封的问题,这里实际上是拉钩的反爬机制,他是改变了你浏览器端的cookie信息,致使你访问不了,若是你再代码里仍是用原来的老套路,cookie信息是定死的,那就着了他的道了。cookie
这其实就是上面的get请求的做用,也就是说咱们的cookie信息要在代码里是动态的,用上一次访问返回的cookie信息,进行当前的页面访问,那怎么从前一个url访问后拿取cookie呢,这就要用到requests.session了,另外referer也不能少的,少了同样可能都会出现操做太频繁的回复的,这里的referer其实就是你是从哪一个页面跳转来的,咱们要访问的URL是"www.lagou.com/jobs/positi…", 他是一个Ajax页面,是不对外访问的,因此若是你不加referer而直接去访问这个Ajax页面,服务器确定知道你是一个爬虫程序。session
具体requests.session怎么写,咱们会在下面的代码里给出。说到这里咱们大概能访问到页面了。app
咱们能够看到下面的图片,其余这里获得数据很简单,他返回的是一个JSON类型,并且比较规范,咱们稍微处理下就能获得咱们想要的数据
#coding:utf-8
""" Created on 2019-05-13 @title: '' @author: 南山南 公众号:pythonislover """
import requests
import re
from bs4 import BeautifulSoup
import pandas as pd
import xlwt
import random
import time
base_url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
lagou_list = []
def get_lagou(keyword,page_count):
for i in range(page_count):
# cookie_dict = dict()
# s = requests.session()
# s.cookies.update(cookie_dict)
# print(cookie_dict)
Myheaders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
'Referer': 'https://www.lagou.com/jobs/list_java?labelWords=&fromSearch=true&suginput='
}
time.sleep(5)
session = requests.session() # 获取session
session.headers.update(Myheaders) #更新header信息,cookies会变
session.get("https://www.lagou.com/jobs/list_python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=")
try:
from_data = {
'first': 'false',
'pn': str(i+1),
'kd': keyword
}
print('正在爬取第%s职位的%s页' %(keyword,str(i+1)))
response = session.post(base_url,headers=Myheaders,data= from_data)
response.encoding = 'utf-8'
info_list = response.json()['content']['positionResult']['result']
companyIds_list = []
for job in info_list:
information = []
information.append(keyword) # 岗位对应ID
information.append(job['city']) # 岗位对应城市
information.append(job['companyFullName']) # 公司名
information.append(job['companySize']) # 公司规模
information.append(job['companyLabelList']) # 福利待遇
information.append(job['district']) # 工做地点
information.append(job['education']) # 学历要求
information.append(job['firstType']) # 工做类型
information.append(job['positionName']) # 职位名称
information.append(job['salary']) # 薪资
information.append(job['workYear']) # 工做年限
information.append(job['financeStage']) # 公司发展阶段
information.append(job['skillLables']) # 技能要求
lagou_list.append(information)
companyIds_list.append(job['companyId'])
# print(companyIds_list)
# companyIds_str ='%2C'.join(str(s) for s in companyIds_list)
# print(companyIds_str)
# get_url='https://www.lagou.com/c/approve.json?companyIds='+companyIds_str
# print(get_url)
# res = requests.get(get_url,headers = Myheaders)
# get_cookies = res.cookies.get_dict()
except Exception as e:
print('程序出错',e)
continue
return lagou_list
def main():
info_result = []
title = ['职位类型','城市','公司名','公司规模','福利待遇', '工做地点', '学历要求', '工做类型', '职位名称', '薪资', '工做年限','公司发展阶段','技能要求']
info_result.append(title)
#抓取python语言信息
lagou_list_python = get_lagou('python',20)
# 抓取java语言信息
lagou_list_java = get_lagou('java', 20)
# 抓取go语言信息
lagou_list_go = get_lagou('go', 20)
info_result.extend(lagou_list_python)
info_result.extend(lagou_list_java)
info_result.extend(lagou_list_go)
# 建立workbook,即excel
workbook = xlwt.Workbook(encoding='utf_8_sig')
# 建立sheet,第二参数用于确认同一个cell单元是否能够重设值
worksheet = workbook.add_sheet('lagou', cell_overwrite_ok=True)
for i, row in enumerate(info_result):
for j, col in enumerate(row):
worksheet.write(i, j, col)
workbook.save('lagou.xls')
if __name__ == '__main__':
main()
# get_lagou('python',2)
# print(res)
# df = pd.DataFrame(res)
# df.to_csv('lagou.csv', encoding='utf_8_sig')
复制代码
bar = Bar("薪资分布图", "数量")
bar.add("python薪资分布", df_python['薪资'], df_python['count'], is_more_utils=True)
bar.add("java薪资分布", df_java['薪资'], df_java['count'], is_more_utils=True)
bar.add("go薪资分布", df_go['薪资'], df_go['count'], is_more_utils=True)
# bar.print_echarts_options() # 该行只为了打印配置项,方便调试时使用
bar.render('薪资分布图.html') # 生成本地 HTML 文件
复制代码
从图上大体能够当作在高薪资这块,GO语言的优点比较大,"钱途"仍是有的,对于python来讲,薪资分布比较均匀,各个层次的人才都须要,可是若是想拿高薪,仍是须要努力的,对于java来讲呢,感受比python还低一等,也许是java的需求量比较大,平均下面,薪资就不咋的了。
bar = Bar("职位需求量分布图", "数量")
bar.add("python需求量分布", df_python_pos['城市'], df_python_pos['count'], is_more_utils=True)
bar.add("java需求量分布", df_java_pos['城市'], df_java_pos['count'], is_more_utils=True)
bar.add("go需求量分布", df_go_pos['城市'], df_go_pos['count'], is_more_utils=True)
# bar.print_echarts_options() # 该行只为了打印配置项,方便调试时使用
bar.render('各大城市职位需求量大体分布图.html') # 生成本地 HTML 文件
复制代码
上图咱们能够看到传统的北上广深,职位需求仍是远远大于其余城市(抽样数据),可是杭州,成都也是后起之秀,对于我所在的大南京,哎,不说了,哭会去。。。。,可是大城市压力也大,房价也高,若是是年轻人,能够拼几年,若是能够本地安家固然好,若是不能就老老实实回二线城市,哈哈,我的意见,勿喷。
pie = Pie("各种职位中学历所占的比例", title_pos='center')
pie.add(
"python",
df_python_education['学历要求'],
df_python_education['count'],
center=[50, 70],
radius=[20, 30],
label_text_color=None,
is_label_show=True,
legend_orient="vertical",
legend_pos="left",
)
pie.add(
"",
df_java_education['学历要求'],
df_java_education['count'],
center=[70, 70],
radius=[20, 30],
label_text_color=None,
is_label_show=True,
legend_orient="vertical",
legend_pos="left",
)
pie.add(
"",
df_go_education['学历要求'],
df_go_education['count'],
center=[90, 70],
radius=[20, 30],
label_text_color=None,
is_label_show=True,
legend_orient="vertical",
legend_pos="left",
)
pie.render('python学历要求分布.html')
复制代码
完整代码获取关注公众号:pythonislover , 回复"职位"。