python 反反爬虫策略之js动态加密url破解
这次这个爬虫废了我好几天时间,第一次遇到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的部分,去看这三个单词相关的代码,然后写代码将最后的参数返回到代码里进行拼接。
阅读更多- Python爬虫—破解JS加密的Cookie
- Python爬虫—破解JS加密的Cookie
- Python爬虫—破解JS加密的Cookie
- 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求
- Python爬虫:Selenium+ BeautifulSoup 爬取JS渲染的动态内容(雪球网新闻)
- Python爬虫实战入门五:获取JS动态内容—爬取今日头条
- java爬虫,破解JS加密的Cookie
- 破解JS加密:url unicode加密而已
- 【Python爬虫5】提取JS动态网页数据
- Python 爬虫 PhantomJs 获取JS动态数据
- Python 爬虫 PhantomJs 获取JS动态数据
- Python 网络爬虫反爬破解策略实战
- 爬虫遭遇状态码521陷阱 破解js加密cookie
- Python爬虫实战入门五:获取JS动态内容—爬取今日头条
- Python爬虫学习——使用selenium和phantomjs爬取js动态加载的网页
- [IT动态]谷歌爬虫可理解JS代码:更好解析富媒体
- js脚本对url参数加密
- python /selenium /动态网页 /爬虫
- [ZZ] 破解JS脚本加密