在抓取期间收到以下警告:
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']
中?
答案 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