Python 2.7 Scrapy spider在start_requests函数中的屈服请求后过早关闭

Python 2.7 Scrapy spider在start_requests函数中的屈服请求后过早关闭,python-2.7,scrapy,Python 2.7,Scrapy,我根本不知道怎么做。基本上,我想在运行刮片程序之前运行数据库插入。我试图通过在start_requests()函数的顶部放置一个yield请求来实现这一点,就像这样,除了执行pipline和scrape终止,而不是实际转到start_请求中的下一行 def start_requests(self): db = MyDatabase() link = "http://alexanderwhite.se/" item = PopulateListingAvItem()

我根本不知道怎么做。基本上,我想在运行刮片程序之前运行数据库插入。我试图通过在start_requests()函数的顶部放置一个yield请求来实现这一点,就像这样,除了执行pipline和scrape终止,而不是实际转到start_请求中的下一行

def start_requests(self):
    db = MyDatabase()

    link = "http://alexanderwhite.se/"
    item = PopulateListingAvItem()
    self.start_urls.append(link)
    yield Request(link, callback=self.listing_av_populate, meta={'item': item}, priority=300)

    #program terminates successfully completing the above request, but I need it to continue to the next line

    query1 = "SELECT listing_id FROM listing_availability WHERE availability=1"
    listing_ids = db.query(query1)


    for lid in listing_ids:
        query2 = "SELECT url from listings where listing_id="+str(lid['listing_id'])
        self.start_urls.append( db.query(query2)[0]['url'] )


    for url in self.start_urls:
        yield Request(url, self.parse, priority=1)

解决方案并不明显,可能对其他人有所帮助。在这种情况下,当您需要在执行任何刮削之前执行插入查询时,您可以使用yield item,然后在第一个回调函数中使用start_url生成器代码的其余部分,正如ice13berg所建议的那样。整个关键是使用“收益项目”

我不太明白它为什么会工作,但它确实工作了,正确地对项目执行insert,并将insert的结果用于下一个select查询

def listing_av_populate(self,response):
    db = MyDatabase()
    item = response.meta['item']    
    item['update_bid_av'] = 3

    yield item

    query1 = "SELECT listing_id FROM listing_availability WHERE availability=1"
    listing_ids = db.query(query1)


    for lid in listing_ids:
        query2 = "SELECT url from listings where listing_id="+str(lid['listing_id'])
        self.start_urls.append( db.query(query2)[0]['url'] )


    for url in self.start_urls:
        yield Request(url, self.parse, priority=1)


def start_requests(self):

    link = "http://alexanderwhite.se/"
    item = PopulateListingAvItem()
    yield Request(link, callback=self.listing_av_populate, meta={'item': item}, priority=300)

在我看来,start_requests函数将以Yield调用结束,然后scrapy将继续执行管道。为什么不在回调函数中包含数据库查询内容?或者让insert函数调用另一个查询函数?