关键字采集文章(10年产研经验,致力于Python相关技术栈传播⛳️博客)
优采云 发布时间: 2022-04-20 19:01关键字采集文章(10年产研经验,致力于Python相关技术栈传播⛳️博客)
你好!大家好,我是【Dream Eraser】,10年产研经验,致力于Python相关技术栈的传播
⛳️实战场景
本博客向您展示了一个 URL 加密示例,其中涉及 URL 地址更改。
您可以参考界面查看博客是否与您要访问的站点一致采集。
本案例的反爬场景如下图所示。直接阅读源码获取网站链接后,在浏览器中打开会出现403访问。
手动点击交易数据获取正确的路径地址。
此时梳理一下反爬逻辑:
列表页响应数据中的源代码,包括详情页地址,点击详情页链接,加密后跳转到新地址,无法直接访问原地址。
这样看,点击链接后的操作是我们解决反爬的突破口。
⛳️防爬解决方案
接下来我们按照上面的思路来寻找【问题解决方法】,因为是跳转加密逻辑,不是请求逻辑,所以它的加密逻辑必须在前端JS文件中实现(经验问题),此时我们可以根据网页元素事件绑定来跟踪加密逻辑。
在开发者工具中,直接查看DOM元素的所有事件,其中重点是点击操作(因为根据上面的分析,点击后跳转地址发生了变化。)
点击VM881:1后,直接跳转到JS代码页。格式化源码后发现很短。
而且可以直接找到加密逻辑,上面红框区域的内容。
var srcs = CryptoJS.enc.Utf8.parse(ccc);
var k = CryptoJS.enc.Utf8.parse(s);
var en = CryptoJS.AES.encrypt(srcs, k, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});
在开发者工具中写一段JS代码片段,直接用固定值测试。结果如下:
hh = "http://这个网址,你需要去浏览器里面复制一下/jyxxcggg/982990.jhtml";
var aa = hh.split("/");
var aaa = aa.length;
var bbb = aa[aaa - 1].split(".");
var ccc = bbb[0];
var cccc = bbb[1];
var r = /^\+?[1-9][0-9]*$/;
var ee = $(this).attr("target");
var srcs = CryptoJS.enc.Utf8.parse(ccc);
var k = CryptoJS.enc.Utf8.parse(s);
var en = CryptoJS.AES.encrypt(srcs, k, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});
var ddd = en.toString();
ddd = ddd.replace(/\//g, "^");
ddd = ddd.substring(0, ddd.length - 2);
var bbbb = ddd + "." + bbb[1];
aa[aaa - 1] = bbbb;
var uuu = "";
for (i = 0; i < aaa; i++) {
uuu += aa[i] + "/";
}
uuu = uuu.substring(0, uuu.length - 1);
console.log(uuu);
运行代码时,会在控制台输入一个编码的地址,在浏览器中会发现可以访问。这时候可以直接拿JS文件和CryptoJS文件在Python中执行JS。
您还可以在 Python 中执行代码审查。在写代码之前,还需要通过断点获取Key值,如下图。
加密形式为AES_ECB,所需参数如下:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
def encrypt_text(text, key):
aes = AES.new(key.encode('utf-8'), AES.MODE_ECB)
encrypt_str = aes.encrypt(pad(text.encode('utf-8'), AES.block_size, style='pkcs7'))
encrypt_str = str(base64.encodebytes(encrypt_str), encoding='utf-8')
return encrypt_str
if __name__ == '__main__':
key = 'qnbyzzwmdgghmcnm'
es = encrypt_text("982990", key)
print(es)
翻译JS加密后的其余代码
if __name__ == '__main__':
key = 'qnbyzzwmdgghmcnm'
es = encrypt_text("982990", key)
es = es.replace("\n", "") # 去掉后面的换行
es = es.replace('/', '^')[:-2] # 去掉最后的 ==
print(es) # A7be7quQ^oQeeaGMXNfArg
至此,您已经计算出最终结果。希望这篇文章能给你带来一种新的反爬技术。
如果您发现本文有错误,请在评论区更正