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 ...
随机推荐
- Centos搭建 Docker 环境
搭建 Docker 环境 安装与配置 Docker 安装 Docker Docker 软件包已经包括在默认的 CentOS-Extras 软件源里.因此想要安装 docker,只需要运行下面的 yum ...
- Istio实践(1)-环境搭建及应用部署
1. Istio简介 Istio是最初由IBM,Google和Lyft开发的服务网格的开源实现.它可以透明地分层到分布式应用程序上,并提供服务网格的所有优点,例如流量管理,安全性和可观察性. 它旨在与 ...
- 《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)
1.简介 自动化测试中如何输出日志文件.任何软件,都会涉及到日志输出.所以,在测试人员报bug,特别是崩溃的bug,一般都要提供软件产品的日志文件.开发通过看日志文件,知道这个崩溃产生的原因,至少知道 ...
- Selenium3自动化测试【27】Frame的操作
本篇文章内容摘要 " 讲解Python3+Selenium3如何处理Frame窗体" 同步视频知识与系列知识内容,可关注:[公众号]:柒哥测试:[WX]:Lee-890;[视频号] ...
- upsource 配置git仓库时的 rsa 问题
在使用 upsource 时,当 通过 SSH-key 需要配置一个 git 仓库代码时,在使用本机已有配置的 rsa 是出现无法连接的问题.这是需要看下具体的提示,如下图的显示 其实关键的地方看这个 ...
- ctx.createCircularGradient is not a function
正确 const grd = ctx.createCircularGradient(75, 50, 50) grd.addColorStop(0, 'red') grd ...
- Educational Codeforces Round 121 (Rated for Div. 2)——B - Minor Reduction
B - Minor Reduction 题源:https://codeforces.com/contest/1626/problem/B 题意 给定一个超级大的整数 x ,可以对任意相邻两位数进行操作 ...
- 从零开始,开发一个 Web Office 套件(15):拖动边框,平移编辑器
这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...
- 用 GraphScope 像 NetworkX 一样做图分析
NetworkX 是 Python 上最常用的图分析包,GraphScoep 兼容 NetworkX 接口.本文中我们将分享如何用 GraphScope 像 NetworkX 一样在(大)图上进行分析 ...
- WinForm中TextBox文本过长解决
方案1: 如果界面有足够的空间 可以使用Multiline属性设置多行 方案2: 可以使用文本框的MouseHover事件,触发弹窗,缺点需要按确定 private void txt_Fnote_M ...