1. 简介

因为想要找到一个数据分析的工作,能够了解到市面上现有的职位招聘信息也会对找工作有所帮助。

今天就来爬取一下智联招聘上数据分析师的招聘信息,并存入本地的MySQL。

2. 页面分析

2.1 找到数据来源

打开智联招聘首页,选择数据分析师职位,跳转进入数据分析师的详情页面。我们需要抓取的数据都呈现在这里。

既然我们想要的数据都在这个页面上,那么就对页面分析一下,这些数据都是用什么方式传输的。

首先右键查看网页源代码,发现职位信息并不在源代码里面。也就是说,职位信息是通过其他来源加载的,并不是直接写入这个网页的代码里。

右键检查,找到network一览进行查看,发现职位信息其实是来源于接口返回的一个json格式的数据。所以我们要抓取的数据就来源于这个接口:

2.2 分析url构成

由2.1,我们已经找到数据来源的url为

https://fe-api.zhaopin.com/c/i/sou?pageSize=90&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88&kt=3&_v=0.55861702&x-zp-page-request-id=112663d962234d3e8ca52b6e9d5ab4ea-1545222165002-62086

这个url中包含了很多参数,分别对应在职位搜索时加入的条件:

pageSize:指每一页显示的职位数量,也就是通过url一次取多少数

cityId:指职位的城市划分,489代表全国

workExperience:指职位要求的工作经验

education:职位要求的学历水平

companyType:公司的经营类别

employmentType:职位的性质,如实习/全职/兼职

jobWelfareTag:福利

kw:搜索关键字,如果关键字包含汉字,则进行url转码。如:此处,数据分析师转码为%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88

kt/_v/x-zp-request-id:暂时没有弄明白具体是指什么

上面的url只是搜索结果第一页对应的来源,而我们的搜索结果其实是有很多页进行展示的。

通过同样的方式,可以拿到搜索结果接下来几页对应的url。

以第二页对应的url为例:

https://fe-api.zhaopin.com/c/i/sou?start=90&pageSize=90&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88&kt=3&_v=0.55861702&x-zp-page-request-id=112663d962234d3e8ca52b6e9d5ab4ea-1545222165002-62086

对比之后,发现:区别之处仅仅在于第二页对应的url加入了一个start参数。

start=90,即为第二页的搜索结果。结合pageSize参数,每一页展示90条职位信息。也就是说,start=90表示第二页,start=180表示第三页......

我们就知道了如何去得到每一页搜索结果对应的数据来源了。

3. 抓取数据

3.1 设计数据获取流程

既然我们已经发现了,每一页的职位信息都来自于访问接口后返回的json格式的数据,我们就可以直接访问接口然后读取json就可以得到想要的职位信息了。

步骤如下:

1) 设定关键字访问接口,获得包含职位信息的json数据

2) 从返回的json中提取需要的数据,存入本地MySQL中

3.2 代码实现

因为这些职位数据是没有经过登陆就可以获取的,而且在请求头中并没有发现什么特别的信息。尝试后发现,智联招聘对传输职位信息的这个接口没有做什么反爬限制,直接使用urllib包的urlopen()方法就可以获得数据。

import pymysql
import urllib
import json
import time
import random# 在sql中创建表
def create_table_mysql():db = pymysql.connect(host='localhost', user='root', password='mysqlkey', db='test_db', port=3306)# 创建游标对象cursorcursor = db.cursor()# 执行SQL,如果表存在就删除cursor.execute('DROP TABLE IF EXISTS zlzp_sjfx')# 创建表create_table_sql = """CREATE TABLE zlzp_sjfx(job_number CHAR(100) COMMENT '记录编号',job_type_big_num CHAR(100) COMMENT '职业大分类编号',job_type_big_name CHAR(100) COMMENT '职业大分类名称',job_type_medium_num CHAR(100) COMMENT '职业细分类编号',job_type_medium_name CHAR(100) COMMENT '职业细分类名称',company_num CHAR(100) COMMENT '公司编号',company_url CHAR(200) COMMENT '公司对应url',company_name CHAR(100) COMMENT '公司名称',company_size_num CHAR(100) COMMENT '公司规模编号',company_size CHAR(100) COMMENT '公司规模',company_type_num CHAR(100) COMMENT '公司类型编号',company_type CHAR(100) COMMENT '公司类型',job_url CHAR(200) COMMENT '职位对应url',working_exp_num CHAR(100) COMMENT '工作经验编号',working_exp CHAR(100) COMMENT '工作经验',edu_level_num CHAR(100) COMMENT '教育水平编号',edu_level CHAR(100) COMMENT '教育水平',job_salary CHAR(100) COMMENT '工资',job_type CHAR(100) COMMENT '工作类型',job_name CHAR(100) COMMENT '工作类型',job_location_lat CHAR(100) COMMENT '经度',job_location_lon CHAR(100) COMMENT '纬度',job_city CHAR(100) COMMENT '工作城市',job_updatetime CHAR(100) COMMENT '更新时间',job_createtime CHAR(100) COMMENT '创建时间',job_endtime CHAR(100) COMMENT '结束时间',job_welfare CHAR(100) COMMENT '工作福利')"""try:# 创建表cursor.execute(create_table_sql)# 提交执行db.commit()print('table zlzp_sjfx create done')except:# 回滚db.rollback()print('table zlzp_sjfx create not done')return db, cursordb, cursor = create_table_mysql()
time_0 = time.time()for i in range(500):url = 'https://fe-api.zhaopin.com/c/i/sou?start={}&pageSize=90&cityId=489&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88&kt=3&_v=0.89067574&x-zp-page-request-id=866368d6313e41c38a6e600b1c5d8082-1545034860140-256948'.format(i*90)if i==0:url = 'https://fe-api.zhaopin.com/c/i/sou?pageSize=90&cityId=489&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88&kt=3&_v=0.89067574&x-zp-page-request-id=866368d6313e41c38a6e600b1c5d8082-1545034860140-256948'page = urllib.request.urlopen(url).read()data = json.loads(page)time.sleep(random.uniform(1.2, 2.1))add_sql = """INSERT INTO zlzp_sjfx(job_number, job_type_big_num, job_type_big_name,job_type_medium_num,job_type_medium_name,company_num,company_url,company_name,company_size_num,company_size,company_type_num,company_type,job_url,working_exp_num,working_exp,edu_level_num,edu_level,job_salary,job_type,job_name,job_location_lat,job_location_lon,job_city,job_updatetime,job_createtime,job_endtime,job_welfare)VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""for each_job in data['data']['results']:        add_data = (each_job['number'], # 编号each_job['jobType']['items'][0]['code'], # 职业大分类编号each_job['jobType']['items'][0]['name'], # 职业大分类名称each_job['jobType']['items'][1]['code'], # 职业细分类编号each_job['jobType']['items'][1]['name'], # 职业细分类名称each_job['company']['number'], # 公司编号each_job['company']['url'], # 公司对应urleach_job['company']['name'], # 公司名称each_job['company']['size']['code'], # 公司规模编号each_job['company']['size']['name'], # 公司规模each_job['company']['type']['code'], # 公司类型编号each_job['company']['type']['name'], # 公司类型each_job['positionURL'], # 职位对应urleach_job['workingExp']['code'], # 工作经验编号each_job['workingExp']['name'], # 工作经验each_job['eduLevel']['code'], # 教育水平编号each_job['eduLevel']['name'], # 教育水平each_job['salary'], # 工资each_job['emplType'], # 工作类型each_job['jobName'], # 工作名称each_job['geo']['lat'], # 经度each_job['geo']['lon'], # 纬度each_job['city']['display'], # 工作城市each_job['updateDate'],each_job['createDate'],each_job['endDate'],'/'.join(each_job['welfare']) # 工作福利)cursor.execute(add_sql, add_data)try:db.commit()print('page', i, 'done!用时', time.time()-time_0)except:db.rollback()print('page', i, 'not done')# 关闭游标
cursor.close()
# 关闭数据库连接
db.close()

转载于:https://www.cnblogs.com/xingyucn/p/10146176.html

爬虫练习二:爬取智联招聘职位信息相关推荐

  1. Python爬虫爬取智联招聘职位信息

    目的:输入要爬取的职位名称,五个意向城市,爬取智联招聘上的该信息,并打印进表格中 #coding:utf-8 import urllib2 import re import xlwtclass ZLZ ...

  2. 【Python爬虫案例学习20】Python爬虫爬取智联招聘职位信息

    目的:输入要爬取的职位名称,五个意向城市,爬取智联招聘上的该信息,并打印进表格中 ####基本环境配置: Python版本:2.7 开发工具:pycharm 系统:win10 ####相关模块: im ...

  3. 智联招聘python岗位_Python爬虫爬取智联招聘职位信息

    import urllib2 import re import xlwt '''遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!''' cl ...

  4. python爬取智联招聘职位信息(单进程)

    我们先通过百度搜索智联招聘,进入智联招聘官网,一看,傻眼了,需要登录才能查看招聘信息 没办法,用账号登录进去,登录后的网页如下: 输入职位名称点击搜索,显示如下网页: 把这个URL:https://s ...

  5. java爬取智联招聘职位信息

    第一次写爬虫,案例比较简单,就在智联招聘网站上爬取职位信息. 技术点:IO流,集合,Jsoup使用,以及前端的知识 代码如下: package com.wty.utils;import java.io ...

  6. Python爬取智联招聘职位信息

    这是一次失败的尝试 , 事情是这样的-- 1.起因 前段时间刚刚学完爬虫,于是准备找个项目练练手.因为想要了解一下"数据挖掘"的职位招聘现状,所以我打算对'智联招聘'下手了.网上当 ...

  7. pythton爬取智联招聘职位信息

    前言 在智联招聘https://sou.zhaopin.com/时,发现无法直接去解析获得的html文本,它的数据是用js动态加载的,数据内容存储在json文件中,所以不能用以前的方法使用xpath. ...

  8. python爬虫多url_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘

    之前文章中所介绍的爬虫都是对单个URL进行解析和爬取,url数量少不费时,但是如果我们需要爬取的网页url有成千上万或者更多,那怎么办? 使用for循环对所有的url进行遍历访问? 嗯,想法很好,但是 ...

  9. selenium+PyQuery+chrome headless 爬取智联招聘求职信息

    最近导师让自己摸索摸索Python爬虫,好了就开始一发不可收拾的地步.正巧又碰到有位同学需要一些求职信息对求职信息进行数据分析,本着练练手的目的写了用Python爬取智联招聘网站的信息.这一爬取不得了 ...

最新文章

  1. Android微信智能心跳方案 Android微信智能心跳方案
  2. bzoj3218: a + b Problem
  3. PaddleOCR——CUDA9.0环境中训练运行错误【Cudnn error, CUDNN_STATUS_BAD_PARAM】解决方案
  4. 卸载 流程_一款适合于windows端的卸载神器 彻底清理残留软件
  5. (六)ElasticSearch 6.1.1聚合查询
  6. link2001错误无法解析外部符号metaObject
  7. java 解析xml字符串的_java 解析xml字符串
  8. 在TCP三次握手后插入伪造的TCP包
  9. Spring-IOC 扩展点 BeanFactoryPostProcessor及其子接口解析
  10. java 前端模板_前端项目模板
  11. Android上使用OkHttp来实现断点下载(续传)
  12. RHEL7的安装步骤
  13. 推荐系统 | (4) 可解释推荐系统---知其然,知其所以然
  14. 基于cropper.js封装vue在线图片裁剪组件
  15. iphone11返回上一级手势怎么设置_iPhone 11 系列手势操作大全你了解吗?
  16. C#线性表约瑟夫环(Joseph Ring)
  17. 《概率论与数理统计》作业一,python画频率分布表
  18. Xamarin.Forms学习之路——MarvelCard改造版
  19. 小程序中关于红包雨的实现
  20. Tiny4412裸机程序之代码重定位初体验

热门文章

  1. 计算机行业求职总结--准备篇
  2. vue - vue中使用echart实现柱状图和折线图
  3. 【Bleak】六、特征及描述的发现
  4. Laypage完整分页示例
  5. phpcms 模板mysql_PHPCMS 模板调用
  6. dispose方法和setvisible方法的区别和使用
  7. 台式计算机显示屏不亮,台式机屏幕不亮怎么办
  8. python创意turtle作品-Python创意编程200例turtle篇
  9. Android 模拟器genymotion安装,eclipse 插件
  10. 小菜鸟的Linux(centOS 6)学习之基础篇