學術搜尋
學習理論的知識少不了去檢索文獻,好多文獻為你的實操提供了合理的支撐,我所在的大學內網預設是有知網賬戶的,非常NICE
今天要完成的網站是 ac.scmor.com/
Google學術搜尋是一個文獻檢索服務,目前主要是提供維普資訊、萬方資料等幾個學術文獻資源庫的檢索服務。通過Google學術搜尋只能夠查詢到這些學術資料的“報告、摘要及引用內容... 來源百度百科
我們的目標
獲取現在訪問的連結地址,當你使用谷歌瀏覽器的開發者工具抓取的時候,得到的是一個js加密函式
注意看上圖2
的位置,接下來,我們採用上篇部落格的方式,去嘗試獲取visit函式的具體內容
我們要在所有的請求連結中去檢索一個visit方法,注意步驟
雙擊方法名,進入找到核心方法
function visit(url) {
var newTab = window.open('about:blank');
if(Gword!='') url = strdecode(url);
// var newTab = window.open(url);
newTab.location.href = url;
//newTab.location.reload(true);
}
複製程式碼
發現url在跳轉前呼叫了一個strdecode
函式,你只需要關注這個函式的實現就可以了
再次檢視visit的呼叫函式,找到引數的生成方式為
onclick="visit(\'' + autourl[b] + '\')"
複製程式碼
對autourl[b]
我們是可以直接用爬蟲在HTML頁面獲取到的
function auto(b) {
t = (tim - ts[b]) / 100;
tt = t.toString().split('.');
if(tt.length==1) t = t.toString() + '.00';
else if(tt[1].length < 2) t = t.toString() + '0';
if (t > 4) document.getElementById("txt" + b).innerHTML = '<font color=red>連線超時!<\/font>';
else document.getElementById("txt" + b).innerHTML = 'takes ' + t + 's. <a href="javascript:;" class="ok" onclick="visit(\'' + autourl[b] + '\')"> 現在訪問 <\/a>'
}
function visit(url) {
var newTab = window.open('about:blank');
if(Gword!='') url = strdecode(url);
// var newTab = window.open(url);
newTab.location.href = url;
//newTab.location.reload(true);
}
複製程式碼
引數分析
if(Gword!='') url = strdecode(url);
如果Gword
為空,呼叫的是strdecode
方法,查閱之後,發現相關程式碼也在下面
Gword 在上面的一張圖片中我們也已經獲取到了,可以向上看
strdecode函式分析
- 進行base64編碼
- 通過
Gword
生成一個key - 計算key的len
- 迴圈string然後將code生成,這個地方注意js裡面的fromCharCode函式(Python裡面的chr)和charCodeAt函式(Python裡面的ord)
//code
function strdecode(string) {
string = base64decode(string);
key = Gword+'ok ';
len = key.length;
code = '';
for (i = 0; i < string.length; i++) {
var k = i % len;
code += String.fromCharCode(string.charCodeAt(i) ^ key.charCodeAt(k))
}
return base64decode(code)
}
var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
function base64decode(str) {
var c1, c2, c3, c4;
var i, len, out;
len = str.length;
i = 0;
out = "";
while (i < len) {
do {
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]
} while (i < len && c1 == -1);
if (c1 == -1) break;
do {
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]
} while (i < len && c2 == -1);
if (c2 == -1) break;
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
do {
c3 = str.charCodeAt(i++) & 0xff;
if (c3 == 61) return out;
c3 = base64DecodeChars[c3]
} while (i < len && c3 == -1);
if (c3 == -1) break;
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
do {
c4 = str.charCodeAt(i++) & 0xff;
if (c4 == 61) return out;
c4 = base64DecodeChars[c4]
} while (i < len && c4 == -1);
if (c4 == -1) break;
out += String.fromCharCode(((c3 & 0x03) << 6) | c4)
}
return out
}
複製程式碼
這個地方有2個解決方案了
- 1是用Python重寫編寫相關邏輯
- 2通過Python呼叫JS直接實現
我們採用方案2 將 base64decode
複製到一個檔案中,然後通過execjs
進行呼叫
Python 執行JS庫 execjs
execjs可以在python中執行javascript程式碼
安裝:pip install PyExecJS
可以切換清華源
安裝成功之後在pycharm中引入一下,不出錯誤,表示執行成功
我們對JS進行編譯import execjs
with open('scmor.js', 'r', encoding='utf-8') as f:
js = f.read()
ctx = execjs.compile(js) # 對JS進行編譯
複製程式碼
核心的方法
def decode(string):
string = ctx.call('base64decode', string) # base64解碼string引數,string引數上面獲取到的autourls裡面的值
key = " link@scmor.comok " # Gword的值+ 'ok ' key 在HTML頁面中可以獲取到
Len = len(key) # Gword長度
code = ''
for i in range(0, len(string)):
k = i % Len
n = ord(str(string[i])) ^ ord(str(key[k]))
code += chr(n)
return ctx.call('base64decode', code)
複製程式碼
執行結果展示
完整程式碼下載
關注微信公眾賬號:非本科程式設計師,回覆0402獲取下載地址