Python全栈开发-Python爬虫-09 JS逆向入门

1. JavaScript反爬虫原理及原因

爬虫与网站安全,一个是矛,一个是盾。

你网站安全与否?

  • 第一看安全措施是否到位,
  • 第二,还得看数据价值是否会勾引到“爬虫”的注意。也就是说,除非没有爬虫盯上你的数据,否则反爬措施你必须步步到位!

2. Python调用JavaScript执行代码

PyExecJS库:

简介:

这个库主要是将 js 代码运行在本地的 js 环境中

优点

  • 有多种 js环境的选择,官方推荐了 PyV8、Node.js、PhantomJS、Nashorn 四种

缺点:

  • 必须安装一种环境导致不是很轻量,而且调用时有一个启动环境过程,还是有明显缓慢的。

安装:

  • 先安装好本地的js环境。推荐安装node.js,安装简单,执行效率也很不错
  • pip install PyExecJS
>>> import execjs
# 实例化
>>> execjs.get().name  # 查看调用的环境
'Node.js (V8)'
>>> ctx = execjs.compile(
"""  # 执行 JS 语句
     function add(x, y) {
         return x + y;
     }
"""
)
>>> ctx.call("add", 1, 2)#调用函数,传递参数
3
>>> with open('./test.js') as f:  # 执行 JS 文件
...     ctx = execjs.compile(f.read())
...     ctx.call('add', 1, 2)

PyV8

  • 这是 Google 官方将 Chrome V8 引擎用 Python 封装的库

  • PyExecJS 相比,这个库很轻量,不需要额外装 JS 环境,因为 V8 本身就是环境

  • 同时也因为不需要启动外部环境,执行速度很快。

  • 安装 : 在这里下载对应系统的二进制文件:emmetio/pyv8-binaries

    >>> import PyV8  # 注意大小写
    >>> with PyV8.JSContext() as ctx:
    ...     ctx.eval("""
    ...         function add(x, y) {
    ...             return x + y;
    ...         }
    ...     """)
    ...     ctx.locals.add(1, 2)
    

3. 定位加密数据

面对js代码混淆和加密,我们在进行js逆向分析中,需要能够定位到所需数据存在的js文件中的具体位置。大致思路流程如下:

  • 控制台中,通过ctrl + shift +F先进行全局搜索目标关键字;

  • 在众多搜索结果中一一检索目标关键字所在的js文件路径,一般在source资源中检索;

  • 检索到目标关键字所在的js文件后,格式化查看该js代码;

  • js文件内ctrl + F检索到关键字位置,分析其上下文代码;

  • 如果引用到其他的参数或函数,则继续搜索对应关键字;

  • 直至找到目标数据的加密算法——通常对应某一个函数或某一个函数的内的某一部分功能实现。

数据的编码与加密

base64编码
  • Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。

  • Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

  • Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本

  • 是网络上最常见的

用Python实现base64编解码
编码
import base64
a = 'HC'.decode() #将‘HC’转为二进制
b = base64.b64encode(a) #将a转为base64编码
b.decode() #从二进制转回
  
base64.b64encode('HC'.encode()).decode() #简写'SEM=
解码
base64.b64decode('SEM=').decode()
'HC'
MD5加密算法

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

Python处理MD5加密
# 由于MD5模块在python3中被移除
# 在python3中使用hashlib模块进行md5操作

import hashlib

# 待加密信息
str = 'this is a md5 test.'

# 创建md5对象
m = hashlib.md5()


# Tips
# 此处必须encode
# 若写法为m.update(str)  报错为: Unicode-objects must be encoded before hashing
# 因为python3里默认的str是unicode
# 或者 b = bytes(str, encoding='utf-8'),作用相同,都是encode为bytes
b = str.encode(encoding='utf-8')
m.update(b)
str_md5 = m.hexdigest()

print('MD5加密前为 :' + str)
print('MD5加密后为 :' + str_md5)

# 另一种写法:b‘’前缀代表的就是bytes
str_md5 = hashlib.md5(b'this is a md5 test.').hexdigest()
print('MD5加密后为 :' + str_md5)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值