2 回答

TA贡献1777条经验 获得超3个赞
想出了一种方法,不知道这是最好的还是最坏的方法。
我的所有请求都会收到文档中errback建议的回调。这是: errback
def 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。
添加回答
举报