猿问

在请求错误回调中处理新项目

我想为errback每个添加一个函数来Request捕获 DNS 查找失败、超时等。捕获它们后,我想提交一个要在管道中处理的新项目,以记录(在数据库中)URL x 因错误 y 而失败。

我可以想到两种理论上的方法来做到这一点(但实际上我也不知道该怎么做)。
1) 以某种方式修补爬虫引擎并向项目处理队列添加一个新项目。
2)手动调用相应的管道(为了公平起见,我只需要调用一个),但是访问它们可能类似于选项 1,不知何故需要修补引擎,然后笨拙地找到管道......

有什么建议吗?


慕盖茨4494581
浏览 161回答 2
2回答

慕森王

想出了一种方法,不知道这是最好的还是最坏的方法。我的所有请求都会收到文档中errback建议的回调。这是: errbackdef process_failed_request(self, failure):    status = 'Unknown problem'    if failure.check(HttpError) or failure.check(IgnoreRequest):        return    elif failure.check(twisted_errors.DNSLookupError):        status = 'Server not found'    elif failure.check(TimeoutError, twisted_errors.TCPTimedOutError):        status = '408'    elif failure.check(twisted_errors.SSLError):        status = 'SSL error'    elif failure.check(twisted_errors.ConnectError):        status = 'Connection error'    item = {        'visited_page': LightRequest(None, url=failure.request.url, status_code=status),    }    # Force scrapy to process the failed item as it was a normal item    self.crawler.engine.scraper.slot.itemproc_size += 1    dfd = self.crawler.engine.scraper.itemproc.process_item(item, self)    dfd.addBoth(self.crawler.engine.scraper._itemproc_finished, item, None, self)不要在意上面发生的事情,但三个底线是魔术。第一行增加项目处理队列计数器以CONCURRENT_ITEMS正确限制。第二行调用处理,第三行添加 Scrapy 为处理的每个项目添加的回调。该None参数是response可能实际上被放置在,也至少对一些错误值。你可以访问它,failure.value.response但我现在不在乎。哦,如果还不清楚的话self是Spider当然的。附注!由于这非常依赖于scrapy引擎,所以我使用的版本是1.5.1。

holdtom

您可以创建下载器中间件并实现该process_exception方法。您有权访问请求对象,因此您可以将详细信息写入数据库,然后返回新请求。
随时随地看视频慕课网APP

相关分类

Python
我要回答