Python爬虫:某网站cookie参数__jsl_clearance_s生成分析(一)

逛论坛发现一个求助帖,想获取数据但网站有cookie反爬,闲来无事就分析了一下cookie参数生成方法~

2021-01-04更新:如果此篇看不懂,可直接看第二篇,只要是网站使用的是同一家公司的服务(加速乐),这个参数获取方式都是一样的。

目标:生成cookie中的__jsl_clearance_s参数

工具:chrome/firefox浏览器、fiddler、pychram、python3.7、解混淆专解测试版V0.1

模块:requests、re、execjs、json

分析:

首先打开浏览器,和fiddler抓包工具,发现浏览器进行了三次请求,前两次响应的状态码为521,响应内容都是一段js代码,第三次请求响应得到正常内容,并且携带了两个cookie参数;
图1
在这里插入图片描述
通过三次请求对比,发现第三次请求cookie中的__jsl_clearance_s参数和第二次请求中的并不一样;
先看看第一次响应的结果,为一段js,这段js代码为浏览器设置了一个cookie;
图2
这里直接利用正则将这段代码提取出来,再利用execjs模块执行,即可得到这个cookie:

# 提取js代码
js_clearance = re.findall('cookie=(.*?);location', response.text)[0]
# 执行后获得cookie参数js_clearance
result = execjs.eval(js_clearance).split(';')[0]

通过观察第二个请求,第二个请求再次得到一段js代码,并且携带了两个cookie参数,一个__jsluid_s、一个__jsl_clearance_s,而__jsl_clearance_s就是刚刚利用js生成的,__jsluid_s是第一次请求后为浏览器设置的;
图3
图4
继续分析得知第二次请求需要携带这两个cookie参数才能得到第二段js代码。这段js代码是混淆过的,利用解混淆专解测试版V0.1进行解混淆,得到正确的js代码;

简单解读cookie生成方法就是调用go方法并传入一个对象,最后该方法为浏览器设置一个cookie。那么思路就简单了,直接将js代码保存为本地文件,利用execjs模块执行代码调用go方法并传入需要的参数就能得到cookie;因为变量名都是混淆的,为了方便解读,修改一下js代码中的go函数:

function go(data) {
    var chars = data["chars"]["length"];
    for (var i = 0; i < chars; i++) {
      for (var j = 0; j < chars; j++) {
        var cookie = data["bts"][0] + data["chars"]["substr"](i, 1) + data["chars"]["substr"](j, 1) + data["bts"][1];
        if (hash(cookie) == data["ct"]) {
          return cookie;
        }
      }
    }
}

修改前go函数是主要作用是通过组合一段字符串加密后进行对比,得到正确cookie然后设置到浏览器,修改后是直接return返回正确cookie);

js代码修改完成后保存到本地,js测试后发现有时会报错,多次抓包发现有三种加密方式,分别为md5、sha1、sha256,传入对象的参数ha的值不同,加密方式不同。那么思路有了,按上面的方法分别保存三套js加密代码,通过参数中的ha值判断使用哪一种加密,执行即可正确得到cookie;

# 提取js代码中的参数并转字典
parameter = json.loads(re.findall(r';go\((.*?)\)', response.text)[0])
js_file = ''
# 判断需要使用的js代码
if parameter['ha'] == 'sha1':
    js_file = 'sha1.js'
elif parameter['ha'] == 'sha256':
    js_file = 'sha256.js'
elif parameter['ha'] == 'md5':
    js_file = 'md5.js'

整个请求过程利用session保持会话,最后得到的cookie添加进去进行第三次请求,即可得到正确响应内容。

总结:这个__jsl_clearance_s获取比较简单,懂一点js即可搞定,如果不懂也没关系,代码拿去。另外更新了一篇纯python实现获取,原理其实都是一样,可以看看。

本篇源代码:前往github

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值