從頭學習爬蟲(四十)高階篇----模擬js生成Cookie中__jsl_clearance
本文主要提供中間模擬生成Cookie中__jsl_clearance欄位
前後通過postman模擬代替程式碼實現
一 需求
需要爬取
二 分析請求
分析了一下 第一個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=\"[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected]@[email protected] @[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected]@[email protected]@@[email protected]@[email protected]@@@[email protected]@[email protected]@@@@[email protected]@[email protected]@[email protected] @[email protected]@@@[email protected]@[email protected]@@[email protected]@@[email protected]@@[email protected]@[email protected]@[email protected]@@[email protected]@[email protected]@@[email protected]@@[email protected]@[email protected]@@[email protected]@@@@[email protected]@[email protected]@[email protected]@@[email protected]@@@[email protected][email protected]@@@@@[email protected]@@@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected]@\".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();
五 總結
本篇基本上就是爬蟲cookie實戰模擬終極篇,很實用,也很難,需要js功底,需要熟知原理構造。