python网络爬虫系列(十一)——JS的解析
JS的解析
學習目標:
1 確定js的位置
對于前面人人網的案例,我們知道了url地址中有部分參數,但是參數是如何生成的呢?
毫無疑問,參數肯定是js生成的,那么如何獲取這些參數的規律呢?通過下面的學習來了解
1.1 觀察按鈕的綁定js事件
通過點擊按鈕,然后點擊Event Listener,部分網站可以找到綁定的事件,對應的,只需要點擊即可跳轉到js的位置
1.2 通過search all file 來搜索
部分網站的按鈕可能并沒有綁定js事件監聽,那么這個時候可以通過搜索請求中的關鍵字來找到js的位置,比如livecell
點擊美化輸出選項
可以繼續在其中搜索關鍵字
2 觀察js的執行過程
找到js的位置之后,我們可以來通過觀察js的位置,找到js具體在如何執行,后續我們可以通過python程序來模擬js的執行,或者是使用類似js2py直接把js代碼轉化為python程序去執行
觀察js的執行過程最簡單的方式是添加斷點
添加斷點的方式:在左邊行號點擊即可添加,對應的右邊BreakPoints中會出現現有的所有斷點
添加斷點之后繼續點擊登錄,每次程序在斷點位置都會停止,通過如果該行有變量產生,都會把變量的結果展示在Scoope中
在上圖的右上角有1,2,3三個功能,分別表示:
- 1:繼續執行到下一個斷點
- 2:進入調用的函數中
- 3:從調用的函數中跳出來
3 js2py的使用
在知道了js如何生成我們想要的數據之后,那么接下來我們就需要使用程序獲取js執行之后的結果了
3.1 js2py的介紹
js2py是一個js的翻譯工具,也是一個通過純python實現的js的解釋器,github上源碼與示例
3.2 js的執行思路
js的執行方式大致分為兩種:
但是在使用python程序實現js的執行時候,需要觀察的js的每一個步驟,非常麻煩,所以更多的時候我們會選擇使用類似js2py的模塊去執行js,接下來我們來使用js2py實現人人網登錄參數的獲取
3.3 具體的實現
定位進行登錄js代碼
formSubmit: function() {var e, t = {};$(".login").addEventListener("click", function() {t.phoneNum = $(".phonenum").value,t.password = $(".password").value,e = loginValidate(t),t.c1 = c1 || 0,e.flag ? ajaxFunc("get", "http://activity.renren.com/livecell/rKey", "", function(e) {var n = JSON.parse(e).data;if (0 == n.code) {t.password = t.password.split("").reverse().join(""),setMaxDigits(130);var o = new RSAKeyPair(n.e,"",n.n), r = encryptedString(o, t.password);t.password = r,t.rKey = n.rkey} elsetoast("公鑰獲取失敗"),t.rKey = "";ajaxFunc("post", "http://activity.renren.com/livecell/ajax/clog", t, function(e) {var e = JSON.parse(e).logInfo;0 == e.code ? location.href = localStorage.getItem("url") || "" : toast(e.msg || "登錄出錯")})}) : toast(e.msg)})}從代碼中我們知道:
實現思路:
使用session發送rKey獲取登錄需要信息
- url: http://activity.renren.com/livecell/rKey
- 方法: get
根據獲取信息對密碼進行加密
2.1 準備用戶名和密碼
2.2 使用js2py生成js的執行環境:context
2.3 拷貝使用到js文件的內容到本項目中
2.4 讀取js文件的內容,使用context來執行它們
2.5 向context環境中添加需要數據
2.6 使用context執行加密密碼的js字符串
2.7 通過context獲取加密后密碼信息
使用session發送登錄請求
-
URL: http://activity.renren.com/livecell/ajax/clog
-
請求方法: POST
-
數據:
phoneNum: xxxxxxx password: (加密后生產的) c1: 0 rKey: rkey請求獲取的
具體代碼
需要提前下載幾個js文件到本地:
BigInt.js
RSA.js
Barrett.js
import requests import json import js2py# - 實現思路: # - 使用session發送rKey獲取登錄需要信息 # - url: http://activity.renren.com/livecell/rKey # - 方法: get # 獲取session對象 session = requests.session() headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Mobile Safari/537.36","X-Requested-With": "XMLHttpRequest","Content-Type":"application/x-www-form-urlencoded" } # 設置session的請求頭信息 session.headers = headersresponse = session.get("http://activity.renren.com/livecell/rKey") # print(response.content.decode()) n = json.loads(response.content)['data']# - 根據獲取信息對密碼進行加密 # - 準備用戶名和密碼 phoneNum = "131..." password = "****" # - 使用js2py生成js的執行環境:context context = js2py.EvalJs() # - 拷貝使用到js文件的內容到本項目中 # - 讀取js文件的內容,使用context來執行它們 with open("BigInt.js", 'r', encoding='utf8') as f:context.execute(f.read())with open("RSA.js", 'r', encoding='utf8') as f:context.execute(f.read()) with open("Barrett.js", 'r', encoding='utf8') as f:context.execute(f.read())# - 向context環境中添加需要數據 context.t = {'password': password} context.n = n # - 執行加密密碼的js字符 js = '''t.password = t.password.split("").reverse().join(""),setMaxDigits(130);var o = new RSAKeyPair(n.e,"",n.n), r = encryptedString(o, t.password);''' context.execute(js) # - 通過context獲取加密后密碼信息 # print(context.r) password = context.r # - 使用session發送登錄請求 # - URL: http://activity.renren.com/livecell/ajax/clog # - 請求方法: POST # - 數據: # - phoneNum: 15565280933 # - password: (加密后生產的) # - c1: 0 # - rKey: rkey請求獲取的 data = {'phoneNum': '131....','password': password,'c1':0,'rKey':n['rkey'] }# print(session.headers) response = session.post("http://activity.renren.com/livecell/ajax/clog", data=data) print(response.content.decode())# 訪問登錄的資源 response = session.get("http://activity.renren.com/home#profile") print(response.content.decode())小結
- 需要準備js的內容
- 生成js的執行環境
- 在執行環境中執行js的字符串,傳入數據,獲取結果
【綜合案例】:有道翻譯
知識點:
1、python中的哈希處理:md5()
分析過程:進行抓包:
接下來通過search相關內容進行尋找:
運行結果:
總結
以上是生活随笔為你收集整理的python网络爬虫系列(十一)——JS的解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三、PHP基础——HTTP协议 文件编
- 下一篇: 一维条形码识别c语言_条形码的优点