事情的起源是这样的,某个风和日丽的下午... 习惯性的打开知乎准备划下水,看到一个问题恰好邀请回答 html
因而就萌生了采集下某招聘网站Python岗位招聘的信息,看一下目前的薪水和岗位分布,说干就干。python
先说下数据采集过程当中遇到的问题,首先请求头是必定要假装的,不然第一步就会给你弹出你的请求太频繁,请稍后再试,其次网站具备多重反爬策略,解决方案是每次先获取session而后更新咱们的session进行抓取,最后拿到了想要的数据。git
Chrome浏览器右键检查查看network,找到连接https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false
github
{"status":false,"msg":"您操做太频繁,请稍后再访问","clientIp":"124.77.161.207","state":2402}
,机智的我察觉到事情并无那么简单
真正的较量才刚刚开始,咱们先来分析下请求的报文,面试
能够看到请求是以post
的方式传递的,同时传递了参数json
datas = {
'first': 'false',
'pn': x,
'kd': 'python',
}
复制代码
同时不难发现每次点击下一页都会同时发送一条get
请求 浏览器
get
请求和咱们
post
请求是一致的,那么问题就简单许多,整理一下思路
关键词:python
**搜索范围:**全国 **数据时效:**2019.05.05bash
#!/usr/bin/env python3.4
# encoding: utf-8
""" Created on 19-5-05 @title: '' @author: Xusl """
import json
import requests
import xlwt
import time
# 获取存储职位信息的json对象,遍历得到公司名、福利待遇、工做地点、学历要求、工做类型、发布时间、职位名称、薪资、工做年限
def get_json(url, datas):
my_headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",
"Referer": "https://www.lagou.com/jobs/list_Python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=",
"Content-Type": "application/x-www-form-urlencoded;charset = UTF-8"
}
time.sleep(5)
ses = requests.session() # 获取session
ses.headers.update(my_headers) # 更新
ses.get("https://www.lagou.com/jobs/list_python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=")
content = ses.post(url=url, data=datas)
result = content.json()
info = result['content']['positionResult']['result']
info_list = []
for job in info:
information = []
information.append(job['positionId']) # 岗位对应ID
information.append(job['city']) # 岗位对应城市
information.append(job['companyFullName']) # 公司全名
information.append(job['companyLabelList']) # 福利待遇
information.append(job['district']) # 工做地点
information.append(job['education']) # 学历要求
information.append(job['firstType']) # 工做类型
information.append(job['formatCreateTime']) # 发布时间
information.append(job['positionName']) # 职位名称
information.append(job['salary']) # 薪资
information.append(job['workYear']) # 工做年限
info_list.append(information)
# 将列表对象进行json格式的编码转换,其中indent参数设置缩进值为2
# print(json.dumps(info_list, ensure_ascii=False, indent=2))
# print(info_list)
return info_list
def main():
page = int(input('请输入你要抓取的页码总数:'))
# kd = input('请输入你要抓取的职位关键字:')
# city = input('请输入你要抓取的城市:')
info_result = []
title = ['岗位id', '城市', '公司全名', '福利待遇', '工做地点', '学历要求', '工做类型', '发布时间', '职位名称', '薪资', '工做年限']
info_result.append(title)
for x in range(1, page+1):
url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
datas = {
'first': 'false',
'pn': x,
'kd': 'python',
}
try:
info = get_json(url, datas)
info_result = info_result + info
print("第%s页正常采集" % x)
except Exception as msg:
print("第%s页出现问题" % x)
# 建立workbook,即excel
workbook = xlwt.Workbook(encoding='utf-8')
# 建立表,第二参数用于确认同一个cell单元是否能够重设值
worksheet = workbook.add_sheet('lagouzp', cell_overwrite_ok=True)
for i, row in enumerate(info_result):
# print(row)
for j, col in enumerate(row):
# print(col)
worksheet.write(i, j, col)
workbook.save('lagouzp.xls')
if __name__ == '__main__':
main()
复制代码
固然存储于excel固然是不够的,以前一直用matplotlib
作数据可视化,此次换个新东西pyecharts
。session
pyecharts是一款将python与echarts结合的强大的数据可视化工具,包含多种图表app
用户自定义
另外须要注意的是从版本0.3.2 开始,为了缩减项目自己的体积以及维持 pyecharts 项目的轻量化运行,pyecharts 将再也不自带地图 js 文件。如用户须要用到地图图表(Geo、Map),可自行安装对应的地图文件包。
- 全球国家地图: echarts-countries-pypkg (1.9MB): 世界地图和 213 个国家,包括中国地图
- 中国省级地图: echarts-china-provinces-pypkg (730KB):23 个省,5 个自治区
- 中国市级地图: echarts-china-cities-pypkg (3.8MB):370 个中国城市
也可使用命令进行安装
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
复制代码
from pyecharts import Bar
city_nms_top10 = ['北京', '上海', '深圳', '成都', '杭州', '广州', '武汉', '南京', '苏州', '郑州', '天津', '西安', '东莞', '珠海', '合肥', '厦门', '宁波',
'南宁', '重庆', '佛山', '大连', '哈尔滨', '长沙', '福州', '中山']
city_nums_top10 = [149, 95, 77, 22, 17, 17, 16, 13, 7, 5, 4, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1]
bar = Bar("Python岗位", "各城市数量")
bar.add("数量", city_nms, city_nums, is_more_utils=True)
# bar.print_echarts_options() # 该行只为了打印配置项,方便调试时使用
bar.render('Python岗位各城市数量.html') # 生成本地 HTML 文件
复制代码
from pyecharts import Geo
city_datas = [('北京', 149), ('上海', 95), ('深圳', 77), ('成都', 22), ('杭州', 17), ('广州', 17), ('武汉', 16), ('南京', 13), ('苏州', 7),
('郑州', 5), ('天津', 4), ('西安', 4), ('东莞', 3), ('珠海', 2), ('合肥', 2), ('厦门', 2), ('宁波', 1), ('南宁', 1), ('重庆', 1),
('佛山', 1), ('大连', 1), ('哈尔滨', 1), ('长沙', 1), ('福州', 1), ('中山', 1)]
geo = Geo("Python岗位城市分布地图", "数据来源拉勾", title_color="#fff",
title_pos="center", width=1200,
height=600, background_color='#404a59')
attr, value = geo.cast(city_datas)
geo.add("", attr, value, visual_range=[0, 200], visual_text_color="#fff",
symbol_size=15, is_visualmap=True)
geo.render("Python岗位城市分布地图_scatter.html")
geo = Geo("Python岗位城市分布地图", "数据来源拉勾", title_color="#fff",
title_pos="center", width=1200,
height=600, background_color='#404a59')
attr, value = geo.cast(city_datas)
geo.add("", attr, value, type="heatmap", visual_range=[0, 10], visual_text_color="#fff",
symbol_size=15, is_visualmap=True)
geo.render("Python岗位城市分布地图_heatmap.html")
复制代码
from pyecharts import Pie
city_nms_top10 = ['北京', '上海', '深圳', '成都', '广州', '杭州', '武汉', '南京', '苏州', '郑州']
city_nums_top10 = [149, 95, 77, 22, 17, 17, 16, 13, 7, 5]
pie = Pie()
pie.add("", city_nms_top10, city_nums_top10, is_label_show=True)
# pie.show_config()
pie.render('Python岗位各城市分布饼图.html')
复制代码
因而可知,python的岗位薪资多数在10k~20k,想从事Python行业的能够把工做年限和薪资结合起来参考一下。
从工做年限来看,1-3年或者3-5年工做经验的招聘比较多,而应届生和一年如下的寥寥无几,对实习生实在不太友好,学历也广泛要求本科,多数公司都很重视入职人员学历这点毋容置疑,虽然学历不表明一切,可是对于一个企业来讲,想要短期内判断一我的的能力,最快速有效的方法无疑是从学历入手。学历第一关,面试第二关。
可是,这不表明学历不高的人就没有好的出路,如今的大学生愈来愈多,找工做也愈来愈难,竞争愈来愈激烈,即便具有高学历,也不能保证你必定能够找到满意的工做,天道酬勤,特别是it这个行业,知识的迭代,比其余行业来的更频密。不断学习,拓展本身学习的广度和深度,才是最正确的决定。
就业寒冬来临,咱们须要的是理性客观的看待,而不是盲目地悲观或乐观。从以上数据分析,若是爱好Python,仍旧能够入坑,不过要注意一个标签有工做经验,就算没有工做经验,本身在学习Python的过程当中必定要尝试独立去作一个完整的项目,爬虫也好,数据分析也好,亦或者是开发,都要尝试独立去作一套系统,在这个过程当中培养本身思考和解决问题的能力。持续不断的学习,才是对本身将来最好的投资,也是度过寒冬最正确的姿式。
招聘数据获取可在公众号:Python攻城狮 后台回复 招聘数据 便可。