我正在使用这个爬虫作为我的基础收割者 https://github.com/alecxe/broken-links-checker/blob/master/broken_links_spider.py
创建它以捕获404错误域并保存它们。 我想稍微修改一下并让它查找“No such host”错误,这是错误12002。
但是,使用此代码,Scrapy没有收到任何响应(因为没有主机返回响应),当scrapy遇到这样的域时,它返回
未找到:[Errno 11001] getaddrinfo失败。
如何捕获此未找到的错误并保存域?
答案 0 :(得分:1)
处理请求期间发生的异常会通过Downloader Middleware类似的请求和响应对象执行,并通过process_exception()
方法处理。
以下内容会将所有异常(包括引发IgnoreRequest
时)记录到日志文件
class ExceptionLog(Object):
def process_exception(self, request, exception, spider):
with open('exceptions.log', 'a') as f:
f.write(str(exception) + "\n")
展开它以使用信号来调用常用spider_opened()
和spider_closed()
以获得更好的文件处理,或者从settings.py
文件中传递设置(例如自定义{{1} }})。
将其添加到设置文件中的EXCEPTIONS_LOG = ...
字典中。但要注意你把它放在中间件链中的位置!要靠近引擎,您可能会错过记录其他地方处理的异常。远离引擎,您可以记录重试或以其他方式解决的异常。你放在哪里将根据你的需要而定。
答案 1 :(得分:0)
这不是一个非常优雅的解决方案(它需要手工操作),但它对我有用,所以让我提一下。
我用Scrapy收集我想检查的链接。
然后我接受了这些已删除的数据(以CSV格式)并在Sublime Text中打开它并对其进行了清理(将所有内容转换为小写,删除任何格式错误的网址等)。我将该文件保存为纯文本(.TXT)并使用来自Bash shell的sort
:
$ sort -u my-list-of-link.txt
然后我创建了另一个蜘蛛,其中列出的网址为start_urls
。
我运行了那个蜘蛛,当它完成后,我将我的shell的日志输出复制并粘贴到Sublime Text中的新文件中。然后我对感兴趣的错误代码进行了“全部查找”。
在选择了错误代码的所有实例后,我只是将选择扩展到整行,并将其复制并粘贴到另一个纯文本文件中,该文件相当于返回错误的所有链接/域的列表对我感兴趣的代码。