这是我的代码
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”的属性从未添加,我在这里缺少什么?
答案 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
为了完全掌握这个概念,我建议你看一下多线程。请添加我错过的任何内容!