事情的起源是这样的,某个风和日丽的下午… 习惯性的打开知乎准备划下水,看到一个问题刚好邀请回答
于是就萌生了采集下某招聘网站Python岗位招聘的信息,看一下目前的薪水和岗位分布,说干就干。
先说下数据采集过程中遇到的问题,首先请求头是一定要伪装的,否则第一步就会给你弹出
你的请求太频繁,请稍后再试
,其次网站具有多重反爬策略,解决方案是每次先获取session然后更新我们的session进行抓取,最后拿到了想要的数据。
Chrome浏览器右键检查查看
network
,找到链接
https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false
可以看到返回的数据正是页面的Python招聘详情,于是我直接打开发现直接提示
{"status":false,"msg":"您操作太频繁,请稍后再访问","clientIp":"124.77.161.207","state":2402}
,机智的我察觉到事情并没有那么简单
关键词:
python
搜索范围:
全国
数据时效:
2019.05.05
""" Created on 19-5-05 @title: '' @author: Xusl """ import jsonimport requestsimport xlwtimport timedef 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() 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' ]) 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) return info_listdef main () : page = int(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 = xlwt.Workbook(encoding='utf-8' ) worksheet = workbook.add_sheet('lagouzp' , cell_overwrite_ok=True ) for i, row in enumerate(info_result): for j, col in enumerate(row): worksheet.write(i, j, col) workbook.save('lagouzp.xls' )if
__name__ == '__main__' : main()
日志记录
当然存储于excel当然是不够的,之前一直用
matplotlib
做数据可视化,这次换个新东西
pyecharts
。
pyecharts是一款将python与echarts结合的强大的数据可视化工具,包含多种图表
用户自定义
另外需要注意的是从版本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.render('Python岗位各城市数量.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 ), ('大连'