记一次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去执行的时候,总是报错。。。。。。。。。
网站主页:https://www.jcairlines.com/
最终需要Post的链接: https://www.jcairlines.com/TicketSale/FlightQuery/QuerySeat

首先,分析需要post的data,很明显的,也就HashCode参数是经过加密的,接下来就去它的加密js代码吧
记一次Python3爬虫利用pyppeteer得到网站js加密后的密文_第1张图片
用关键词HashCode搜索,设置断点,一步一步分析
记一次Python3爬虫利用pyppeteer得到网站js加密后的密文_第2张图片

这个encode加密函数的参数中,usercode暂时不清楚是不是固定的,其它参数都在下图中进行了标注,其实在经过多次搜索尝试之后,得知usercode就是一个固定的参数,然后,再以encode为关键词搜索,去寻找这个加密函数
记一次Python3爬虫利用pyppeteer得到网站js加密后的密文_第3张图片
记一次Python3爬虫利用pyppeteer得到网站js加密后的密文_第4张图片

同样的,设置断点
记一次Python3爬虫利用pyppeteer得到网站js加密后的密文_第5张图片

点击搜索航班,然后一步一步运行,允许encode函数这里时,可以看到其中的参数e就是之前所提到的那些参数的和,证明这个encode确实是该加密函数
记一次Python3爬虫利用pyppeteer得到网站js加密后的密文_第6张图片

上图中加密后返回的值与在第一张图所显示的HashCode值相同,整个加密过程结束,它的这个核心加密函数也就40行左右,至于其它的OO00、OOO0这些函数,我实在是没找到,之前那个博主在分析这个网站的时候,还能找到,现在改变了,我找了它所有的js文件,都没找到那几个函数,不过不重要,有这段核心加密代码就够了,把这段代码复制到console中试试
记一次Python3爬虫利用pyppeteer得到网站js加密后的密文_第7张图片

下面是整个加密代码,可以看到,这段代码确实能够让我们得到正确的密文,那么现在就是要怎么用python去实现,这里就要需要用到pyppeteer这个库了,因为这段加密代码不是完整的,所以需要把这段代码嵌入浏览器中执行才能得到结果,而像js2y、pyv8、execjs这类库,只能在本地执行js代码,没有浏览器环境,所以用它们不能实现上述加密代码,下面给出其实现过程,很简单,就几行代码

记一次Python3爬虫利用pyppeteer得到网站js加密后的密文_第8张图片
记一次Python3爬虫利用pyppeteer得到网站js加密后的密文_第9张图片

把加密的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 ? "cv3sdf@#$f3" : OOO0.excess.indexOf("Firefox") >= 0 ? "df23Sc@sS" : "vdf@s4df9sd@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#@%%"))

结果
在这里插入图片描述

你可能感兴趣的:(记一次Python3爬虫利用pyppeteer得到网站js加密后的密文)