您的位置:首页 > 编程语言 > Python开发

python 反反爬虫策略之js动态加密url破解

2018-10-18 17:02 856 查看
版权声明:辛苦原创,请勿盗取。 https://blog.csdn.net/shuryuu/article/details/83148027

这次这个爬虫废了我好几天时间,第一次遇到js反爬虫策略,瞬间被打趴下了。不过研究了好几天之后终于是搞定了,求助的一个朋友,最后的原理我可能也不是太清楚,写下来,记录一下,有遇到类似问题的可以参考一下。

这个反爬虫策略,具体是这样的,当我写了一个这样的get请求。

[code]content = requests.get(wanzurl).content

前两百条,都会返回网页源码,然后我能得到我想要的数据,但是每24小时你通过代码访问的超过200条之后,就会返回一个js脚本,神奇的脚本,同一个网址,每次访问返回的脚本都不一样,js脚本是这样的。

[code]<script type="text/javascript">
function UGy(UGy_) {
function gn() {
return getName();
};
return gn();
return 'UGy'
}
function o9P() {
'return o9P';
return '17'
}
function getName() {
var caller = getName.caller;
if (caller.name) {
return caller.name
}
var str = caller.toString().replace(/[\s]*/g, "");
var name = str.match(/^function([^\(]+?)\(/);
if (name && name[1]) {
return name[1];
} else {
return '';
}
}
W2 = 'v';

function do(do_) {
function w() {
return getName();
};
return w();
return 'do'
}
E0zT = function() {
'return E0zT';
return 'id=';
};

function Vo() {
'Vo';

function _V() {
return '='
};
return _V();
}
_V4R9e = 'assign';
_x2vzv = 'replace';
_riss5 = location;

function CY(CY_) {
function f() {
return getName();
};
return f();
return 'CY'
}
gw4G = '&_d';

function oPe(oPe_) {
function ad() {
return getName();
};
return ad();
return 'oPe'
}
function M7n5() {
'return M7n5';
return '.ph'
}
eF9 = function(eF9_) {
var _e = function(eF9_) {
'return eF9';
return eF9_;
};
return _e(eF9_);
};

function oq8() {
'oq8';

function _o() {
return 'p?'
};
return _o();
}
kZsu = function() {
'return kZsu';
return 'f56';
};
xK9 = function(xK9_) {
'return xK9';
return xK9_;
};
eC = function() {
'eC';
var _e = function() {
return 'o'
};
return _e();
};

function CjJ(CjJ_) {
function si() {
return getName();
};
return si();
return 'CjJ'
}
function on(on_) {
function m() {
return getName();
};
return m();
return 'on'
}
function b2(b2_) {
function _b(b2_) {
function u() {
return getName();
}
function b2_() {}
return u();
return b2_
};
return _b(b2_);
}
function KX0(KX0_) {
function _K(KX0_) {
function th() {
return getName();
}
function KX0_() {}
return th();
return KX0_
};
return _K(KX0_);
}
Nm = function() {
'return Nm';
return 'o';
};

function VlK() {
'VlK';

function _V() {
return 'd='
};
return _V();
}
_MBGz6 = 'href';
_MG5Qx = window;
gm = '5';
location = (function(g7Z_) {
return (function(g7Z_) {
return g7Z_;
})(g7Z_);
})('/f') + eC() + (function() {
'return qy';
return 'r'
})() + b2('f2') + (function() {
'return OB';
return (function() {
return 'm';
})();
})() + M7n5() + oq8() + on('f6') + Nm() + VlK() + W2 + (function(CJL_) {
return (function(CJL_) {
return CJL_;
})(CJL_);
})('ie') + do('ze') + KX0('Klt') + (function(DnX_) {
return (function(DnX_) {
return DnX_;
})(DnX_);
})('re') + oPe('nUH') + eF9('&t') + E0zT() + gm + xK9('67') + '57' + (function() {
'return bK';
return '9'
})() + gw4G + CjJ('p49') + UGy('bNQ') + Vo() + o9P() + CY('S3') + '55' + kZsu();
_MG5Qx.href = (function(g7Z_) {
return (function(g7Z_) {
return g7Z_;
})(g7Z_);
})('/f') + eC() + (function() {
'return qy';
return 'r'
})() + b2('f2') + (function() {
'return OB';
return (function() {
return 'm';
})();
})() + M7n5() + oq8() + on('f6');
</script>

看起来刁刁的,于是我尝试看一波js代码,看了一天之后,搞得我恶心的要死,于是求助我朋友,得到部分解密代码,

[code]var location{
assign : set
}
var url = "";
function set(s){
url = s;
}
function get(){
return url;
}

一共有四种解密的代码,已经全都写好了。大概讲一下思路,先将返回的js代码格式化,然后

看到location调用了assign函数,然后定义一个结构是location的函数

[code]var location{
assign : set
}
var url = "";
function set(s){
url = s;
}
function get(){
return url;
}

然后python调用get函数,就能返回这个js脚本里面的参数。将写好的js代码,加到返回的js脚本里。

这个服务器返回的js脚本直接执行的话,会在当前的url后面新增一个参数

解密之后,把解出来的参数加到原来的链接之后再次发起请求,服务器就会返回数据。

 

然后一个通过js动态添加参数的反爬虫策略被完美破解。其中的js代码也是经过混淆,非常的难以看懂,主要就是找到js脚本里面的location,window,和href几个参数,将即将返回的参数,通过添加js代码,直接取出来。

 

整个破解原理大概是:多次请求之后,服务器不再直接返回源码,而是返回一个js文件,这个js文件执行之后,最终会向url栏添加一串参数,我们写一个函数,将它要返回给浏览器url地址栏的参数,返回出来就好了。。。

不用管它加密的逻辑,反正他最终都要返回一个参数到url地址栏,也就是window.location.href的部分,去看这三个单词相关的代码,然后写代码将最后的参数返回到代码里进行拼接。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: