我试图抓住这个网站的这一类: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文档,然后在这里查看,但我找不到答案。我错过了一些东西,我需要一些外界的帮助。
非常感谢!
答案 0 :(得分:1)
您的问题根本与meta机制或Scrapy无关。您应该记住,您已经创建了具有单个属性(size,sku等)的单个。您的zip()
循环只会在yield
请求之前设置/覆盖此属性。
如果确实想要(仅)为多个尺寸/产品实例创建一个N11ProductItem()
,则您无法使用单个integer
属性进行存储不同尺寸/ skus。您需要一个嵌套的结构,如dict
或list
来存档它。