hook技术介绍

Python爬虫中的hook技术是指在爬取网页时通过钩子函数对请求进行修改或者拦截,从而达到定制化需求的目的。这种技术在爬虫开发中非常重要,它可以让我们更加灵活地控制爬取过程。

Python爬虫中的hook技术主要包括以下几种:

1.requests的hook

requesthook是在发送请求前对请求进行修改的操作。它通常用于添加请求头、设置代理等操作。例如,我们可以使用requesthook实现对每个请求都添加一个User-Agent头部:

import requests

def add_user_agent(request):
    headers = request.headers
    headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    return request

requests.get('http://www.baidu.com', hooks={'pre_request': add_user_agent})

2.response的hook

responsehook是在接收到响应后对响应进行处理的操作。它通常用于解析网页数据、保存数据等操作。例如,我们可以使用responsehook实现对每个响应都打印出网页内容:

import requests

def print_response(response):
    print(response.text)

requests.get('http://www.baidu.com', hooks={'response': print_response})

3.exception的hook

exceptionhook是在爬虫发生异常时对异常进行处理的操作。它通常用于重试操作、记录日志等操作。例如,我们可以使用exceptionhook实现对每个异常都进行重试:

import requests

def retry(exception):
    if isinstance(exception, (requests.ConnectionError, requests.Timeout)):
        return True
    return False

requests.get('http://www.baidu.com', hooks={'response': retry})

hook技术可以很好的帮助大家在爬虫中找到一些参数和数据


hook常用钩子写法--改一点参数可以直接使用

1、当我们遇到 JSON.parse这种加密数据可以直接使用下面的钩子

(function(){
    var parse = JSON.parse;
    JSON.parse = function(params) {
    console.log("Hook -->",params);
    debugger;
    return parse(params);
}
}
 )();

2、当我们遇到 JSON.stringify() 这种方法就可以用到下面这个钩子

(function(){
    var stringify = JSON.stringify;
    JSON.stringify = function(params) {
    console.log("Hook -->",params);
    debugger;
    return stringify(params);
}
}
 )();

3、当我们需要找header的时候,就可以用下面这个代码

var code = function(){
var org = window.XMLHttpRequest.prototype.setRequestHeader;
window.XMLHttpRequest.prototype.setRequestHeader = function(key,value){
    if(key=='Authorization'){
        debugger;
    }
    return org.apply(this,arguments);
}
}

4、当我们需要找url的参数的时候就用下面这个钩子

var code = function(){
var open = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function(method,url,async){
    if(url.indexOf("/改参数api")>-1){
        debugger;
    }
    return open.apply(this,arguments);
};
}

5、当我们找cookie参数的时候,可以这样注入钩子

(function (){
    'use strict';
    var cookieTemp = '';
    Object.defineProperty(document,'cookie',{
    set: function(val){
        if(val,indexOf('要找的参数') != -1){
        debugger;
    }
    console.log('Hook抓取到的cookie->',val);
    cookieTemp = val;
    return val;
},
    get: function(){
    return cookieTemp;
},
});
})();

最后希望以上内容能够帮助到大家谢谢!!!