scrapy 访问自定义中间件上的Spider自身对象

dnph8jn4  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(161)

我试图注意到我正在废弃的页面什么时候有问题。如果响应没有有效的状态代码,我想在爬虫统计中写一个自定义值,这样我就可以从我的进程中返回一个非零的退出代码。这是我到目前为止写的内容:

我的蜘蛛.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.loggerself.crawler对象。我如何才能使Spider self对象在中间件上可用?

p5fdfcr1

p5fdfcr11#

spider self对象是中间件的process_spider_exception方法中名为spider的参数,可以像下面spider.logger.info(...)那样使用

相关问题