python爬虫之JS逆向
Python爬虫之JS逆向案例
由于在爬取数据时,遇到请求头限制属性为动态生成,现将解决方式整理如下:
JS逆向有两种思路:
一种是整理出js文件在Python中直接使用execjs调用js文件(可见我的另一篇文章《 python爬虫之企某科技JS逆向》)。
一种是根据JS中的逻辑,使用Python重写相应的方法。
本文介绍的是第二种使用Python重写JS的方法
需求:爬取某区块链网站https://www.oklink.com/zh-cn/btc/tx-list?limit=20&pageNum=1数据
遇到的问题:目标网站的数据是通过ajax请求相应的接口获取数据,在请求头中需要携带x-apiKey(根据时间动态生成的),我们需要解决的就是整理出动态生成x-apiKey的方法。
解决思路:根据关键字"x-apiKey”在网站的JS中找到相应的定义,然后使用python重写方法,在请求接口时实时生成相应的x-apiKey
第一步:在浏览器中使用开发者工具找到相应的接口
请求地址:https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict?t=1654916647499&limit=20&offset=0
请求类型:GET
请求头:x-apiKey:
LWIzMWUtNDU0Ny05Mjk5LWI2ZDA3Yjc2MzFhYmEyYzkwM2NjfDI3NjYwMjc3NTg2MTAzNjk=

第二步:找到x-apiKey的定义方法
t.headers.common["x-apiKey"] = n.Z.getApiKey()

根据上面的代码中看到x-apiKey是由getApiKey这个方法返回的,通过getApiKey搜索找到相应的定义如下:

1.接下就是解析这个getApiKey方法了。
{
key: "getApiKey",
value: function() {
var t = (new Date).getTime()
, e = this.encryptApiKey();
return t = this.encryptTime(t),
this.comb(e, t)
}
}
1).变量t就是获取当前时间戳
2).变量e是调用encryptApiKey这个方法
3).变量t是encryptTime(t)这个方法处理后的返回
4).最后通过comb(e,t)个方法生成最终的apiKey
2.encryptTime方法
key: "encryptApiKey",
value: function() {
var t = this.API_KEY
, e = t.split("")
, r = e.splice(0, 8);
return e.concat(r).join("")
}
1).变量t是一个常量字符串API_KEY,往上找到初始化值为this.API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab"
2).变量e是将上面的t分隔成数组
3).变量r:从变量e中删除前8个字符串,并将e的前8个元素组成的数组赋值给r。同时变量e删除了前8个元素
4).最终将e和r合并在一起并转为字符串
3.encryptTime方法
key: "encryptTime",
value: function(t) {
var e = (1 * t + 1111111111111).toString().split("")
, r = parseInt(10 * Math.random(), 10)
, n = parseInt(10 * Math.random(), 10)
, o = parseInt(10 * Math.random(), 10);
return e.concat([r, n, o]).join("")
}
1).变量e为将入参t加上1111111111111然后转为字符串,分隔为数组
2).变量r、n、o三个是生成10以内的随机整数
3).最后返回的是e和[r,n,o]数组合并,转为字符串返回
4.comb方法
key: "comb",
value: function(t, e) {
var r = "".concat(t, "|").concat(e);
return window.btoa(r)
}
1).变量r是由入参t和e中间加上|然后拼在一起的
2).window.btoa是返回的base64加密编码
3)comb方法最终返回的就是我们需要的x-apiKey的值了
5.将上面的JS逻辑转为Python代码如下:
def get_api_key():
cur_time = int(time.time() * 1000)
api_key = 'a2c903cc-b31e-4547-9299-b6d07b7631ab'
key_1 = api_key[0:8]
key_2 = api_key[8:]
encrypt_api_key = key_2 + key_1
string = str(cur_time + 1111111111111)
r = random.randint(0, 9)
n = random.randint(0, 9)
o = random.randint(0, 9)
encrypt_time = '%s%s%s%s' % (string, r, n, o)
new_key = encrypt_api_key + '|' + encrypt_time
# 转为bytes-like object
new_key = new_key.encode('utf-8') # 将bytes-like object转成字符串类型
return str(base64.b64encode(new_key), encoding='utf-8')
至此,我们就得到了动态生成的x-apiKey,接下来继续操作吧。
python爬虫之JS逆向的更多相关文章
- python爬虫之JS逆向某易云音乐
Python爬虫之JS逆向采集某易云音乐网站 在获取音乐的详情信息时,遇到请求参数全为加密的情况,现解解决方案整理如下: JS逆向有两种思路: 一种是整理出js文件在Python中直接使用execjs ...
- Python爬虫—破解JS加密的Cookie
前言 在GitHub上维护了一个代理池的项目,代理来源是抓取一些免费的代理发布网站.上午有个小哥告诉我说有个代理抓取接口不能用了,返回状态521.抱着帮人解决问题的心态去跑了一遍代码.发现果真是这样. ...
- python爬虫:了解JS加密爬取网易云音乐
python爬虫:了解JS加密爬取网易云音乐 前言 大家好,我是"持之以恒_liu",之所以起这个名字,就是希望我自己无论做什么事,只要一开始选择了,那么就要坚持到底,不管结果如何 ...
- 我去!爬虫遇到JS逆向AES加密反爬,哭了
今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...
- Python爬虫之JS异步加载
一.判断异步加载方式(常用的JS库) 1. jQuery(70%) # 搜索 jquery 茅塞顿开 <script src="http://ajax.googleapis.com/a ...
- python爬虫执行js代码-execjs
一.安装模块 pip install PyExecJS execjs会自动使用当前电脑上的运行时环境(建议用nodejs,与Phantomjs) 二.简单的使用 import execjs js_ob ...
- 煎蛋网爬虫之JS逆向解析img路径
图片使用js onload事件加载 <p><img src="//img.jandan.net/img/blank.gif" onload="janda ...
- python爬虫之企某科技JS逆向
python爬虫简单js逆向案例在学习时需要用到数据,学习了python爬虫知识,但是在用爬虫程序的时候就遇到了问题.具体如下,在查看请求数据时发现返回的数据是加密的信息,现将处理过程记录如下,以便大 ...
- 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取
爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 目录 爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 1. js加密.js逆向:案例1 2. js加密.js逆向:案例2 3 ...
随机推荐
- Python入门-内置对象函数
1.callable() 查看函数知否可调用,可调用返回True,不可用返回False print("input函数:", callable(input)) #input函数: T ...
- Spring5-IOC底层原理
1.什么是IOC (1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 (2)使用IOC目的:为了降低耦合度 2.IOC底层原理 (1)xml解析.工厂模式.反射
- Flutter 打印日志封装及创建Live Templates快捷打印日志
只需要输入logi 就可出现以下代码 /// tag(类名.函数名)LogUtil.i(index, tag: '_MyHomePageState.onItemClick:');打印日志效果如下: 实 ...
- MDL锁
mdl锁的主要作用是用来维护表元数据的一致性.在表上有活动事务的时候,不可以对表元数据进行修改操作. 如果没有MDL锁的保护,那么session2可以直接执行,并导致session1出错. MDL锁是 ...
- 现代 CSS 解决方案:Modern CSS Reset
在早年间(其实也不是很早),写过几篇关于 CSS Reset 的文章 - reset.css 知多少. 详细描述了当时业界比较常用的,两个 CSS reset 方案:reset.css 与 Norma ...
- git版本时提示openssl ssl_read
1.右击git bash here 2.执行 git config --global http.sslVerify "false"
- Mozi.HttpEmbedded嵌入式Web服务器
Mozi.HttpEmbedded 嵌入式Web服务器 项目介绍 Mozi.HttpEmbedded是一个基于.Net构建的嵌入式Web服务器,为.Net App提供web服务功能. 嵌入式的目标不是 ...
- C# 一维数组如何快速实现数组元素的数据类型的转换?
一.场景假设 假设有一串字符串如下所示,字符串中的数字之间已用英文状态下的逗号隔开.要求用此字符串中的数字快速生成int类型的数组,且尽可能使用最少的代码量. string str = "1 ...
- bellman-ford 单源最短路问题 图解
核心思想:松弛操作 对于边(u,v),用dist(u)和(u,v)的和尝试更新dist(v): dist(v) = min(dist(v) , dist(u)+l(u,v) 注:dist(i)为源 ...
- 漫谈 HTTP 连接
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 本文首先会 HTTP 的特点和优缺点,然后会详细介绍 HTTP 长连接和短连接的连接管理,通过 ...