2015-01-08 3 views
1

치료 계획 항목 (선수)을 내 파이프 라인에 반납하는 데 범위 문제가 있습니다. 나는 문제가 무엇인지 알지만, 코드를 솔루션에 통합하는 방법을 모르겠습니다. 나는 또한 파이프 라인을 처리하기위한 코드가 올바르게 작성되었는지 확신합니다. 그냥 parseRoster() 함수 안에 플레이어 항목을 선언 했으므로 범위가 해당 함수에만 제한된다는 것을 알았습니다.치료 항목 추출 범위 문제

이제 내 질문에 내 파이프 라인에 보이도록 내 코드에서 플레이어 항목을 선언해야합니까? 내 목표는이 데이터를 내 데이터베이스로 가져 오는 것입니다. 내 코드의 메인 루프에 있다고 가정하고,이 경우에 새로 아이템이 선언 된 플레이어 아이템 &을 어떻게 반환 할 수 있습니까?

내 코드는 다음과 같습니다 :

클래스 NbastatsSpider (scrapy.Spider) : 이름 = "nbaStats"

start_urls = [ 
    "http://espn.go.com/nba/teams"                    ##only start not allowed because had some issues when navigated to team roster pages 
    ] 
def parse(self,response): 
    items = []                         ##array or list that stores TeamStats item 
    i=0                           ##counter needed for older code 

    for division in response.xpath('//div[@id="content"]//div[contains(@class, "mod-teams-list-medium")]'):  
     for team in division.xpath('.//div[contains(@class, "mod-content")]//li'): 
      item = TeamStats() 


      item['division'] = division.xpath('.//div[contains(@class, "mod-header")]/h4/text()').extract()[0]    
      item['team'] = team.xpath('.//h5/a/text()').extract()[0] 
      item['rosterurl'] = "http://espn.go.com" + team.xpath('.//div/span[2]/a[3]/@href').extract()[0] 
      items.append(item) 
      request = scrapy.Request(item['rosterurl'], callback = self.parseWPNow) 
      request.meta['play'] = item 

      yield request 

    print(item)  

def parseWPNow(self, response): 
    item = response.meta['play'] 
    item = self.parseRoster(item, response) 

    return item 

def parseRoster(self, item, response): 
    players = Player() 
    int = 0 
    for player in response.xpath("//td[@class='sortcell']"): 
     players['name'] = player.xpath("a/text()").extract()[0] 
     players['position'] = player.xpath("following-sibling::td[1]").extract()[0] 
     players['age'] = player.xpath("following-sibling::td[2]").extract()[0] 
     players['height'] = player.xpath("following-sibling::td[3]").extract()[0] 
     players['weight'] = player.xpath("following-sibling::td[4]").extract()[0] 
     players['college'] = player.xpath("following-sibling::td[5]").extract()[0] 
     players['salary'] = player.xpath("following-sibling::td[6]").extract()[0] 
     yield players 
    item['playerurl'] = response.xpath("//td[@class='sortcell']/a").extract() 
    yield item 

답변

3

Scrapy's data flow의 관련 부분에 따르면

엔진이 스크랩 한 항목 (Spider에서 반환)을 파이프 라인 및 요청 (스파이더가 반환) 스케줄러에게 전송

즉, 거미에서 아이템 인스턴스를 반환하거나 산출 한 다음 파이프 라인의 process_item() 메소드에서 사용합니다. 여러 항목 클래스가 있으므로 isinstance() built-in function :

def process_item(self, item, spider): 
    if isinstance(item, TeamStats): 
     # process team stats 

    if isinstance(item, Player): 
     # process player 
을 사용하여 구분하십시오.