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

将项(或其他变量)传递给scrapy的中间件(或其他模块)。,scrapy,Scrapy,我正在改进几个月前写的蜘蛛。我试图让它更智能,只从网站上下载新信息。为此,我在下载中间件模块中添加了一个代码,以检查URL ID是否已被访问。除了使用request.URL命令可以很容易地获得的URL之外,我需要从爬行器传递一个项目-该项目是上次更新的日期 我们的想法是将valuesURL和Date Last Update与数据库常规csv文件中的更新进行比较,如果两者相同,则删除请求,如果两者都丢失,或者如果Last Update Date与请求不匹配,则继续执行请求 问题是我不知道如何将项目

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

我们的想法是将valuesURL和Date Last Update与数据库常规csv文件中的更新进行比较,如果两者相同,则删除请求,如果两者都丢失,或者如果Last Update Date与请求不匹配,则继续执行请求

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


您知道如何将项目或任何其他变量从Spider传递到中间件模块吗?

通常您会将请求元中的任何附加信息作为请求传递。meta['my_thing']=。。。或者作为一个参数生成Requesturl,meta={'my_thing':…},链中的所有中间件都可以访问它。但是,对于您的情况,我建议您在虚拟策略上使用scrapy内置缓存中间件,或者使用这两个模块中的任何一个,它们完全符合您的想法:

我会确定地检查这些模块,我已经检查了deltafetch,但由于我不是一名经验丰富的开发人员,我无法理解如何在我的spider中正确地实现它。这就是为什么我想自己做点什么。我将再次回到这些模块,但我也想完成我的想法。我在yield命令中使用meta来传递来自spider中不同解析方法的项,但是我应该如何使用请求。meta['some_item']?我有一个名为url\u id的项目,但当我尝试在downloadmedivernment>process\u request with request.meta['url\u id']中加载它时,它会给我keyrerror:'url\u id'您还可以将meta作为请求的参数传递。请看这个片段:我可以成功地在spider文件本身中传递元信息。问题是我无法将它从spider传递到下载中间件。下面是我的项目的精简版本:Items.py文件中有两个项,它们被加载到spider>meta.py文件中。有两个解析函数,第一个通过meta属性将参数传递给第二个。然而,同样的事情在下载的中间件中没有,如果你取消注释meta行,你会得到一个错误。啊,我明白了,你的中间件在所有请求上运行,包括没有任何元集的initial from start_URL。因此,只需在process\u request方法中执行request.meta中的if'item'检查,您不需要将其标记为@classmethod。