本文主要提供中间模拟生成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特殊处理。