为了理解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()
最近,我也遇到了同样的问题。尝试使用这两种方法,但每种方法都有很大的缺点:
传递项加载器和使用
add_value()
引入了对值进行双重处理(通过输入和输出处理器)的问题,这使得设计那些使代码更难读取和维护的处理器更加困难。传递项目而不是项目加载器只会扼杀整个项目加载器的想法,而且还会在整个代码中引入不一致性。
我在查看scrapy的
scrapy.loader.ItemLoader
源代码时发现,它是parent
关键字参数,它允许您传递父项ItemLoader并将其所有值复制到新的ItemLoader。在以下是修改后的
^{1}$parseDescription1
:
^{pr2}$scrapy crawl
结果:css选择器确实可以工作。问题在于保存在meta dict中的itemloader变量l中,它指向来自firstRequest回调的响应,而不是指向css选择器可以工作的parseDescription1回调
'分割价格-崩溃分割价格-不含税跨度价格*文本'
要解决这个问题,只需创建一个新的itemloaderparseDescription1或者更好地在meta dict中加载项目本身而不是它的加载程序,如下所示。。。在
^{1}$相关问题 更多 >
编程相关推荐