

Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey
source link: https://blog.51cto.com/cnca/5241350
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 <font color=red>621</font> 篇原创博客
⛳️ 实战场景
Python 反爬中有一大类,叫做字体反爬,核心的理论就是通过字体文件或者 CSS 偏移,实现加密逻辑,接下来的 10 篇博客,我们将搞定目前市场上各种典型的字体反爬场景,每一篇都涉及一个案例。
本次要采集的站点是:54yr55y855S15b2x
(Base64 加密)
站点地址为:https%3A%2F%2Fmaoyan.com%2Ffilms%2F522013
(URL 编码)
上述地址打开之后,用开发者工具选中某文字之后,会发现 Elements 中,无法从源码读取到数据,如下图所示。
类似的所有场景都属于字体编码系列,简单理解就是:
服务器源码,无法直接读取文字。
也可以用请求页面预览选项卡,判断是否为字体加密,当出现如下结论时,可以判断,其中数字信息,显示为方框。
⛳️ 系统分析
本以为直接进入字体加密解密逻辑,本案例就可以解决,但是当打开请求头之后,发现出现了一个请求参数 signKey
,而且还加密了,那解决字体反爬前,先解决这个加密问题吧。
打开控制台,直接检索 signKey
参数,发现只有一个文件所有涉及。
打开 common.js
文件之后,进行格式化,继续检索关键字。
直接将断点打在 688 行附近,然后刷新页面,等待断点请求。
当发现关键字 _0x371d
时,就知道,这里需要一点点扣 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 是一个数组,可以通过索引获取其中的字符串
a(_0x371d("0x158"));
("default");
随着代码的深入,发现了最核心 signKey 参数的加密位置,截图如下:
这就是一个大工程了,没有 1 个小时,无法翻译完毕。
我们先将核心的函数扣出来,然后一点点进行替换,核心未翻译代码如下所示
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 **
var _0x371d = function (x, d) {
return (x -= 0), _0x5827[x];
};
** _0x5827 **
var _0x5827 = ["parseJSON", "parseXML", "ajaxSettings", "ajaxSetup", "statusCode", "canceled", "success", "dataType", …………;
复制到编辑器中,直接好家伙,超过 7W 字了。
加密变量 a
var a = function (x, d) {
return (x -= 0), r[x];
};
加密变量 r
加密参数 d
了解上述几个值的取值方式,解决 signKey 就变得非常简单了。
除此之外,最简单的办法是直接将 common.js
文件搭建在本地,然后用 Python 去调用,直接就可以获取到对应的数据。
JS 代码在 Python 中执行,使用如下 Demo 即可实现。
import execjs
# 执行 JS 文件
js = "js 脚本内容"
ctx = execjs.compile(js)
x = {
'method': 'GET',
'channelId': 40011,
'sVersion': 1,
'type': 'object'
}
# 传入参数
n = ctx.call('翻译之后的加密函数名', x)
📣📣📣📣📣📣
右下角有个大拇指,点赞的漂亮加倍
Recommend
-
40
本来是不想起这么大而空的名字的,但是今天确实特别自闭,所以想来个刺激一点标题刺激一下自己,也刺激一下别人。 时至今日,距离上一篇blog更新已经过去快九个月了,距离我在MSRA实习已经快八个月了,这么一看好像我的blog是为...
-
21
前言 平时很少写总结性的文章,感觉还是需要阶段性总结一些可以串在一起的知识点,所以这次写了下。因为我写的内容主要在时序、时空预测这个方向,所以主要还是把rnn,lstm,gru,convlstm,convgru以及ST-LSTM...
-
23
十大排序算法串讲 各大编程语言为我们内置了sort函数用于排序,其效率要比我们自己实现的排序算法高效的多(元素为基本数据类型使用快速排序;元素为自定义数据类型使用归并排序;样本数量小使用插入排序;样本数量大先使用快...
-
14
目录 三、简单看下两阶段提交的流程 四、两阶段写日志用意? 五、加餐:sync_binlog = 1 问题 六、如何判断binlog和redolog是否达成了一致 七、两...
-
6
从事算法工作以来,涉猎过不少算法。有些算法被淘汰,有些如日中天,有些则退守在某些特定的领域中顽强地生存,并不断给算法工作者提供思想启发。自己的一个方向是算法在产业界的应用,一个很强烈的感受是即便新的算法层出不穷,真正在实践上有生...
-
12
快速串讲校招高频面试题——排序算法和复杂度
-
14
📢📢📢📢📢📢 💗 你正在阅读 【梦想橡皮擦】 的博客 👍 阅读完毕,可以点点小手赞一下 🌻 发现错误,直接评论区中指正吧 📆 橡皮擦的第 <font color=red>663</font> 篇原创博客
-
6
快速定位JVM内存泄漏或者溢出等问题。 面试基础题,加分项。
-
8
python爬虫-32-python字体反爬,网页看到的和实际下载的不一致(理论) 原创
-
9
LLM Inference串讲本文主要概述一下当前LLM 是如何生成文本及为什么对应的资源(cost/latency)与prompt 和completion 都有关系。generation上一篇我们讲了为了解决自然语言问题,我们引入了统计语言模型:S 表示一连串特定...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK