我使用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运行时,它将不再接收新事件。
你们有没有发生过同样的问题?我非常感谢你的帮助
答案 0 :(得分:2)
似乎当reactor正在运行时,它将不再接收新事件。
事实并非如此。当反应堆运行时发生仅事件!
您没有共享使用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
...