我们正在构建一个分布式系统,它使用Amazon的SQS根据消息的内容向运行scrapy spider的工人发送消息。在
我们(显然)只想在消息对应的spider已经成功运行的情况下从队列中移除消息,也就是说,没有遇到4xx/5xx响应。在
我想做的是钩住scrapy的signals
API,在spider成功关闭时触发一个从队列中删除消息的回调,但我不确定这是否是signals.spider_closed
的语义(与“此spider由于任何原因关闭了”相反)
也不清楚(至少对我来说)是在遇到HTTP错误代码时触发signals.spider_error
,还是只在从spider内部引发Python错误时触发。在
有什么建议吗?在
当爬行器爬网过程中发生Python错误时,将引发
signals.spider_error
。如果错误发生在spider_closed
信号处理程序中,则不会引发spider_error
。在一个基本的方法是有一个信号处理程序扩展,它将注册到
spider_closed
和spider_error
事件来处理状态,例如,如果URL包含高于399的状态,则不会从队列中删除该URL。在然后在这些处理程序方法中,您可以利用spider收集的统计信息来查看它是否正常:
当然,别忘了在
^{pr2}$settings.py
中添加SignalHandler
:当然还有另一种方法需要更多的编码:
您可以使用spider的
handle_httpstatus_list
参数自己处理状态代码。这允许您的spider处理默认情况下将被忽略的HTTP状态列表。在总结一种方法是处理您在spider中感兴趣的状态,并将它们收集到
set
中。在这就是蜘蛛:
这将是扩展的新方法:
相关问题 更多 >
编程相关推荐