首页 > 解决方案 > 将项目(或其他变量)传递给 scrapy 的中间件(或其他模块)。

问题描述

我正在改进几个月前写的蜘蛛。我试图让它更智能,只从网站下载新信息。为此,我在下载中间件模块中添加了一个代码,以检查 URL ID 是否已被访问。除了我可以通过 request.url 命令获得的 URL 之外,我需要从 Spider 传递一个项目 - 该项目是上次更新的日期。

想法是将两个值(URL 和上次更新日期)与数据库中的值(常规 csv 文件)进行比较,如果两者相同,则丢弃请求,如果两者都丢失或上次更新日期不匹配继续请求。

问题是我不知道如何将项目从蜘蛛传递到中间件。我可以看到在管道模块(对象)被传递给类,试图将它添加到中间件类中但它不起作用。

任何想法如何将项目或任何其他变量从蜘蛛传递到中间件模块?

标签: scrapy

解决方案


通常,您将请求元数据中的任何附加信息作为request.meta['my_thing'] = ...或作为参数传递yield Request(url, meta={'my_thing': ...}),链中的所有中间件都可以访问这些信息。但是,对于您的情况,我建议您在虚拟策略上使用内置缓存中间件的scrapy,或者使用这两个模块中的任何一个来完成您的想法:
https ://github.com/TeamHG-Memex/scrapy-抓取一次
https://github.com/scrapy-plugins/scrapy-deltafetch


推荐阅读