python⽹络爬⾍系列(⼗⼀)——JS的解析
JS的解析
学习⽬标:
1. 了解 定位js的⽅法
2. 了解 添加断点观察js的执⾏过程的⽅法
3. 应⽤ js2py获取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的解释器,
3.2 js的执⾏思路
js的执⾏⽅式⼤致分为两种:
1. 在了解了js内容和执⾏顺序之后,通过python来完成js的执⾏过程,得到结果
2. 在了解了js内容和执⾏顺序之后,使⽤类似js2py的模块来执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","/livecell/rKey","",function(e){nail
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
}else
toast("公钥获取失败"),
t.rKey ="";
ajaxFunc("post","/livecell/ajax/clog", t,function(e){
var e =JSON.parse(e).logInfo;
0== e.code ? location.href = Item("url")||"":toast(e.msg ||"登录出错")
})
}):toast(e.msg)
})
}
从代码中我们知道:
1. 我们要登录需要对密码进⾏加密和获取rkey字段的值
2. rkey字段的值我们直接发送请求rkey请求就可以获得
3. 密码是先反转然后使⽤RSA进⾏加密, js代码很复杂, 我们希望能通过在python中执⾏js来实现
实现思路:
1. 使⽤session发送rKey获取登录需要信息
1. url: /livecell/rKey
2. ⽅法: get
2. 根据获取信息对密码进⾏加密
2.1 准备⽤户名和密码
fontcreator14版2.2 使⽤js2py⽣成js的执⾏环境:context
2.3 拷贝使⽤到js⽂件的内容到本项⽬中
2.4 读取js⽂件的内容,使⽤context来执⾏它们
2.5 向context环境中添加需要数据
2.6 使⽤context执⾏加密密码的js字符串
2.7 通过context获取加密后密码信息
3. 使⽤session发送登录请求
1.
2. 请求⽅法: POST
3. 数据:
phoneNum: xxxxxxx
password: (加密后⽣产的)
c1: 0
grep查上下50行日志rKey: rkey请求获取的
具体代码
需要提前下载⼏个js⽂件到本地:
BigInt.js
RSA.js
Barrett.js
import requests
wrappanel滚动条import json
import js2py
# - 实现思路:
# - 使⽤session发送rKey获取登录需要信息
# - url: /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 Safa ri/537.36",
"X-Requested-With":"XMLHttpRequest",
"Content-Type":"application/x-www-form-urlencoded"
}
# 设置session的请求头信息
# 设置session的请求头信息
session.headers = headers
response = ("/livecell/rKey")
# t.decode())
n = json.t)['data']
# - 根据获取信息对密码进⾏加密
# - 准备⽤户名和密码
phoneNum =""
password ="****"
# - 使⽤js2py⽣成js的执⾏环境:context
context = js2py.EvalJs()
# - 拷贝使⽤到js⽂件的内容到本项⽬中
python请求并解析json数据# - 读取js⽂件的内容,使⽤context来执⾏它们
with open("BigInt.js",'r', encoding='utf8')as f:
with open("RSA.js",'r', encoding='utf8')as f:
access ad())
with open("Barrett.js",'r', encoding='utf8')as f:
# - 向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获取加密后密码信息
# print(context.r)
password = context.r
# - 使⽤session发送登录请求
# - URL: /livecell/ajax/clog
# - 请求⽅法: POST
# - 数据:
# - phoneNum: 155********
# - password: (加密后⽣产的)
# - c1: 0
# - rKey: rkey请求获取的
data ={
'phoneNum':'',
'password': password,
'c1':0,
'rKey':n['rkey']
}
# print(session.headers)
response = session.post("/livecell/ajax/clog", data=data) t.decode())
# 访问登录的资源
response = ("/home#profile")
t.decode())
⼩结
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论