我们都知道现在是大数据时代,用爬虫来获取数据的越来越多,与之对应的就是破解反爬的难度也越来越大
比如现在的网站一般都有各种各样的 JS 加密,app有参数加密或者返回的数据给你加密,甚至加壳! 所以如果不懂 JS 逆向和 app 逆向,这样爬虫很难生存
有幸看到群里有朋友推荐一个 JS 逆向入门的网站,没有经验的朋友可以用来入门练手
有经验的朋友可以用来加深自己的实战经验
网站分析
网站地址:http://www.landchina.com/default.aspx?tabid=226
我们的主要目标是需要获取下面的信息
第一步当然是抓包分析返回的数据,如果你不知道网站是否有 JS 加密
最好的办法是直接用 requests 请求,然后查看响应内容与网站源代码是否相同
响应
上面是用代码请求返回的响应
显而易见 html 中嵌入了 JS,而且很可能做了跳转,因为有个 location 的变量
JS破解
下面是通过 Chrome 浏览器抓包的过程,共请求了三次才获取到最终的数据
其中重定向的链接是在第一次请求返回的响应里面,用 JS 生成的
location
SO, 我们将返回的 JS 扣出来,下面是我提取出来的 JSfunction stringToHex(str) {
var val = "";
for (var i = 0; i < str.length; i++) {
if (val == "") val = str.charCodeAt(i).toString(16); else val += str.charCodeAt(i).toString(16);
}
return val;
}
function YunSuoAutoJump() {
var width = screen.width;
var height = screen.height;
var screendate = width + "," + height;
var curlocation = window.location.href;
if (-1 == curlocation.indexOf("security_verify_")) {
document.cookie = "srcurl=" + stringToHex(window.location.href) + ";path=/;";
}
self.location = "/default.aspx?tabid=226&security_verify_data=" + stringToHex(screendate);
}
提取出来之后,我们可以先看下 JS 里面的内容,然后本地进行调试,当然前提是你电脑上安装了 node.js可以看到 self.location 就是我们所需要的重定向链接
其中 curlocation 这个参数并没有用到,我们可以将相应的代码注释
还有个 screen 的属性,查询下资料可知是获取用户屏幕信息,我们直接改掉即可!
然后将 location 值返回,下面是改正后我们所需要的 JS
改正后的JS
运行这段 JS,直接生成我们所需的参数!
验证
我们也用代码模拟三次请求
其中第一次和第二次都会生成验证的 cookie
代码如下:def spider():
response = session.get(url)
text = response.text
ctx = execjs.compile(correct_js) # 改正后的js
location = ctx.call("YunSuoAutoJump")
second_url = "http://www.landchina.com" + location
_ = session.get(second_url)
res = session.get(url)
selector = Selector(text=res)
result = selector.css("#TAB_contentTable tr")[1:]
td_list = result.css("td")
其中 correct_js 就是上述改正后的 JS。最后我们看下能否提取出数据,结果一目了然!
验证结果
总结
到这里 JS 加密的破解就结束了,可以看到在流程当中比较重要的地方就是:
1.找数据,知道该网站会对哪些数据和请求头进行验证
2.找规律,寻找这些数据的加密规则
3.调试 JS,使用浏览器或者在本地进行调试
4.模拟数据,将这些数据通过代码模拟生成,然后加入到数据当中