关键字采集文章(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

  至此,您已经计算出最终结果。希望这篇文章能给你带来一种新的反爬技术。

  如果您发现本文有错误,请在评论区更正

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线