javascript
监听js变量的变化_JS监听事件型爬虫
點擊上方“Python數據科學”,選擇“星標公眾號”
關鍵時刻,第一時間送達!
作者:zuobangbang
來源:zuobangbang
最近開始研究網頁參數的JS加密,但是大型網站的JS文件過于繁雜,不適合新手上路,于是乎找了幾個簡單的網頁來學習學習。
首先要和大家聊的是監聽事件型爬蟲(推薦FireFox瀏覽器)。簡單介紹一下JS事件監聽:
JavaScript之事件概念和監聽事件
1、事件的概念:
JavaScript使我們有能力創建動態頁面,網頁中的每一個元素都可以產生某些觸發JavaScript函數的事件。我們可以認為事件是可以被JavaScript偵測到的一種行為。
2、事件流:
事件流主要分為冒泡型事件和捕獲型事件。IE瀏覽器目前只支持冒泡型事件,而支持標準DOM的瀏覽器比如火狐、Chrome等兩者都支持。
?3、使用返回值改變HTML元素的默認行為:
HTML元素大都包含了自己的默認行為,例如:超鏈接、提交按鈕等。我們可以通過在綁定事件中加上"return false"來阻止它的默認行為。
4、通用性的事件監聽方法:
(1)綁定HTML元素屬性:
(2)綁定DOM對象屬性:document.getElementById("xxx").οnclick=test;
(https://www.cnblogs.com/dorra/p/7349747.html)
目標網站:http://ac.scmor.com/
第一次寫js類的爬蟲,斷點調試過程寫詳細些。
鼠標點擊現在訪問時,會前往另一個網頁。用火狐瀏覽器打開,元素定位到“現在訪問”,可以看到下圖:網頁鏈接沒有出現在源代碼中,相反在標簽末尾有一個event;這代表當點擊“現在訪問”這個事件發生時,會被監聽并做出相應的反應。
點擊“event”,可以看到一個函數onclick(event),在這個函數里,還有一個visit()函數;這表示當點擊“現在訪問”發生時,會引發onclick(event)的發生,從而引發visit()函數。
全局搜索(ctrl+shift+f)搜索visit()可以看到下圖有一個function visit(url);這就是我們要找的函數啦。(這一步開始使用谷歌瀏覽器)
來分析一下這個函數:它的變量是url,也就是上圖中visit('QSQ7XggEHBUhXDxYLwIFHwh4ZRkwXFI0Pw4jGj5ZXlI=')的QSQ7XggEHBUhXDxYLwIFHwh4ZRkwXFI0Pw4jGj5ZXlI=
給它打斷點:
點擊“現在訪問”:此時url=QSQ7XggEHBUhXDxYLwIFHwh4ZRkwXFI0Pw4jGj5ZXlI=
不斷點擊(step over next function call),當走完strdecode()函數后,url更新為要訪問的頁面。下一步就是找到這個函數并分析。
找到的strdecode()函數如下:此時
string='QSQ7XggEHBUhXDxYLwIFHwh4ZRkwXFI0Pw4jGj5ZXlI='
再經過base64decode以后變成了一段亂碼:
重新打一次斷點:經過base64decode(code)后,返回需要的Url;至此所有的斷點調試就完成了。
這是base64decode函數的代碼,里面有一個base64DecodeChars的變量,在函數里是沒有定義的,因此后期自己加上。
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
}
還有一個問題,最開始visit()的自變量在哪里呢?網頁源代碼中都有的噢。一共16個鏡像對應16個變量。
找到了所有需要的js代碼,然后用python還原???不用自己找虐,python提供一個execjs的庫,可以直接調用js文件。一共15行代碼就可以獲得所需的網址啦。
if __name__ == '__main__':? ?url='http://ac.scmor.com/'
? ?headers={
? ? ? ?'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
? ?}
? ?html=requests.get(url,headers=headers).text
? ?soup=BeautifulSoup(html,'lxml')
? ?infs=soup.find('head').find_all('script',type='text/javascript')
? ?infs=re.findall(r'autourl(.*?);',str(infs))
? ?node = execjs.get()
? ?file = '谷歌學術鏡像.js'
? ?ctx = node.compile(open(file, encoding='utf-8').read())
? ?for inf in infs:
? ? ? ?data=inf.split('=',1)[1][2:-1]
? ? ? ?js='strdecode("{}") '.format(data)
? ? ? ?print(ctx.eval(js))
最后結果如下:
代碼以及Js文件上傳到GitHub(https://github.com/zuobangbang/javascript-decode/tree/master/google);覺得不錯就star/fork下;有興趣可以自己做一遍。
往期精彩推薦?
2019年,被高估的AI與數據科學該如何發展?
2018年原創精選文章匯總
大型裁員現場,究竟誰笑到了最后...
這一年我都做了些什么?
總結
以上是生活随笔為你收集整理的监听js变量的变化_JS监听事件型爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西风瘦马什么意思呢 怎么理解西风瘦马的意
- 下一篇: gradle idea java ssm