記錄openlaw的反爬

地址:http://openlaw.cn/login.jsp

須要登錄,找到Form datahtml

 

根據提交數據能夠知道須要找到_csrf和加密後的password,_csrf由服務器生成,在登錄頁面node

接下來找加密password的js代碼,ctrl+F搜索password,能夠看出password在加密後從新填入input再提交python

找到加密函數KeyEncryptweb

複製到snippets調試,調用了JSEncrypt,CryptoJs,繼續搜索spring

 

全都複製加到snippets裏執行chrome

這樣就得到了加密passwoed的js代碼,接下來須要讓這段代碼在python裏執行,能夠用execjs和js2py,推薦用execjs瀏覽器

把snippets的代碼複製出來另存爲js,用execjs執行服務器

要注意運行時環境,若是是node.js或Jscript都會報錯:navigator is not define,nodejs和Jscript都不是瀏覽器,能夠用PhantomJS。cookie

#運行時環境設置
import
execjs import execjs.runtime_names os.environ["EXECJS_RUNTIME"] = "PhantomJS" PhantomJS = execjs.get(execjs.runtime_names.PhantomJS) print(execjs.get().name)

js文件路徑前要加r,加密密碼結果如圖session

由於csfr和post data在兩頁,因此須要一塊兒運行

#獲取csfr
headers={ "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", "Accept-Encoding":"gzip,deflate", "Accept-Language":"zh-CN,zh;q=0.9", "Cache-Control":"max-age=0", "Connection":"keep-alive", "Content-Type":"application/x-www-form-urlencoded", "Host":"openlaw.cn", "Upgrade-Insecure-Requests":"1", "User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/73.0.3683.86Safari/537.36", } r=session.get("http://openlaw.cn/login.jsp?",headers=headers1) tree=etree.HTML(r.text) csrf=tree.xpath('//input[@name="_csrf"]/@value')[0]

#post form data post_url
="http://openlaw.cn/login" with open(r"C:\Users\37576\Desktop\123.js",encoding="utf-8")as f: js=f.read() ctx = execjs.compile(js) pwd=ctx.call("keyEncrypt","XXXXXXXX")#密碼 data={ "_csrf":csrf, "username":"#########",#帳戶 "password":pwd, "_spring_security_remember_me":"true", } res=session.post(post_url,data=data,headers=headers)

 tree=etree.HTML(res.text)
 lala=tree.xpath('//div[@class="bbp-user-section"]//text()')

登錄成功

 

接下來分析抓取頁面

url="http://openlaw.cn/guidance/16444eba67afe97881fa6521d333ef10"
headers1={
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"Accept-Encoding":"gzip,deflate",
"Accept-Language":"zh-CN,zh;q=0.9",
"Connection":"keep-alive",
"Host":"openlaw.cn",
"Upgrade-Insecure-Requests":"1",
"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/73.0.3683.86Safari/537.36",
}
a=session.get(url,headers=headers1)

抓取結果全是亂碼

用火狐瀏覽器抓包分析

第一頁與剛纔抓到的頁面同樣,第二頁有數據,在第一頁面下面

對比分析發現請求地址同樣,但cookie不同,參考資料瞭解到是js加密cookie,帶新cookie的請求才能顯示正確頁面,因此須要找到添加cookie的js代碼

 

查資料得知下面這種加密叫jjencode,jjencodeDemo地址:http://utf-8.jp/public/jjencode.html

],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[
#這種加密叫jsfunk,地址是:http://www.jsfuck.com/
+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]

下面是aaencode,地址是http://utf-8.jp/public/aaencode.html

゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ [ ' _ ']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: ' _ ' ,゚ω゚ノ : ((゚ω゚ノ==3) + ' _ ') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ ' _ ')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) + ' _ ')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) + ' _ ') [c^_^o];(゚Д゚) [ ' c '] = ((゚Д゚)+ ' _ ') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];

加密原理百度

代碼在能夠執行得到內容或者找工具解密成明文

(function anonymous() {
    if (window.wp1) {
        document.cookie = 'OPEN_E4C0C08491=' + wp3;
        document.cookie = 'OPEN_ID=B32pJOwfO/AJZJ3ZGmnunQNTaUie84jnyHoNCq/onZQ='
    }
}
)

代碼有添加cookie,第二行拉出來單獨執行

有報錯但獲得瞭解析後的代碼

頁面上因此js代碼以下:

var wp1 = 'xKIOt5jUZQcS8wurcX4lghwlET9K0IWBUsS3ZqmSamCBTAPg7Fl5sVr443dyK42p';
var wp2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var wp3 = "548545fe3ced4f3494934e537e304705";
var wp4 = "464acf618bf62df3e7e37e80c2c1a04d";
var wp5 = "0aa9566c4aa30883e34d0e1a530bf508";
var wp6 = "a8f49232d343e4b94ff7958088fa6734";
var wp7 = "82f778b45a9fce8589105c852174947b";
var wp8 = "3221d819c9b96d2631d0b5084c736f69";
if (window.wp1) {
        document.cookie = 'OPEN_E4C0C08491=' + wp3;
        document.cookie = 'OPEN_ID=B32pJOwfO/AJZJ3ZGmnunQNTaUie84jnyHoNCq/onZQ='
    }

var getGlobal = function() {
        if (typeof self !== '') {
            return self
        }
        ;if (typeof window !== '') {
            return window
        }
        ;if (typeof global !== '') {
            return global
        }
        ;throw new Error('unable to locate global object')
    };
function _process(s) {
        var result = s.substring(5, 7).concat('s').concat(s.substring(14, 15)).concat('v').concat(s.substring(9, 13)).concat('g').concat(s.substring(5)).concat('l').concat(s.substring(11, 19));
        return result.substr(0, 32);
    }
    ;var _switch = false;
    if ((getGlobal() === window)) {
        _switch = true
    } else {
        _switch = false
    };
document.cookie
= 'SIGNIN_ID=3e2291010f36c9244c633aba4cdcdd42'; document.cookie = 'SIGNIN_UC=9e65d8fc646e49fb7a0f9f8237915bfb'; document.cookie = 'UNDEFINED=432e9111ecf89746f3046ca970814f41'; if (_switch) { document.cookie = 'OPEN_589D5869B5=' + _process(wp3); setTimeout("location.reload();", 100); }

有六條cookie修改完後經過location.reload()刷新頁面,帶着新cookie刷新後的頁面能訪問到有數據的頁面

接下來須要把js代碼拉出來執行得到cookie,可是有一點問題就是cookie數據:OPEN_E4C0C08491,OPEN_ID,SIGNIN_ID,UNDEFINED,OPEN_589D5869B5不知道從哪裏來的,找了好久都沒找到

沒有這些數據就沒辦法寫cookie,就此卡住。。。等水平提升再來解決

 

爲了獲取頁面數據,下面用selenium解決該問題

#配置chorme無頭瀏覽器
from
selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('--headless') driver = webdriver.Chrome(chrome_options=chrome_options,executable_path = 'D:\python\chromedriver.exe') from time import sleep
#登錄帳號
driver.get("http://openlaw.cn/login.jsp?logout") driver.find_element_by_id("username").send_keys("XXXXXXXXX") driver.find_element_by_id("password").send_keys("XXXXXXXXX") sleep(2) driver.find_element_by_id("submit").click()
#獲取頁面數據
driver.get("http://openlaw.cn/guidance/167ce490ba94c3ed26baab5689fdd620") sleep(2) title=driver.find_element_by_xpath('//h1[@class="entry-title"]').text guid=driver.find_element_by_xpath('//div[@class="annotator-wrapper"]/p').text content=driver.find_element_by_xpath('//div[@class="annotator-wrapper"]/p[2]').text page_detail={"title":title,"content":guid+"\n"+content.replace("\u3000"," ")}

結果

小結

1.RSA學習地址:http://www.javashuo.com/article/p-herbvlmp-gx.html

2.用代理或訪問頻率異常會頻繁出現驗證碼

3.訪問有資源的網頁時服務器會驗證cookie,若是不帶有特定cookie訪問,網頁會轉到空白頁執行js代碼添加cookie,而後302或reload帶着新cookie從新請求出有數據的頁面

4.常見的js混淆方式

5.還不熟練js調試用法,等水平提升繼續破解該反爬

相關文章
相關標籤/搜索