奇怪的Scrapy元属性问题

时间:2017-03-11 12:25:49

标签: ajax python-2.7 callback scrapy

我试图抓住这个网站的这一类:n11.com/mutfak-gerecleri

有些产品有多种尺寸,价格如下:http://urun.n11.com/tava/tefal-titanium-hard-tava-no24-26-28-P99340786

此特定的ajax调用加载了不同的价格:http://urun.n11.com/sku/stok/99340786/123667829161?newDesign=true&isFashion=false其中stok之后的第一个数字是产品ID,第二个数字是skuId。 pid可以在url中找到,skuIds可以在html中找到(搜索skuList)。在这种情况下,通过更改平移的大小来触发调用。

这是处理ajax调用并产生新方法的代码:

def parse(self, response):
    item = N11ProductItem()
    item['product_url'] = response.url    
    print 'sizes=',sizes
    print 'skuIds=', skuIds
    print
    for sku, size in zip(skuIds, sizes):          
        print 'Sku before overwriting', item.get('sku')
        print 'size before overwriting',item.get('size')
        item['sku'] = sku
        item['size'] = size
        print 'Sku after overwriting', item['sku']
        print 'Size after overwriting',item['size']
        r = Request(
           url=ajax_call.format(pid=pid, sku=sku),
           meta={
           'item': item, 'dont_merge_cookies': True,
               },
           headers={
               'X-Requested-With': 'XMLHttpRequest'
               },
           callback=self.parse_price)
        print "yielding item"
        yield r

和parse_price方法:

    def parse_price(self, response):

        item = response.meta['item']
        print "Item in parse_price method: \n", item
        real_price = response.xpath("//div[@id='oldPrice']/text()").extract()
        item['real_price'] = real_price[0] if real_price else ''

        display_price = response.xpath("//div[@id='displayPrice']/text()").extract()
        item['discounted_price'] = display_price[0] if display_price else ''
        yield item

应该提一下,我尝试使用和不使用dont_merge_cookies元参数的代码以及不要过滤请求参数。

我没有为每件商品创建一个新商品,因为我想要相同的商品3次,但差别很小(价格,尺寸,颜色等)。

这是我的输出:

sizes= [u'28', u'24', u'26']
skuIds= [u'123667829161', u'123667829162', u'123667829163']
Sku before overwriting None
size before overwriting None

Sku after overwriting 123667829161

Size after overwriting 28

Yielding item

Sku before overwriting 123667829161

size before overwriting 28

Sku after overwriting 123667829162

Size after overwriting 24

Yielding item

Sku before overwriting 123667829162

size before overwriting 24

Sku after overwriting 123667829163

Size after overwriting 26

Yielding item

Item in parse_price {'product_url': 'http://urun.n11.com/tava/tefal-
titanium-hard-tava-no24-26-28-P99340786',
'size': u'26',
'sku': u'123667829163'}

Item in parse_price {'discounted_price': u'81,50 TL',
'product_url': 'http://urun.n11.com/tava/tefal-titanium-hard-tava-
 no24-26-28-P99340786',
'real_price': u'81,50 TL',
'size': u'26',
'sku': u'123667829163'}

Item in parse_price {'discounted_price': u'69,50 TL',
'product_url': 'http://urun.n11.com/tava/tefal-titanium-hard-tava-no24-26-28-P99340786',
'real_price': u'69,50 TL',
'size': u'26',
'sku': u'123667829163'}

从输出中可以看出,由于某种原因,元项目中的每次操作都会被上一次请求中的数据覆盖。

我自己尝试调试它,阅读scrapy文档,然后在这里查看,但我找不到答案。我错过了一些东西,我需要一些外界的帮助。

非常感谢!

1 个答案:

答案 0 :(得分:1)

您的问题根本与meta机制或Scrapy无关。您应该记住,您已经创建了具有单个属性(size,sku等)的单个。您的zip()循环只会在yield请求之前设置/覆盖此属性。

如果确实想要(仅)为多个尺寸/产品实例创建一个N11ProductItem(),则您无法使用单个integer属性进行存储不同尺寸/ skus。您需要一个嵌套的结构,如dictlist来存档它。