拉勾网反爬机制分析(2020年1月21日)

特别声明

众所周知,拉勾网的反爬机制更新较为频繁,本博客所分享的方法不一定永久有效,即具有时效性。研究该网站的反爬机制仅供交流学习,千万不要用于做违法的事情。

网站介绍

拉勾网是一个专业的互联网招聘平台,该网站上有很多公司的招聘信息,所以该网站也成了很多爬虫爬取的重点对象。
在这里插入图片描述

思路分析

本文我以Python为例进行思路分析,首先,在搜索框中输入关键字Python,并点击搜索
在这里插入图片描述
可以跳转到如上图所示的页面,我们要爬取的数据就是下面的职位信息
在这里插入图片描述
查看网页源代码,我们可以发现并没有我们想要的数据,由此可以判断数据通过其他的URL请求得到,下面进行抓包分析
在这里插入图片描述
通过抓包,我们发现了请求的URL,请求方式为POST,但是,当我们直接用POST方式请求时,却不能获取到数据,直接给你返回“请求太频繁”(这个提示应该是假的),我尝试增加请求头中的信息,依旧没有用。后来,经过分析我知道了网站后台可能会判断你请求时的cookie,只有cookie正确,才给你返回信息,因此,我们的思路就很明确了,只要在请求之前拿到cookie,并且在请求时在加上cookie就行了。

核心思路:

为了能够拿到我们想要的职位信息,我们分两步走。
第一步,先用get的方式请求一开始的URL,即我们访问页面的URL,这一步的目的是为了能够得到cookie,为下一步请求做准备。
第一次请求的URL:https://www.lagou.com/jobs/list_Python?labelWords=&fromSearch=true&suginput=
第二步,我们用第一步拿到的cookie来发送POST请求,请求的URL为:
https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false

具体实现

首先,我们可以用requests库中的session方法来创建一个session对象来存储cookie,然后再用这个cookie进行第二步中的请求即可。

测试代码

# !/usr/bin/env python
# —*— coding: utf-8 —*—
# @Time:    2020/1/19 18:03
# @Author:  Martin
# @File:    lagou.py
# @Software:PyCharm
"""
拉勾网反爬机制分析:
通过两次请求来获取职位列表,
第一次请求原始页面获取cookie
第二次请求时利用第一次获取到的cookie

"""
import requests
# 第一次请求的URL
first_url = 'https://www.lagou.com/jobs/list_Python?labelWords=&fromSearch=true&suginput='
# 第二次请求的URL
second_url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
# 伪装请求头
headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Content-Length': '25',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Host': 'www.lagou.com',
    'Origin': 'https://www.lagou.com',
    'Referer': 'https://www.lagou.com/jobs/list_Python?labelWords=&fromSearch=true&suginput=',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
    'X-Anit-Forge-Code': '0',
    'X-Anit-Forge-Token': 'None',
    'X-Requested-With': 'XMLHttpRequest'
}
# 创建一个session对象
session = requests.session()
# 请求的数据
data = {
    'first': 'true',
    'pn': '1',
    'kd': 'Python'
}
session.get(first_url, headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
})
result = session.post(second_url, headers=headers, data=data, allow_redirects=False)
print(result.json())


结果如下:
在这里插入图片描述
可以发现,我们通过这个方法能够成功的获取数据。

注意事项

当用这种方法进行数据爬取时,频繁的请求会被网站发现,并且封你的IP,对于这个问题的解决方法有两个。
方法一,设置请求的时间间隔,不要在短时间内发送大量的请求。
方法二,使用代理IP,当IP被封时,可以通过切换代理IP来绕过封锁,继续抓取数据。

后记

在这里插入图片描述
本人也是刚开始研究网络爬虫,有想要学习爬虫的小伙伴可以相互关注,大家一起交流,一起学习,共同进步。
在这里插入图片描述

本文写于2020年1月21日

于家中

发布了120 篇原创文章 · 获赞 173 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Deep___Learning/article/details/104064641
今日推荐