文章目录
- 拉勾网职位需求采集项目
-
- 一、职位需求页面分析
- 二、PositionId 数据采集
- 三、项目代码
拉勾网职位需求采集项目
需求:
通过python抓取拉钩网的招聘详情,python岗位要求。
一、职位需求页面分析
- 拉钩网项目与前面爬虫项目的不同点:
之前项目是get请求,拉钩网项目是post请求。
get是要获取这个信息,post是获取这个信息的同时,在上传一部分参数。
在爬取三国演义小说时,我们是先爬取目录页内容,得到章节名和详情页链接;再通过分析去访问详情页链接获取详情页内容。
但在拉钩网项目中,原html代码中是找不到详情页链接的,此时我们需要通过分析XHR
对象来获取需求。
- 页面分析:
进入拉钩网官网,输入python出现所有相关的职位,点击每一个职位进去分析每个职位详情页的网址特点。
通过观察可以发现,拉勾网的职位页面详情是由 http://www.lagou.com/jobs/ PositionId.html
组成。
而 PositionId 可以通过分析 Json 的 XHR 获得。
知道了数据的源头,接下来就按照常规步骤包装 Headers ,提交 FormData 来获取反馈数据。
二、PositionId 数据采集
注意:
- 拉勾网反爬虫做的比较严,请求头多添加几个参数才能不被网站识别。
- 我们找到真正的请求网址,发现返回的是一个 JSON 串,解析这个 JSON 串即可,而且注意是 POST传值,通过改变 Form Data 中 pn 的值来控制翻页。
XHR
:XMLHttpRequest对象
用于和服务器交换数据。
当我们进入开发者模式,点击网络,XHR获取响应后
这个请求里面包含了
真实的URL( 浏览器上的 URL 并没有职位数据,查看源代码就可以发现这一点)、
POST 请求的请求头Headers 、
POST 请求提交的表单 Form Data (这里面包含了页面信息 pn 、搜索的职位信息 kd )
真实的URL获取:
请求头信息
我们需要构造的请求头Headers信息,如果这里没有构造好的话,容易被网站识别为爬虫,从而拒绝访问请求。
表单信息
发送POST
请求时需要包含的表单信息 Form Data
。
返回的JSON数据
发现需要的职位信息在 content –> positionResult –> result 下,其中包含了工作地点、公司名、职位等信息。 我们只需要保存这个数据就可以了。
三、项目代码
1.先获取拉钩网所有岗位API接口的响应信息(response)
通过post并传入参数和数据访问url:https://www.lagou.com/jobs/positionAjax.json?=false
2.在获取的页面解析我们需要的所有岗位的ID号,yeild返回。
3.把ID传进解析岗位详情的函数里,先下载岗位详情页面,然后解析我们想要的岗位要求信息。
import time
import requests
from fake_useragent import UserAgent
from lxml import etree
ua = UserAgent()
def download_positions(kd="python", city="西安", page=1):
"""
获取拉勾网所有的岗位API接口的响应信息
:param kd: 岗位名称/关键字
:param city: 城市
:param page: 页码
:return: position_id
"""
拉勾网访问的网址,并不是Ajax的网址
old_url = 'https://www.lagou.com/jobs/list_python'
真实的API接口的网址(通过F12开发者模式分析出来的)
url = 'https://www.lagou.com/jobs/positionAjax.json?=false'
url提交的参数信息, http://xxxxx/?param1=value1¶m2=value2
params = {
'city': city,
'needAddtionalResult': 'false',
}
url以POST方式提交的信息(参数分析出来的)
data = {
'first': 'true',
'pn': page,
'kd': kd
}
头部信息, 为了防止拉钩反爬策略的
headers = {
'UserAgent': ua.random,
'Host': 'www.lagou.com',
'Origin': 'https://www.lagou.com',
'TE':