【首发】Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey
theme: vue-pro
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情。
⛳️ 实战场景
Python 反爬中有一大类,叫做字体反爬,核心的理论就是通过字体文件或者 CSS 偏移,实现加密逻辑,接下来的 10 篇博客,我们将搞定目前市场上各种典型的字体反爬场景,每一篇都涉及一个案例。
本次要采集的站点是:54yr55y855S15b2x
(Base64 加密)
站点地址为:https%3A%2F%2Fmaoyan.com%2Ffilms%2F522013
(URL 编码)
上述地址打开之后,用开发者工具选中某文字之后,会发现 Elements 中,无法从源码读取到数据,如下图所示。
类似的所有场景都属于字体编码系列,简单理解就是:
服务器源码,无法直接读取文字。
也可以用请求页面预览选项卡,判断是否为字体加密,当出现如下结论时,可以判断,其中数字信息,显示为方框。
⛳️ 系统分析
本以为直接进入字体加密解密逻辑,本案例就可以解决,但是当打开请求头之后,发现出现了一个请求参数 signKey
,而且还加密了,那解决字体反爬前,先解决这个加密问题吧。
打开控制台,直接检索 signKey
参数,发现只有一个文件所有涉及。
打开 common.js
文件之后,进行格式化,继续检索关键字。
直接将断点打在 688 行附近,然后刷新页面,等待断点请求。
当发现关键字 _0x371d
时,就知道,这里需要一点点扣 JS 代码了,又是一个细致活。
待提取的 JS 代码如下所示:
js
u = function(x) {
var d = x[a(_0x371d("0x14c"))]
, e = x[a(_0x371d("0x14d"))]
, _ = x[a(_0x371d("0x14e"))]
, t = void 0 === _ ? 1 : _
, n = Math[a("0x82")](10 * Math[a(_0x371d("0x14f"))]())
, i = (new Date)[a(_0x371d("0x150"))]()
, o = typeof window !== a("0x4") && window[_0x371d("0x151")]
, s = o[a(_0x371d("0x152"))]
, u = a(_0x371d("0x153")) + d.toUpperCase() + a("0x87") + i + a(_0x371d("0x154")) + s + _0x371d("0x155") + n + a("0x89") + e + a(_0x371d("0x156")) + t
, f = a(_0x371d("0x157"));
return {
timeStamp: i,
index: n,
signKey: (0,
r[a(_0x371d("0x158"))])(u + f),
channelId: e,
sVersion: t,
webdriver: c()
}
每次页面刷新的时候,都可以捕获一下相关参数与值。
例如,这里可以直接得到 d = "GET"
,写入到我们的 JS 文件即可。
第一步加密之后,得到各个参数值,其中 u
与 f
比较重要。
通过每次断点,可以依次将代码逐步还原。
下述是一些比较重要的步骤,如果路径不清楚,可以点击下面卡片,直接询问橡皮擦。
获取 f 值
获取 _0x5827 函数内容
下述内容 r 是一个数组,可以通过索引获取其中的字符串
js
a(_0x371d("0x158"));
("default");
随着代码的深入,发现了最核心 signKey 参数的加密位置,截图如下:
这就是一个大工程了,没有 1 个小时,无法翻译完毕。
我们先将核心的函数扣出来,然后一点点进行替换,核心未翻译代码如下所示
js
function() {
var d = e(7)
这里面好多代码
, v = u
, M = f;
s = m(s, c, u, f, i[l + 0], 7, -680876936),
f = m(f, s, c, u, i[l + 1], 12, -389564586),
u = m(u, f, s, c, i[l + 2], 17, 606105819),
c = m(c, u, f, s, i[l + 3], 22, -1044525330),
这里面好多代码
}()
翻译的时候,关注几个重点参数即可。 _0x371d
js
var _0x371d = function (x, d) {
return (x -= 0), _0x5827[x];
};
_0x5827
js
var _0x5827 = ["parseJSON", "parseXML", "ajaxSettings", "ajaxSetup", "statusCode", "canceled", "success", "dataType", …………;
复制到编辑器中,直接好家伙,超过 7W 字了。
加密变量 a
js
var a = function (x, d) {
return (x -= 0), r[x];
};
加密变量 r
加密参数 d
了解上述几个值的取值方式,解决 signKey 就变得非常简单了。
除此之外,最简单的办法是直接将 common.js
文件搭建在本地,然后用 Python 去调用,直接就可以获取到对应的数据。
JS 代码在 Python 中执行,使用如下 Demo 即可实现。
```python import execjs
执行 JS 文件
js = "js 脚本内容" ctx = execjs.compile(js) x = { 'method': 'GET', 'channelId': 40011, 'sVersion': 1, 'type': 'object' }
传入参数
n = ctx.call('翻译之后的加密函数名', x) ```
📣📣📣📣📣📣 右下角有个大拇指,点赞的漂亮加倍
- 嗨,各位Python程序员,放弃selenium,试试年轻的Playwright如何?
- 09年的老电脑说想看一下CPU温度,作为Python工程师,怎能安装X大师?
- 如果你需要用Python搞个二维码,那应该收藏这篇博客
- 写给Python社群的第2课:Python逻辑语句,天天要写的 if 和 while
- 嗨,程序员,你知道高级工程师用的搜索引擎吗?
- 都2022年了,Python Web框架你不会只知道Django和Flask吧?
- 在座的Python爬虫工程师,你敢爬律师事务所站点吗?
- Python爬虫反爬,你应该从这篇博客开启,UA反爬,Cookie 特定参数反爬
- OpenGauss数据库在 CentOS 上的实践,配置篇
- 【Python技能树共建】动态渲染页面爬取
- 【Python技能树共建】Beautiful Soup
- 【首发字体反爬】猫X眼YingShi,我们又来欺负你了,用到了 OCR 识别技术
- 【首发】某易跟帖篇频道,接口溯源分析,反爬新技巧,必掌握一下
- 【首发】Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey
- 【首发】写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社
- 虎牙直播数据采集,为数据分析做储备,Python爬虫120例之第24例
- 我们的骄傲!非遗数据采集,来自官方的数据,Python爬虫无所不爬
- 3天掌握Flask开发项目系列博客之二,操作数据库
- 写给Python社群的第1课:初识Python,开篇知识点就选字符串吧~
- 升级【爸爸程序员】了?用Python给自己的宝贝下载200 绘本动画吧!