Scrapy根据要求不填充对象

时间:2016-04-04 09:42:08

标签: python python-2.7 scrapy

这是我的代码

spider.py

def parse(self,response):
    item=someItem()
    cuv=Vitae()
    item['cuv']=cuv
    request=scrapy.Request(url, callback=self.cvsearch)
    request.meta['item'] = item
    yield request

def cvsearch(self, response):
    item=response.meta['item']
    cv=item['cuv']
    cv['link']=response.url
    return item

items.py

class someItem(Item):
   cuv=Field()

class Vitae(Item):
   link=Field()

没有显示错误!

它将对象“cuv”添加到“item”但是“cuv”的属性从未添加,我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

为什么你在另一个内部使用scrapy.Item? 尝试在item['cuv']中使用简单的python dict。并尝试将request.meta移动到scrapy.Request构造函数参数。 您应该使用yield代替return

def parse(self,response):
    item=someItem()
    request=scrapy.Request(url, meta={'item': item} callback=self.cvsearch)
    yield request

def cvsearch(self, response):
    item=response.meta['item']
    item['cuv'] = {'link':response.url}
    yield item

答案 1 :(得分:0)

我不是一个很好的解释员,但我会尝试解释我能做的最好的错误

Scrapy是异步的,意味着没有执行请求的顺序。我们来看看这段代码

def parse(self,response):
   item=someItem()
   cuv={}
   item['cuv']=cuv
   request=scrapy.Request(url, callback=self.cvsearch)
   request.meta['item'] = item
   yield request
   logging.error(item['cuv']) #this will return null [1]

def cvsearch(self, response):
   item=response.meta['item']
   cv=item['cuv']
   cv['link']=response.url
   return item

[1] - 这是因为这行将在cvsearch完成之前执行,你无法控制。要解决此问题,您必须为多个请求执行级联

def parse(self,response):
   item=someItem()
   request=scrapy.Request(url, callback=self.cvsearch)
   request.meta['item'] = item
   yield request

def cvsearch(self, response):
   item=response.meta['item']
   request=scrapy.Request(url, callback=self.another)
   yield request

def another (self, response)
   item=response.meta['item']
   yield item

为了完全掌握这个概念,我建议你看一下多线程。请添加我错过的任何内容!