Scrapy没有这样的主机爬虫

时间:2014-10-28 09:31:47

标签: scrapy web-crawler host scrapy-spider

我正在使用这个爬虫作为我的基础收割者 https://github.com/alecxe/broken-links-checker/blob/master/broken_links_spider.py

创建它以捕获404错误域并保存它们。 我想稍微修改一下并让它查找“No such host”错误,这是错误12002。

但是,使用此代码,Scrapy没有收到任何响应(因为没有主机返回响应),当scrapy遇到这样的域时,它返回

未找到:[Errno 11001] getaddrinfo失败。

如何捕获此未找到的错误并保存域?

2 个答案:

答案 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中的新文件中。然后我对感兴趣的错误代码进行了“全部查找”。

在选择了错误代码的所有实例后,我只是将选择扩展到整行,并将其复制并粘贴到另一个纯文本文件中,该文件相当于返回错误的所有链接/域的列表对我感兴趣的代码。