1

twisted とその deferredGenerator を使ってクローラーを書きます。以下は私の質問に関するコードです:

      @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 を呼び戻したいと思ったのですが、reactor の実行中に新しいイベントを受信しなくなったようです。

同じ質問に出くわした人はいますか?私はあなたの助けに感謝します

4

1 に答える 1

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
    ...
于 2013-03-08T15:27:05.760 に答える