我试图注意到我正在废弃的页面什么时候有问题。如果响应没有有效的状态代码,我想在爬虫统计中写一个自定义值,这样我就可以从我的进程中返回一个非零的退出代码。这是我到目前为止写的内容:
我的蜘蛛.py
from spiders.utils.logging_utils import inform_user
class MySpider(Spider):
name = 'MyScrapper'
allowed_domains = ['www.mydomain.es']
start_urls = ['http://www.mydomain/Download.html']
custom_settings = {
"SPIDER_MIDDLEWARES": {
"scrapy.spidermiddlewares.httperror.HttpErrorMiddleware": None
}
}
def parse(self, response):
if response.status != 200:
message = "ERROR {} on request.".format(response.status)
reason = 'Status response not valid'
inform_user(self, 'ERROR', message, close_spider=True, reason=reason)
...
实用程序/日志记录实用程序.py
def inform_user(self, level, message, close_spider=False, reason=''):
level = level.upper() if isinstance(level, str) else ''
levels = {
'CRITICAL': 50,
'ERROR': 40,
'WARNING': 30,
'INFO': 20,
'DEBUG': 10
}
self.logger.log(levels.get(level, 0), message)
if close_spider:
self.crawler.stats.set_value('custom/failed_job', 'True')
raise ScrapyExceptions.UsageError(reason=reason)
这和预期的一样,但是我不认为删除HttpErrorMiddleware是一个好的做法。这就是为什么我试图编写一个自定义的中间件来设置爬行器中的统计信息:
我的蜘蛛.py
from spiders.utils.logging_utils import inform_user
class CustomHttpErrorMiddleware(HttpErrorMiddleware):
def process_spider_exception(self, response, exception, spider):
super().process_spider_exception(response, exception, spider)
if response.status != 200:
message = "ERROR {} on request.".format(response.status)
reason = 'Status response not valid'
inform_user(self, 'ERROR', message, close_spider=True, reason=reason)
class MySpider(Spider):
name = 'MyScrapper'
allowed_domains = ['www.mydomain.es']
start_urls = ['http://www.mydomain/Download.html']
custom_settings = {
"SPIDER_MIDDLEWARES": {
"scrapy.spidermiddlewares.httperror.HttpErrorMiddleware": None,
CustomHttpErrorMiddleware: 50
}
}
但是,现在我在中间件定义上调用inform_user
函数,所以我不能访问Spider self
对象,其中包含该函数所使用的self.logger
和self.crawler
对象。我如何才能使Spider self
对象在中间件上可用?
1条答案
按热度按时间p5fdfcr11#
spider
self
对象是中间件的process_spider_exception
方法中名为spider
的参数,可以像下面spider.logger.info(...)
那样使用