【Python3爬虫】常见反爬虫措施及解决办法(三)

一、全网代理IP的JS混淆

首先进入全网代理IP,打开开发者工具,点击查看端口号,看起来貌似没有什么问题:

想要学习Python?Python学习交流群:683380553满足你的需求,资料都已经上传群文件流,可以自行下载!

如果你已经爬取过这个网站的代理,你就会知道事情并非这么简单。如果没爬过呢?也很简单,点击鼠标右键然后查看网页源代码,搜索”port“,可以找到如下内容:

很明显这不是网页上显示的端口号了,那我们要怎么才能得到真正的端口号呢?

解决办法:

首先需要找到一个JS文件:http://www.goubanjia.com/theme/goubanjia/javascript/pde.js?v=1.0,点开后可以看到如下内容:

这么复杂的JS代码看得人头都大了,不过我们发现这个JS代码是一个eval函数,那我们能不能把它解码一下呢?这时候你需要一个工具--脚本之家在线工具,把这些JS代码复制进去:

 然后点击解码:

还是一个eval函数,所以再次解码:

到这一步,已经比最开始的代码简洁多了,但是还易读性还是很差,所以我们需要先格式化一下:

var _$ = [

"\x2e\x70\x6f\x72\x74",

"\x65\x61\x63\x68",

"\x68\x74\x6d\x6c",

"\x69\x6e\x64\x65\x78\x4f\x66",

"\x2a",

"\x61\x74\x74\x72",

"\x63\x6c\x61\x73\x73",

"\x73\x70\x6c\x69\x74",

"\x20",

"",

"\x6c\x65\x6e\x67\x74\x68",

"\x70\x75\x73\x68",

"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x5a",

"\x70\x61\x72\x73\x65\x49\x6e\x74",

"\x6a\x6f\x69\x6e",

""

];

$(function() {

$(_$[0])[_$[1]](function() {

var a = $(this)[_$[2]]();

if (a[_$[3]](_$[4]) != -0x1) {

return;

}

var b = $(this)[_$[5]](_$[6]);

try {

b = b[_$[7]](_$[8])[0x1];

var c = b[_$[7]](_$[9]);

var d = c[_$[10]];

var f = [];

for (var g = 0x0; g < d; g++) {

f[_$[11]](_$[12][_$[3]](c[g]));

}

$(this)[_$[2]](window[_$[13]](f[_$[14]](_$[15])) >> 0x3);

} catch (e) {}

});

});

可以看到有一个列表和一个函数,而这个函数应该就是混淆的函数了,但是这列表里的数据都是十六进制的,还需要解码一下(这一步可以用Python来做):

_ = ["\x2e\x70\x6f\x72\x74", "\x65\x61\x63\x68", "\x68\x74\x6d\x6c", "\x69\x6e\x64\x65\x78\x4f\x66", "\x2a",

"\x61\x74\x74\x72", "\x63\x6c\x61\x73\x73", "\x73\x70\x6c\x69\x74", "\x20", "", "\x6c\x65\x6e\x67\x74\x68",

"\x70\x75\x73\x68", "\x41\x42\x43\x44\x45\x46\x47\x48\x49\x5a", "\x70\x61\x72\x73\x65\x49\x6e\x74",

"\x6a\x6f\x69\x6e", ""

]

_ = [i.encode('utf-8').decode('utf-8') for i in _]

print(_)

# ['.port', 'each', 'html', 'indexOf', '*', 'attr', 'class', 'split', ' ', '', 'length', 'push', 'ABCDEFGHIZ', 'parseInt', 'join', '']

然后把这个列表里的元素添加到上面的JS函数中,可以得到如下结果:


可以看到这段JS代码就是先找到每个端口节点,然后把端口的class值提取出来,再进行拆分字符串,然后获取每个字母在”ABCDEFGHIZ“中的下标值,并把这些值拼接成字符串,再转为整型数据,最后把这个整型数据向右移3位。比如”GEA“对应的下标组成的字符串是”640“,转为整型数据后向右移3位的结果就是80,也就是真实的端口值了。最后附上用Python解密端口号的代码:

猜你喜欢

转载自blog.csdn.net/qq_40925239/article/details/88394484