記一次Python3爬蟲利用pyppeteer得到網站js加密後的密文
分析的是一個航空網站,其實是我再找python執行js程式碼的資料的時候,發現了一個博主分析了這個網站的加密過程,然後我去跟著操作的時候,發現網站的加密部分程式碼發生了變化,不過在我不小心把網頁關了之後,我實在找不到那篇文章了。。。。。所以我再說一下整個的分析過程,不然我就可以只說一下後面不同的部分了
需要安裝pyppeteer、asyncio
pyppeteer中文教程:https://zhaoqize.github.io/puppeteer-api-zh_CN/#/class-Browser
第一次執行pyppeteer的時候會下載一些東西,很慢慢慢慢…,耐心等待!!!
今年新發布的requests-html這個很強的爬蟲庫,大家可以去看看,它裡面執行js程式碼的方法,就是利用的pyppeteer,我在用requests-html去執行的時候,總是報錯。。。。。。。。。
網站主頁:
首先,分析需要post的data,很明顯的,也就HashCode引數是經過加密的,接下來就去它的加密js程式碼吧 用關鍵詞HashCode搜尋,設定斷點,一步一步分析
這個encode加密函式的引數中,usercode暫時不清楚是不是固定的,其它引數都在下圖中進行了標註,其實在經過多次搜尋嘗試之後,得知usercode就是一個固定的引數,然後,再以encode為關鍵詞搜尋,去尋找這個加密函式
同樣的,設定斷點
點選搜尋航班,然後一步一步執行,允許encode函式這裡時,可以看到其中的引數e就是之前所提到的那些引數的和,證明這個encode確實是該加密函式
上圖中加密後返回的值與在第一張圖所顯示的HashCode值相同,整個加密過程結束,它的這個核心加密函式也就40行左右,至於其它的OO00、OOO0這些函式,我實在是沒找到,之前那個博主在分析這個網站的時候,還能找到,現在改變了,我找了它所有的js檔案,都沒找到那幾個函式,不過不重要,有這段核心加密程式碼就夠了,把這段程式碼複製到console中試試
下面是整個加密程式碼,可以看到,這段程式碼確實能夠讓我們得到正確的密文,那麼現在就是要怎麼用python去實現,這裡就要需要用到pyppeteer這個庫了,因為這段加密程式碼不是完整的,所以需要把這段程式碼嵌入瀏覽器中執行才能得到結果,而像js2y、pyv8、execjs這類庫,只能在本地執行js程式碼,沒有瀏覽器環境,所以用它們不能實現上述加密程式碼,下面給出其實現過程,很簡單,就幾行程式碼
把加密的js程式碼單獨儲存為一個py檔案
HashCode = '''
function encode(e) {
return window.OO00 = {
encode: function(e) {
var t, l, r, n, i, o;
for (e = utf16to8(e),
r = e.length,
l = 0,
t = ""; l < r; ) {
if (n = 255 & e.charCodeAt(l++),
l == r) {
t += a.charAt(n >> 2),
t += a.charAt((3 & n) << 4),
t += "==";
break
}
if (i = e.charCodeAt(l++),
l == r) {
t += a.charAt(n >> 2),
t += a.charAt((3 & n) << 4 | (240 & i) >> 4),
t += a.charAt((15 & i) << 2),
t += "=";
break
}
o = e.charCodeAt(l++),
t += a.charAt(n >> 2),
t += a.charAt((3 & n) << 4 | (240 & i) >> 4),
t += a.charAt((15 & i) << 2 | (192 & o) >> 6),
t += a.charAt(63 & o)
}
},
encodeHash: function() {
var e;
return e = OOO0.excess.indexOf("Chrome") >= 0 ? "[email protected]#$f3" : OOO0.excess.indexOf("Firefox") >= 0 ? "[email protected]" : "[email protected]@s2"
},
setCode: function() {
return "vxcasd#$asDG#$dwe"
}
},
OOOO.encode(e)
}
'''
下面是在python中實現的程式碼
from pyppeteer import launch
import asyncio
from jc_js import HashCode
async def get_hashcode(data):
browser = await launch()
page = await browser.newPage()
await page.goto('https://www.jcairlines.com/')
hashcode = await page.evaluate(HashCode,data)
await page.waitFor(10)
print('HashCode:',hashcode)
return hashcode
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(get_hashcode("CKGPNH2018-11-23sfeif#@%%"))
結果