middleware功能
约 835 字大约 3 分钟
2025-01-14
简介
Middleware(中间件)位于请求和响应的处理链路中,用于在请求发送前和响应接收后进行自定义处理。它可以动态地修改请求、响应、异常等内容,增强爬虫的灵活性和稳定性。
功能特点
请求预处理
:在请求发送前(Request)动态修改请求头、设置代理、增加验证信息等。响应后处理
:在响应接收后(Response)进行数据解密、反爬处理、重试机制等操作。异常捕获
:拦截并处理请求过程中的异常,避免程序崩溃。灵活扩展
:支持多层中间件链路,优先级灵活配置,满足不同处理需求。跨模块复用
:中间件可在多个爬虫项目中复用,提升开发效率。
处理流程
请求预处理
:请求发出前,Middleware 修改请求(如设置代理、请求头)。响应后处理
:Middleware 处理响应。异常捕获
:捕获请求或响应中的异常,进行重试或降级处理。
典型应用场景
反爬虫对抗
:动态切换 User-Agent、设置代理 IP、增加随机延迟。异常处理
:捕获请求失败或超时,自动重试或降级访问。数据解密
:处理加密响应内容,如解密 JS 加密数据。请求签名
:为请求动态添加签名或身份认证信息
内置函数
类名 | 方法名 | 传参 | 注意 |
---|---|---|---|
Middleware | process_open | 爬虫启动前的处理 | 所有自定义middleware都需要继承Middleware类并继承相应的处理方法 |
process_executed | 爬虫启动成功的处理 | ||
process_close | 爬虫结束的处理 | ||
process_request | 在请求发送前处理 | ||
process_response | 在响应返回后处理 | ||
process_exception | 在请求或响应阶段捕获异常 |
使用示例
middleware.py
# -*- coding: utf-8 -*-
import time
from hunterx.middlewares.middleware import Middleware # 新定义的中间件必须继承此父类,否则不生效
class FirstSpiderMiddleware(Middleware):
@staticmethod
async def process_request(request):
request.start_time = time.time()
return request
@staticmethod
async def process_response(request, response):
duration = time.time() - request.start_time
print(f"Response time for {response.url}: {duration:.2f} seconds")
return response
settings.py
# 自定义的中间件,可创建多个,数字越小优先级越高
MIDDLEWARES = {
'FirstSpiderMiddleware': 100
}
提示
记得在 settings.py
中添加上定义好的middleware类哦
- 执行爬虫任务后的效果
2025-01-14 22:05:39 [hunterx.core.manager_memory] INFO: Crawler program starts --> first_spider
2025-01-14 22:05:39 [hunterx.core.manager_memory] DEBUG: 0 seconds have passed since the last dequeue operation, and there is 1 message remaining in the queue.
2025-01-14 22:05:39 [hunterx.queue.memory_queue] INFO: Consumer has initiated
2025-01-14 22:05:39 [hunterx.core.manager_memory] INFO: Mining (200) <GET https://www.baidu.com>
2025-01-14 22:05:39 [hunterx.core.manager_memory] INFO: Catched from <200 https://www.baidu.com>
Response time for https://www.baidu.com: 0.31 seconds
通过使用中间件自动统计并打印每条请求所花费的时间
总结
Middleware 是爬虫框架中请求和响应处理的重要扩展点,具有请求预处理、响应后处理和异常捕获等强大功能。通过灵活配置和扩展,可以有效应对复杂的爬虫需求和反爬机制。