捕获不可靠的警告并将其放入项目中

时间:2019-01-09 12:08:37

标签: python scrapy

在抓取期间收到以下警告:

2019-01-04 05:54:43 [scrapy.core.downloader.tls] WARNING: Remote certificate is not valid for hostname ...

我想将其存储在我的项目字段中,但不知道如何捕获特定请求。我设法通过以下方式通过errback中的scrapy.Request处理捕获的错误:

def errback(self, failure):

     item = BaseItem()

     item['error'] = failure.type.__name__
     item['url'] = failure.request.url

     yield item

有什么主意我该如何捕捉警告并将其添加到item['warning']中?

2 个答案:

答案 0 :(得分:1)

你不能。
Scrapy不会跟踪日志记录,因此,除非该组件使用一些详细信息更新meta(有时它会更新),否则您将必须使用您想做的事情来更新每个组件。

您可以更新发出警告的位置(scrapy.core.downloader.tls)并进行设置,以便使用某些关键字更新response.meta,但这似乎很难做到。

您最好的选择是在scrapy的github部分上打开一个问题-这可能是将来的scrapy版本的有用功能。

或者

作为黑客,您可以读取域名的日志文件,如果包含该文件,则将其标记为已删除项:

def parse(self, response):
    domain = 'foo.com'
    item = {'bad_cert': False}
    with open('log.out') as f:
        for line in f:
            if 'Remote certificate' in line and domain in line:
                item['bad_cert'] = True    

尽管我不确定这是否可靠。在纸上,应该始终在解析函数之前写入日志消息,但日志记录并非旨在在运行时读取。

答案 1 :(得分:1)

通过将此行添加到settings.py

DOWNLOADER_CLIENTCONTEXTFACTORY = 'scrapy.core.downloader.contextfactory.BrowserLikeContextFactory'

Scrapy会抛出一个您可以捕获的异常,而不仅仅是在SSL证书出现此类问题时发出警告。

https://docs.scrapy.org/en/latest/topics/settings.html#downloader-clientcontextfactory