如何让 Scrapy 不要缓存包含特定关键字的Response

当使用 Scrapy 进行网络爬取时,HTTP 缓存中间件是一个十分有用的工具,它可以根据HTTP状态来帮助我们保存和重用先前爬取的响应,例如缓存状态为2xx的响应。但有时,我们可能希望基于响应的实际内容来决定是否进行缓存。例如,如果Response正文中包含“请求频繁”、“error_code”这样的关键字时,我们希望Scrapy不要缓存它,这个在实际采集数据时经常会遇到,因为很多网站的API在返回错误信息时,HTTP状态码还是使用的200。

那么本文将教你如何基于响应内容来定制 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!

posted @ 2023-10-12 21:37  seozed  阅读(21)  评论(0编辑  收藏  举报