Python 使用twisted的爬虫程序,当getPage出现超时错误时,我该怎么办?

Python 使用twisted的爬虫程序,当getPage出现超时错误时,我该怎么办?,python,timeout,twisted,web-crawler,reactor,Python,Timeout,Twisted,Web Crawler,Reactor,我使用twisted及其延迟生成器编写了一个爬虫程序。 以下是关于我的问题的代码: @defer.deferredGenerator def getReviewsFromPage(self,title,params): def deferred1(page): d = defer.Deferred() reactor.callLater(1,d.callback,self.parseReview

我使用twisted及其延迟生成器编写了一个爬虫程序。 以下是关于我的问题的代码:

      @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,但当反应堆运行时,它似乎不再接收新事件

你们有谁想到过同样的问题吗?我非常感谢你的帮助

看起来,当反应堆运行时,它将不再接收新事件

事实并非如此。事件仅在反应堆运行时发生

您没有共享使用
adderback
的代码版本,因此我看不出您如何使用它是否存在问题。但是,由于您已经在使用
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
    ...

谢谢你的回答。我昨天已经解决了这个问题,解决方案与您的非常类似,即从wfd.getResult获取页面并检查其类型是否为NoneType(我不知道该类型是否与errback有任何关系。我添加到errback的函数不返回任何内容)。你给出了一个合适的解决方案。非常感谢。