hook,翻译是钩子,也称作js注入。
大概如图这样:
js代码的注入是在本地浏览器进行的,然后这一整个过程叫hook。
hook的目的是在不修改原始代码的情况下,拦截或修改函数的执行行为。方便设断点调试。
简单理解:看看你咋加密的,我好解密。
爬虫常用有以下四种hook:
1. JSON.parse
案例:全国建筑市场
JSON.parse
是 JavaScript 中的一个内置方法,用于将一个 JSON 字符串转换为 JavaScript 对象
为了在转换前断住,在F12控制台注入js代码:
(function(){
var parse_ = JSON.parse; // Json.parse方法可替换成想断的方法,比如json.stringify
JSON.parse = function(str){
console.log("断住了嘿嘿!",str);
debugger;
return parse_(str);
}}
)();
效果:
2.Cookie加密
案例:同花顺
(function(){
var cookieText = '';
Object.defineProperty(document, 'cookie', {
set: function(value) {
if (value.indexOf('v') != - -1 ) {
debugger;
}
console.log('Hook 捕获到了 cookie 值:' + value);
cookieText = value;
},
get: function() {
return cookieText;
},
});
})();
// 注意:此方法仅适用于简单的 cookie 值,对于复杂的 cookie 值,可能会造成不可预料的结果。
3. xhr参数加密
(function(){
var open = XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function(method, url, async) {
if (url.indexOf('[要断的参数]') !== -1) {
debugger;
}
return open.apply(this, arguments);
};
})();
像这种:
4.headers加密
(function() {
var oldSetRequestHeader = window.XMLHttpRequest.prototype.setRequestHeader;
window.XMLHttpRequest.prototype.setRequestHeader = function(header, value) {
if (key == 'headers 的参数 key') {
debugger;
}
return oldSetRequestHeader.apply(this, arguments);
};
})();
// 或者直接搜索:headers["enctype"]
像这种: