JS逆向解析案例-巨潮证券市场数据库(python)
目標(biāo)網(wǎng)址:http://webapi.cninfo.com.cn/#/marketDataZhishu
這篇文章是用來對該網(wǎng)站進(jìn)行js解析用的,解析完后爬取數(shù)據(jù)操作可看這篇文章:Scrapy實(shí)戰(zhàn)案例--將股票數(shù)據(jù)存入SQL數(shù)據(jù)庫
解析重點(diǎn):
? ? 目標(biāo)網(wǎng)址在爬取時(shí)必須攜帶mcode參數(shù),否則會(huì)?出現(xiàn)無授權(quán)訪問報(bào)錯(cuò),而mcode刷新頻率較高,因此在爬取該網(wǎng)站前必須要先通過js逆向來獲取mcode參數(shù)。
正文開始:
1、先右鍵點(diǎn)擊審查元素,搜索網(wǎng)頁中需要爬取的數(shù)據(jù)(找出數(shù)據(jù)放在哪個(gè)包中)
?很明顯在第二個(gè)包中,點(diǎn)擊進(jìn)入,很明顯這個(gè)就是我們需要的數(shù)據(jù)
?2、找到mcode參數(shù)所在的位置
此時(shí)有三個(gè)包,我們不知道是哪一個(gè),我們再精準(zhǔn)點(diǎn)搜索給他加個(gè)英文字符冒號(hào)? 即“mcode:”?
?此時(shí)只有一個(gè)包了,我們點(diǎn)擊進(jìn)入,進(jìn)入后繼續(xù)搜索mcode發(fā)現(xiàn),符合條件的太多了
這里我們將路徑作為關(guān)鍵詞搜索試試?
?此時(shí)只剩下一個(gè)了,而且發(fā)現(xiàn)了mcode是通過indexcode.getResCode()函數(shù)所獲取的
?
?3、斷點(diǎn)調(diào)試
鼠標(biāo)左鍵單機(jī)46505這個(gè)數(shù)字,用來新建一個(gè)斷點(diǎn),建完后刷新一下頁面,此時(shí)會(huì)出現(xiàn)調(diào)試頁面。
??此時(shí)剛好就出現(xiàn)了mcode所調(diào)用的indexcode.getCode函數(shù),因此我們可以判斷此處是用來產(chǎn)生mcode的一個(gè)函數(shù)。上面所調(diào)用的missjson方法我們不知道是什么,也不需要知道是用來干什么的,將鼠標(biāo)停留在該函數(shù)處進(jìn)入其對應(yīng)的位置將其復(fù)制下來放在自己電腦的js文件里面。
4、寫入js文件
?將這部分全部復(fù)制,寫入到自己電腦的js文件中,注意:此處需要修改為下面這種格式,function必須要放在missjson前面(這與JavaScript的語法有關(guān))
?5、用python讀取js并調(diào)試
先觀察發(fā)現(xiàn)調(diào)用missjson需要先獲得time,獲得這個(gè)后我們可以通過execjs的call函數(shù)來傳入?yún)?shù)。
''' 通過這個(gè)函數(shù)獲取mcode var indexcode={getResCode:function(){var time=Math.floor(new Date().getTime()/1000);return window.JSonToCSV.missjson(""+time);} } '''獲取mcode代碼:
def get_mcode(): # '123.js'是用來放前面的js的with open('123.js','r',encoding='utf-8')as f:read_js=f.read()return_js=execjs.compile(read_js) ## 用來獲取time參數(shù)time1 = js2py.eval_js('Math.floor(new Date().getTime()/1000)')mcode = return_js.call('missjson','{}'.format(time1))print(mcode) if __name__ == '__main__':get_mcode()?6、開始爬取
總結(jié):先復(fù)制保存js相對應(yīng)函數(shù),再獲取mcode,再開始爬取數(shù)據(jù)
js代碼:
/* 通過這個(gè)函數(shù)獲取 var indexcode={getResCode:function(){var time=Math.floor(new Date().getTime()/1000);return window.JSonToCSV.missjson(""+time);} } 從這可以知道最終調(diào)用了.missjson(""+time) */ // 這里要將函數(shù)改一下格式 function missjson(input) {var keyStr = "ABCDEFGHIJKLMNOP" + "QRSTUVWXYZabcdef" + "ghijklmnopqrstuv" + "wxyz0123456789+/" + "=";var output = "";var chr1, chr2, chr3 = "";var enc1, enc2, enc3, enc4 = "";var i = 0;do {chr1 = input.charCodeAt(i++);chr2 = input.charCodeAt(i++);chr3 = input.charCodeAt(i++);enc1 = chr1 >> 2;enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);enc4 = chr3 & 63;if (isNaN(chr2)) {enc3 = enc4 = 64;} else if (isNaN(chr3)) {enc4 = 64;}output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2)+ keyStr.charAt(enc3) + keyStr.charAt(enc4);chr1 = chr2 = chr3 = "";enc1 = enc2 = enc3 = enc4 = "";} while (i < input.length);return output; }?python代碼:
# http://webapi.cninfo.com.cn/#/marketDataDate import requests import execjs import js2py def get_mcode():with open('123.js','r',encoding='utf-8')as f:read_js=f.read()return_js=execjs.compile(read_js) ## 用來獲取time參數(shù)time1 = js2py.eval_js('Math.floor(new Date().getTime()/1000)')mcode = return_js.call('missjson','{}'.format(time1))return mcodedef get_data(mcode):url = 'http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1007'headers = {'mcode': mcode,'Referer': 'http://webapi.cninfo.com.cn/',}params = {'tdate': '2022-04-12','market': 'SZE',}response = requests.get(url=url, headers=headers, params=params).textprint(response) if __name__ == '__main__':mcode = get_mcode()get_data(mcode)到這一步就對該網(wǎng)站解析完成了,后續(xù)用Scrapy爬取數(shù)據(jù),文章如下:Scrapy實(shí)戰(zhàn)案例--將股票數(shù)據(jù)存入SQL數(shù)據(jù)庫
總結(jié)
以上是生活随笔為你收集整理的JS逆向解析案例-巨潮证券市场数据库(python)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java获取本机的外网IP地址(亲测有效
- 下一篇: CKA