对回调之间的项加载器进行故障排除

2024-09-30 20:36:40 发布

您现在位置:Python中文网/ 问答频道 /正文

为了理解http://oliverguenther.de/2014/08/almost-asynchronous-requests-for-single-item-processing-in-scrapy/中的“天真方法”示例

我正在尝试复制代码。这样做的目的是让一个条目填充每个字段都来自不同的网站。在

我试图理解为什么我在运行下面的代码并使用scrapy crawl compSpider -o prices.csv将结果导出到一个csv文件中时,会从下面的代码中得到以下行为。在

代码实际上用相关的价格填充nic峎u价格,但它对tester_price没有相同的作用。在

我认为应该这样做,因为item loader对象在请求元字段中从第一个回调[firstRequest]传递到第二个回调[parseDescription1],其中item loader对象最终被加载到一个项中。在

我已经测试了css选择器是否工作。有人能帮我理解为什么我会有这种行为吗?在

项目申报

import scrapy
class ProductItem(scrapy.Item):       
    nic_price = scrapy.Field()
    tester_price = scrapy.Field()

蜘蛛码

^{pr2}$

Tags: csv对象代码httpfieldde价格loader
2条回答

最近,我也遇到了同样的问题。尝试使用这两种方法,但每种方法都有很大的缺点:

  1. 传递项加载器和使用add_value()引入了对值进行双重处理(通过输入和输出处理器)的问题,这使得设计那些使代码更难读取和维护的处理器更加困难。

  2. 传递项目而不是项目加载器只会扼杀整个项目加载器的想法,而且还会在整个代码中引入不一致性。

我在查看scrapy的scrapy.loader.ItemLoader源代码时发现,它是parent关键字参数,它允许您传递父项ItemLoader并将其所有值复制到新的ItemLoader。在

以下是修改后的parseDescription1

^{1}$

scrapy crawl结果:

^{pr2}$

css选择器确实可以工作。问题在于保存在meta dict中的itemloader变量l中,它指向来自firstRequest回调的响应,而不是指向css选择器可以工作的parseDescription1回调

'分割价格-崩溃分割价格-不含税跨度价格*文本'

要解决这个问题,只需创建一个新的itemloaderparseDescription1或者更好地在meta dict中加载项目本身而不是它的加载程序,如下所示。。。在

^{1}$

相关问题 更多 >