在Scrapy框架中,中间件是一种扩展机制,它允许你自定义爬虫的请求和响应处理过程。中间件的调用规则如下:
当爬虫开始爬取数据时,Scrapy会按照它们在settings中的顺序来调用下列中间件的方法:
process_request(request): 爬虫每次产生一个请求时,都会调用这个方法。这个方法的返回值可以是None或者一个Response对象,或者一个Request对象或IgnoreRequest异常。process_response(request, response): 爬虫每次获取到一个响应时,都会调用这个方法。这个方法必须返回一个Response对象。process_exception(request, exception): 爬虫在请求处理过程中出现异常时,会调用这个方法。这个方法可以返回一个Response对象或Request对象,或者直接抛出异常,导致请求失败。
- 如果中间件要打印所有请求和响应,可以在
process_request中打印请求,在process_response中打印响应。 - 如果你想在中间件中停止处理请求,可以直接返回
IgnoreRequest异常。 - 如果你想修改请求或者响应,可以在
process_request或process_response中修改这些对象。 - 如果你想中止响应的进一步处理,比如重定向或者调用其他中间件的方法,可以在
process_response中返回Response对象或抛出异常。 - 如果你想中止请求的进一步处理(即请求不再被其他中间件处理),可以在
process_request中返回None或Request对象。
以下是一个简单的示例代码,展示了如何编写一个自定义的中间件,并在settings中启用它:
# 中间件示例
class MyCustomMiddleware:
def __init__(self):
pass
def process_request(self, request):
# 可以在这里打印请求,或者做其他处理
pass
def process_response(self, request, response):
# 可以在这里打印响应,或者做其他处理
return response
def process_exception(self, request, exception):
# 处理异常,返回一个响应或抛出异常
pass
# 在settings.py中启用中间件
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.MyCustomMiddleware': 543,
}在这个例子中,MyCustomMiddleware 类定义了三个方法,分别处理请求、响应和异常。在 settings.py 文件中,通过 DOWNLOADER_MIDDLEWARES 字典将中间件添加到Scrapy的调度系统中,其中键为中间件类的完整路径,值为中间件的顺序(数字越小,越先被调用)。