2013-03-08 1 views
1

트위스트 된 deferredGenerator를 사용하여 크롤러를 작성합니다. 이 다음 내 질문에 대한 코드입니다 :트위스트를 사용하는 크롤러. getPage가 타임 아웃 오류를 발생시킬 때 어떻게해야합니까?

 @defer.deferredGenerator 
     def getReviewsFromPage(self,title,params): 

      def deferred1(page): 
       d = defer.Deferred() 
       reactor.callLater(1,d.callback,self.parseReviewJson(page)) 
       return d 

      def deferred2(dataL,title): 
       d = defer.Deferred() 
       reactor.callLater(1,d.callback,self.writeToCSV(dataL,title=title)) 
       return d 

      cp = 1 
      #for cp in range(1,15000): 
      while self.running: 
       print cp 
       params["currentPageNum"] = cp 

       url = self.generateReviewUrl(self.urlPrefix,params = params) 
       print url 

       wfd = defer.waitForDeferred(getPage(url,timeout=10)) 
       yield wfd 
       page = wfd.getResult() 
       wfd = defer.waitForDeferred(deferred1(page)) 
       yield wfd 
       dataList = wfd.getResult() 
       wfd = defer.waitForDeferred(deferred2(dataList,title)) 
       yield wfd 
       cp = cp+1 

내가

self.getReviewsFromPage(title,params) 
    reactor.run() 

내 질문에 의해 발전기를 사용할 수 있습니다 : 기능 'getPage는'타임 아웃 오류를 얻을 때 , 내가 무엇을 할 수 오류를 처리하고 오류 페이지를 다시 크롤링합니까? getPage에 addErrback을 한 번 추가하고 getPage를 호출하려고했지만 원자로가 실행 중일 때 더 이상 새 이벤트를받지 못하는 것 같습니다.

동일한 질문이 발생 했습니까? 도와 주셔서 감사합니다.

답변

2

원자로가 작동 중일 때 더 이상 새로운 이벤트를받지 못하는 것 같습니다.

이것은 그렇지 않습니다. 이벤트 반응기가 작동 중일 때 만 발생합니다!

addErrback을 사용하는 코드 버전을 공유하지 않았으므로 사용 방법에 문제가 있는지 확인할 수 없습니다. 그러나 이미 deferredGenerator을 사용 중이므로 더 관용적 인 접근 방법은 다음과 같습니다.

page = None 
for i in range(numRetries): 
    wfd = defer.waitForDeferred(getPage(url,timeout=10)) 
    yield wfd 
    try: 
     page = wfd.getResult() 
    except TimeoutError: 
     # Do nothing, let the loop continue 
     pass 
    else: 
     # Success, exit the loop 
     break 
if page is None: 
    # Handle the timeout for real 
    ... 
else: 
    # Continue processing 
    ... 
+0

답장을 보내 주셔서 감사합니다. 나는 어제 문제를 해결했고 솔루션은 wfd.getResult에서 페이지를 가져 와서 해당 유형이 NoneType인지 확인하는 것과 매우 비슷했습니다 (유형에 errback과의 관계가 있는지 여부는 알 수 없습니다. 오류를 되돌리려면 아무 것도 반환하지 않습니다.) 당신은 적절한 해결책을 제시했습니다. 고맙습니다! – user2147650