今天讲猿人学第二题
网站地址:
http://match.yuanrenxue.com/match/2
目录:
1、环境
2、分析网站
3、实现爬取
1、环境
Python3.7、pyexecjs、requests、Charles抓包工具
2、分析网站
题目就告诉我们是cookie反爬了,当然我们也是可以分析出来的,请求的时候请求头先不带cookie,验证一下很快就可以知道是cookie反爬了
先分析网络请求找到数据接口
既然是cookie反爬,我先介绍一下cookie反爬的几种方式,第一种是服务器返回的cookie,第二种是本地生成的cookie,首先就需要判断是那种情况,一个个请求分析,第一个2请求Chrome展示不了内容(这就很烦,猿人学关于cookie反爬的,Chrome就展示不了返回的数据),用Charles抓包
在Charles中可以看到第一个2中返回了一段混淆过的代码
返回的js代码估计就是生成cookie的代码,不然也不会被混淆吧,猿人学自带了反混淆的工具
将混淆过的代码放入进行还原得到我们更容易分析的代码。
复制到编译器中,一下就在最后看到了cookie的赋值
还看到了location["reload"]();这就是为什么后面又请求了一次2这个地址,直接封装返回cookie就好了,代码太长就展示关键代码
function W(Y, Z) {
document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y;
return "m" + "=" + V(Y) + "|" + Y;
// location["reload"]();
}
function X(Y, Z) {
return Date["parse"](new Date());
}
function get_cookie(){
return W(X());
}
3、代码实现
其实找到了cookie的生成逻辑,代码基本就可以套用第一题的,改几个参数就好了
import execjs
import requests
headers = {
'Proxy-Connection': 'keep-alive',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
'Referer': 'http://match.yuanrenxue.com/match/2',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cookie': ''
}
with open('第二题.js', 'r', encoding='gbk') as f:
jstext = f.read()
for page in range(1, 4):
data = {
'page': page
}
cookie = execjs.compile(jstext).call('get_cookie')
headers['Cookie'] = cookie
url = f'http://match.yuanrenxue.com/api/match/2?page={page}'
response = requests.get(url, headers=headers, data=data)
print(response.json())
运行结果: