如何在 Scrapy 中基于响应内容条件缓存特定响应

发布时间 2023-10-12 21:41:49作者: seozed

当使用 Scrapy 进行网络爬取时,HTTP 缓存中间件是一个十分有用的工具,它可以帮助我们保存和重用先前爬取的响应。但有时,我们可能希望基于响应的实际内容来决定是否进行缓存。例如,如果响应中包含某个特定关键字,我们可能不希望缓存它。本文将教你如何基于响应内容来定制 Scrapy 的 HTTP 缓存行为。

1. 创建自定义缓存中间件

首先,我们要创建一个自定义的缓存中间件,这个中间件将继承自 Scrapy 的 HttpCacheMiddleware。重写其中的 _cache_response 方法,以实现根据响应内容进行条件缓存的逻辑。

以下是代码示例:

from scrapy.downloadermiddlewares.httpcache import HttpCacheMiddleware

class KeywordCacheMiddleware(HttpCacheMiddleware):

    def __init__(self, settings, stats):
        super().__init__(settings, stats)

    def _cache_response(self, spider, response, request):
        if b"your_keyword" in response.body:
            # 如果关键字存在,直接返回,不执行缓存逻辑
            return
        return super()._cache_response(spider, response, request)

请确保替换 your_keyword 为你想检查的实际关键字。

2. 更新 Scrapy 项目的配置

接下来,我们需要在 Scrapy 项目的 settings.py 文件中做一些修改,以启用我们的自定义缓存中间件。

首先,确保你已经启用了 HTTP 缓存:

HTTPCACHE_ENABLED = True

然后,禁用默认的 HttpCacheMiddleware 并启用你的自定义 KeywordCacheMiddleware:

DOWNLOADER_MIDDLEWARES = {
    # 禁用默认的 HttpCacheMiddleware
    'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': None,
    # 启用新的 KeywordCacheMiddleware
    'your_project_path.KeywordCacheMiddleware.KeywordCacheMiddleware': 900,
}

请确保替换 your_project_path 为你的实际项目路径。

Enjoy!