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

版权声明:转载请联系350267226,辛苦原创,请勿盗取。 https://blog.csdn.net/shuryuu/article/details/83148027

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

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

content = requests.get(wanzurl).content

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

<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代码,看了一天之后,搞得我恶心的要死,于是求助我朋友,得到部分解密代码,

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

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

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

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

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

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

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

扫描二维码关注公众号,回复: 3624362 查看本文章

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

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

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

猜你喜欢

转载自blog.csdn.net/shuryuu/article/details/83148027