Python3获取拉勾网招聘信息的方法实例


Posted in Python onApril 03, 2019

前言

为了了解跟python数据分析有关行业的信息,大概地了解一下对这个行业的要求以及薪资状况,我决定从网上获取信息并进行分析。既然想要分析就必须要有数据,于是我选择了拉勾,冒着危险深入内部,从他们那里得到了信息。不得不说,拉勾的反爬技术还挺厉害的,稍后再说明。话不多说,直接开始。

一、明确目的

每次爬虫都要有明确的目的,刚接触随便找东西试水的除外。我想要知道的是python数据分析的要求以及薪资状况,因此,薪资、学历、工作经验以及一些任职要求就是我的目的。

既然明确了目的,我们就要看一下它们在什么位置,所以我们打开浏览器,寻找目标。像拉勾这种网站他们的信息一般都是通过ajax加载的,而且在输入“python数据分析”敲击回车之后跳转的页面,招聘信息不是一开始就显示出来的,通过点击页码也只是招聘信息在变化甚至连network都没多大变化,可以大胆猜测他是通过post请求的,所以我们只关注post请求以及XHR文件,很快就发现了我们要的东西。

Python3获取拉勾网招聘信息的方法实例

点击preview可见详细信息以json形式保存着,其中‘salary'、‘workYear'、‘education'、‘positionID'(招聘信息详情页有关的id)是我们要的。再观察一下它的form data,其中kd=关键字,pn=pageNum(页码)这是我们请求的时候要带上的参数。另外我们要注意请求头的referer参数,待会儿要用。知道了目标之后,爬起来!

二、开始爬虫 

先设置请求头headers,把平时用的user-agent带上,再把formdata也带上,用requests库直接requests.post(url, headers=headers, data=formdata) ,然后就开始报错了: {"status":false,"msg":"您操作太频繁,请稍后再访问","clientIp":"......","state":2402}

解决这个问题的关键在于,了解拉勾的反爬机制:在进入python数据分析招聘页之前,我们要在主页,不妨叫它start_url输入关键字跳转。在这个过程中,服务器会传回来一个cookies,如果带着这个cookies请求的话我们就可以得到要的东西,所以要先请求start_url获取cookies在请求目标url,而且在请求目标地址的话还要带上referer这个请求头参数,referer的含义大概是这样:告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。另外,睡眠时间也要设置的长一点,不然很容易被封。知道了反爬机制之后,话不多说,直接上代码。

'''
@author: Max_Lyu
Create time: 2019/4/1
url: https://github.com/MaxLyu/Lagou_Analyze
'''
 # 请求起始 url 返回 cookies
 def get_start_url(self):
 session = requests.session()
 session.get(self.start_url, headers=self.headers, timeout=3)
 cookies = session.cookies
 return cookies

 # 将返回的 cookies 一起 post 给 target_url 并获取数据
 def post_target_url(self):
 cookies = self.get_start_url()
 pn = 1
 for pg in range(30):
  formdata = {
  'first': 'false',
  'pn': pn,
  'kd': 'python数据分析'
  }
  pn += 1

  response = requests.post(self.target_url, data=formdata, cookies=cookies, headers=self.headers, timeout=3)
  self.parse(response)
  time.sleep(60) # 拉勾的反扒技术比较强,短睡眠时间会被封

 # 解析 response,获取 items
 def parse(self, response):
 print(response)
 items = []
 print(response.text)
 data = json.loads(response.text)['content']['positionResult']['result']

 if len(data):
  for i in range(len(data)):
  positionId = data[i]['positionId']
  education = data[i]['education']
  workYear = data[i]['workYear']
  salary = data[i]['salary']
  list = [positionId, education, workYear, salary]
  items.append(list)
 self.save_data(items)
 time.sleep(1.3)

其中save_data(items)是保存文件,我是保存在csv文件。篇幅有限,这里就不展示了。

三、获取招聘详情 

上面说了positionID 是为了获取详情页,详情页里面有要的任职要求。这个要获取就相对容易了,不过文本的处理并没有很简单,我只能通过“要求”这两个字获取任职要求(虽然有的为任职技能啥的,就这样进行取舍了)。

'''
@author: Max_Lyu
Create time: 2019/4/1
url: https://github.com/MaxLyu/Lagou_Analyze
'''
def get_url():
 urls = []
 with open("analyst.csv", 'r', newline='') as file:
 # 读取文件
 reader = csv.reader(file)
 for row in reader:
  # 根据 positionID 补全 url
  if row[0] != "ID":
  url = "https://www.lagou.com/jobs/{}.html".format(row[0])
  urls.append(url)

 file.close()
 return urls

# 获取详细信息
def get_info():
 urls = get_url()
 length = len(urls)
 for url in urls:
 print(url)
 description = ''
 print(length)
 response = requests.get(url, headers=headers)
 response.encoding = 'utf-8'
 content = etree.HTML(response.text)
 detail = content.xpath('//*[@id="job_detail"]/dd[2]/div/p/text()')
 print(detail)

 for i in range(1, len(detail)):

  if '要求' in detail[i-1]:
  for j in range(i, len(detail)):
   detail[j] = detail[j].replace('\xa0', '')
   detail[j] = re.sub('[、;;.0-9。]', '', detail[j])
   description = description + detail[j] + '/'
  print(description)
 write_file(description)
 length -= 1
 time.sleep(3)

四、成果与展示

Python3获取拉勾网招聘信息的方法实例

Python3获取拉勾网招聘信息的方法实例 

到这里,爬取的任务就结束了,源码地址:https://github.com/MaxLyu/Lagou_Analyze  (本地下载)。获得数据之后就是小小地分析一下了,这个下次再总结。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
py中的目录与文件判别代码
Jul 16 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
python ---lambda匿名函数介绍
Mar 13 Python
Python增强赋值和共享引用注意事项小结
May 28 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 Python
Python使用字典实现的简单记事本功能示例
Aug 15 Python
python并发编程多进程 模拟抢票实现过程
Aug 20 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
Python局部变量与全局变量区别原理解析
Jul 14 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 Python
Python3实现的旋转矩阵图像算法示例
Apr 03 #Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 #Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 #Python
Python时间序列处理之ARIMA模型的使用讲解
Apr 02 #Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 #Python
从0开始的Python学习014面向对象编程(推荐)
Apr 02 #Python
Python参数解析模块sys、getopt、argparse使用与对比分析
Apr 02 #Python
You might like
世界上第一台立体声收音机
2021/03/01 无线电
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
javascript 异常处理使用总结
2009/06/21 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
防止浏览器记住用户名及密码的简单实用方法
2013/04/22 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
node使用request请求的方法
2019/12/20 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
Chemist Warehouse官方海外旗舰店:澳洲第一连锁大药房
2017/08/25 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
市场安全管理制度
2014/01/26 职场文书
小学生安全保证书
2014/02/01 职场文书
自荐信的基本格式
2014/02/22 职场文书
产品开发计划书
2014/04/27 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
Python turtle编写简单的球类小游戏
2022/03/31 Python