零碎4xx/5xx错误处理

2024-10-02 12:31:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我们正在构建一个分布式系统,它使用Amazon的SQS根据消息的内容向运行scrapy spider的工人发送消息。在

我们(显然)只想在消息对应的spider已经成功运行的情况下从队列中移除消息,也就是说,没有遇到4xx/5xx响应。在

我想做的是钩住scrapy的signalsAPI,在spider成功关闭时触发一个从队列中删除消息的回调,但我不确定这是否是signals.spider_closed的语义(与“此spider由于任何原因关闭了”相反)

也不清楚(至少对我来说)是在遇到HTTP错误代码时触发signals.spider_error,还是只在从spider内部引发Python错误时触发。在

有什么建议吗?在


Tags: http消息内容amazon队列语义情况原因
1条回答
网友
1楼 · 发布于 2024-10-02 12:31:38

当爬行器爬网过程中发生Python错误时,将引发signals.spider_error。如果错误发生在spider_closed信号处理程序中,则不会引发spider_error。在

一个基本的方法是有一个信号处理程序扩展,它将注册到spider_closedspider_error事件来处理状态,例如,如果URL包含高于399的状态,则不会从队列中删除该URL。在

然后在这些处理程序方法中,您可以利用spider收集的统计信息来查看它是否正常:

class SignalHandler(object):

    @classmethod
    def from_crawler(cls,crawler):
        ext = cls()
        crawler.signals.connect(ext.spider_error, signal=signals.spider_error)
        crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)
        return ext

    def spider_error(self, failure, response, spider):
        print "Error on {0}, traceback: {1}".format(response.url, failure.getTraceback())

    def spider_closed(self, spider):
        if spider.crawler.stats.get_value('downloader/response_status_count/200') == spider.crawler.stats.get_value('downloader/response_count'):
            # OK, all went fine
        if spider.crawler.stats.get_value('downloader/response_status_count/404') != 0 or spider.crawler.stats.get_value('downloader/response_status_count/503') != 0:
            # something went wrong

当然,别忘了在settings.py中添加SignalHandler

^{pr2}$

当然还有另一种方法需要更多的编码:

您可以使用spider的handle_httpstatus_list参数自己处理状态代码。这允许您的spider处理默认情况下将被忽略的HTTP状态列表。在

总结一种方法是处理您在spider中感兴趣的状态,并将它们收集到set中。在

这就是蜘蛛:

class SomeSpider(scrapy.Spider):
    name = "somespider"

    start_urls = {"http://stackoverflow.com/questions/25308231/liferay-6-2-lar-import-no-journalfolder-exists-with-the-primary-key-2"}

    handle_httpstatus_list = [404, 503]

    encountered = set()

    def parse(self, response):
        self.encountered.add(response.status)
        # parse the response

这将是扩展的新方法:

def spider_closed(self, spider):
    if 404 in spider.encountered:
        # handle 404

相关问题 更多 >

    热门问题