Ajax 奇怪的刮擦元属性问题

Ajax 奇怪的刮擦元属性问题,ajax,python-2.7,callback,scrapy,Ajax,Python 2.7,Callback,Scrapy,我正试图从这个网站中删除这一类:n11.com/mutfak-gerecleri 有些产品有多种尺寸,价格如下: 这个特定的ajax调用加载了不同的价格:stok之后的第一个数字是产品id,第二个是skuId。pid可以在url中找到,SKUID可以在html中找到(搜索skuList)。在这种情况下,通过更改pan的大小来触发调用 这是处理ajax调用并采用新方法的代码: def parse(self, response): item = N11ProductItem() it

我正试图从这个网站中删除这一类:n11.com/mutfak-gerecleri

有些产品有多种尺寸,价格如下:

这个特定的ajax调用加载了不同的价格:stok之后的第一个数字是产品id,第二个是skuId。pid可以在url中找到,SKUID可以在html中找到(搜索skuList)。在这种情况下,通过更改pan的大小来触发调用

这是处理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
应该提到的是,我尝试了使用和不使用don_merge_cookies元参数以及don't filter请求参数的代码

我不会为每个项目创建一个新项目,因为我想要相同的项目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完全无关。您应该记住,您已经创建了具有单个属性(大小、sku等)的单个。您的
zip()
循环只是在
生成请求之前设置/覆盖此属性


如果您确实希望(仅)为多个大小/产品实例创建单个
N11ProductItem()
,则不能使用单个
integer
属性来存储不同的大小/SKU。您需要一个嵌套结构,如
dict
list
来存档此文件。

感谢您的反馈。你的评论帮助我解决了这个问题。我最终制作了多个项目,每个子元素一个,现在效果很好。我不知道我自己怎么没有想到它;这可能是因为,即使是现在,我还是希望我的方法也能起作用,这在我的头脑中是有意义的,但在现实中并非如此。@bjj我也认为每个实体一个项目是更好的方法。两个大小不同的锅是不同的实体;)如果我的答案对你有用,你可能会把它标记为接受?