如何让 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!
擅长爬虫、SEO、文本分类领域,交流微信 :z328134421