将项目(或其他变量)传递给scrapy的中间件(或其他模块)。

时间:2018-08-29 18:55:35

标签: scrapy

我正在改善几个月前写的蜘蛛。我正在尝试使其变得更智能,并仅从网站上下载新信息。为此,我在“下载中间件”模块中添加了一个代码,以检查URL ID是否已被访问。除了可以通过request.url命令获得相当容易的URL,我还需要传递来自Spider的项目-该项目是上次更新的日期。

这个想法是将两个值(URL和最后更新日期)与数据库(常规csv文件)中的值进行比较,如果两者相同,则删除请求,如果两个都缺失或者“最后更新日期”不存在,匹配以继续进行请求。

问题是我不知道如何将商品从Spider传递到中间件。我可以看到在Pipelines模块(对象)中传递了该类,尝试将其添加到Middleware类中,但是它不起作用。

有什么想法如何将Spider的Item或任何其他变量传递给中间件模块?

1 个答案:

答案 0 :(得分:1)

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