从头学习爬虫(四十)高阶篇----模拟js生成Cookie中__jsl_clearance来破解加速乐的反爬虫机制

本文主要提供中间模拟生成Cookie中__jsl_clearance字段来破解加速乐的反爬虫机制

前后通过postman模拟代替代码实现

一 需求

http://www.cyicai.com/information/applyForSubscription

需要爬取

二 分析请求

分析了一下 第一个521 请求cookie 没有__jsl_clearance

第二个请求里就有了

第四个post请求是需要的内容 参数是json格式

三 实操

第二步细节请求头 构造就跳过了,分析关键字段 自行用postman模拟。

1 模拟cookie

构造521那个请求 首先我们是没有任何cookie

拿到响应

把响应cookie 包装到请求头再次请求

我们记录下JSESSIONID=B8E7A18467F08205915EAE48C00898D8;__jsluid=fc08291578d4b39171eb760678ed03ca

做完第一步模拟521请求

__jsl_clearance这个字段很显然是内容js 生成 解析过于麻烦我们这里遇到了瓶颈

百度了下是经过一次加密实现的,有关方法可以参考点击

2 代码实现js 第一次解密

先看结果

   String s="<script>var x=\"if@function@setTimeout@@try@@parseInt@cookie@0xFF@charAt@@document@fromCharCode@kq@attachEvent@var@RT@2@Zg@18@new@9@@search@join@@36@chars@Path@@@D@Thu@div@1@@@match@eval@__jsl_clearance@wmkQ@@@@return@@W@location@else@pathname@createElement@JD@@@replace@catch@reverse@606@@window@charCodeAt@@Expires@Sep@@0xEDB88320@@toLowerCase@20@firstChild@while@@DOMContentLoaded@innerHTML@https@href@@12@@@37@@captcha@split@@RegExp@GMT@@@@toString@KC@headless@0@3@String@@addEventListener@@@@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@onreadystatechange@length@@@@@21@Array@@@substr@1500@a@d@f@@1537442497@g@8@challenge@for@false@@JgSe0upZ@e@\".replace(/@*$/,\"\").split(\"@\"),y=\"g 10=2(){3('1i.2g=1i.1k+1i.o.1p(/[\\\\?|&]2n-42/,\\\\'\\\\')',3o);c.8='1a=3t.1s|34|'+(2(){g 10=[[(-~!{}<<-~!{})-~!{}-~{}-~(+[])-~(+[])],(-~[]+(-~{}+[(-~!{}<<-~!{})])/[(-~!{}<<-~!{})]+[]+[]),(-~!{}+[]+[])+[i],[(-~!{}<<(-~(+[])+[(-~!{}<<-~!{})]>>(-~!{}<<-~!{})))],(-~!{}+[]+[])+[35],(-~!{}+[]+[])+(-~!{}+[]+[]),[i],(-~!{}+[]+[])+(-~!{}-~(+[])-~(+[])-~(+[])-~(+[])+[]),(-~!{}+[]+[]),(-~!{}+[]+[])+[-~(35)],(-~!{}-~(+[])-~(+[])-~(+[])-~(+[])+[]),[35],(m+[]),(-~!{}+[]+[])+[(-~!{}<<(-~(+[])+[(-~!{}<<-~!{})]>>(-~!{}<<-~!{})))],(-~!{}+[]+[])+(-~[]+(-~{}+[(-~!{}<<-~!{})])/[(-~!{}<<-~!{})]+[]+[]),((+[])+[[]][34]),(-~!{}+[]+[])+((+[])+[[]][34]),[-~(35)],(-~!{}+[]+[])+[(-~!{}<<-~!{})-~!{}-~{}-~(+[])-~(+[])]],n=3k(10.3e);43(g 3f=34;3f<10.3e;3f++){n[10[3f]]=['1b',[(-~!{}<<(-~(+[])+[(-~!{}<<-~!{})]>>(-~!{}<<-~!{})))]+([]%!!20.33+[]).a(-~!{}),'1h','32',([i]/(+[])+[]+[]).a((-~(+[])-~(+[])<<-~{}))+(-~!{}-~(+[])-~(+[])-~(+[])-~(+[])+[]),((+[])+[[]][34]),'e',({}+[[]][34]).a(-~!{}),(!''+[]+[[]][34]).a(-~[])+[(-~!{}<<-~!{})-~!{}-~{}-~(+[])-~(+[])],'1m',[(-~[-~(+!+[])])/(+[])+[]+[[]][34]][34].a(~~''),[{}+[]+[]][34].a(i),[{}+[]+[[]][34]][34].a((-~{}|(-~!{}<<-~!{}))),'12',[35],'40','j','h','%'][3f]};1f n.p('')})()+';23=13, 29-24-k 2i:3j:2l 2r;t=/;'};1((2(){5{1f !!20.38;}1q(47){1f 44;}})()){c.38('2d',10,44)}1j{c.f('3d',10)}\",f=function(x,y){var a=0,b=0,c=0;x=x.split(\"\");y=y||99;while((a=x.shift())&&(b=a.charCodeAt(0)-77.5))c=(Math.abs(b)<13?(b+48.5):parseInt(a,36))+y*c;return c},z=f(y.match(/\\w/g).sort(function(x,y){return f(x)-f(y)}).pop());while(z++)try{eval(y.replace(/\\b\\w+\\b/g, function(y){return x[f(y,z)-1]||(\"_\"+y)}));break}catch(_){}</script>";
    String resHtml = "function getClearance(){" + s+"};";
    resHtml = resHtml.replace("</script>", "");
    resHtml = resHtml.replace("eval", "return");
    resHtml = resHtml.replace("<script>", "");
	ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("js");
    engine.eval(resHtml);
    Invocable invocable = (Invocable) engine;
    String resJs = (String) invocable.invokeFunction("getClearance");
    //一级解密结果
    System.out.println(resJs);

 

 cookie就是这里生成。

3 生成cookie测试

由于里面有document 所以java原生js 就不行了 不支持 我们结合下浏览器。

这里我们先演示下

3.1 新建文件 保存成 a.html 

3.2 把上面js 格式化(美化) 保存在 a.html

3.3 头尾加上<script>

3.4 我们改下js 打印出cookie

 

4 模拟post请求

既然我们已经拿到cookie 记录下__jsl_clearance=1537442497.606|0|gr6kqbRTIwmkQ8aKCjZg0Wn5JDo%3D

 完美

测试完毕!!!

四 代码回溯

前面最后一步 cookie 我们是复制 很显然不可能在实际中这么操作

我们改造下

代码

    //selenium 模拟
    System.getProperties().setProperty("webdriver.chrome.driver", "D:\\chromedriver_win32(1)\\chromedriver.exe");
	ChromeOptions options = new ChromeOptions();
	options.setBinary("C:\\Program Files\\Chrome\\Chrone.exe");
	WebDriver driver = new ChromeDriver(options);
	//随便打开一个网站
	driver.get("https://www.baidu.com");
	//让浏览器去执行js 我们拿到return cookie的值
	JavascriptExecutor js = (JavascriptExecutor) driver;
	s="var a" + resJs.split("document.cookie")[1].split("Path=/;'")[0]+"Path=/;';return a;";
	System.out.println(s);
	String cookie=(String)js.executeScript(s);
    System.out.println(cookie);
    driver.quit();

 

改造2 不使用浏览器 用原生 (把window.headless替换成'')

    String overJs="function getClearance2(){ var a" + resJs.split("document.cookie")[1].split("Path=/;'")[0]+"Path=/;';return a;};";
    overJs=overJs.replace("window.headless", "''");
    System.out.println(overJs);
    engine.eval(overJs);
    Invocable invocable2 = (Invocable) engine;
    String over = (String) invocable2.invokeFunction("getClearance2");
    System.out.println(over);

五 总结

本篇基本上就是爬虫cookie实战模拟终极篇,很实用,也很难,需要js功底,需要熟知原理构造。

参考 https://www.cnblogs.com/dadaxin/p/8288178.html

六 更新

修改时间2019-4-11,其他网站不一定通用,第一步解密不用动,第二步需要分析js特殊处理。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值