2

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

创建它是为了捕获 404 错误域并保存它们。我想稍微修改一下,让它寻找“没有这样的主机”错误,即错误 12002。

但是,使用此代码,Scrapy 没有收到任何响应(因为没有主机可以返回响应),并且当 scrapy 遇到此类域时,它会返回

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

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

4

2 回答 2

1

处理请求期间发生的异常会像 Request 和 Response 对象一样通过Downloader Middleware传递,并通过该process_exception()方法处理。

以下会将所有异常(包括IgnoreRequest引发 an 时)记录到日志文件中

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文件中传递设置(例如 custom EXCEPTIONS_LOG = ...)。

将此添加到您DOWNLOADER_MIDDLEWARES的设置文件中的字典中。不过,请注意将其放在中间件链中的哪个位置!要关闭引擎,您可能会错过其他地方处理的日志记录异常。远离引擎,您可能会记录重试或以其他方式解决的异常。你把它放在哪里取决于你需要它的地方。

于 2015-10-16T21:02:37.583 回答
0

这不是非常优雅的解决方案(它需要手动工作),但它对我有用,所以让我提一下。

我使用 Scrapy 收集我想检查的链接。

然后我获取了抓取的数据(在 CSV 中)并在 Sublime Text 中打开它并对其进行了清理(全部转换为小写,删除任何格式错误的 URL 等)。我将该文件保存为纯文本 (.TXT) 并sort从 Bash shell 中使用: $ sort -u my-list-of-link.txt 然后我创建了另一个蜘蛛,这些 URL 被列为start_urls.

我运行了那个蜘蛛,当它完成后,我将 shell 的日志输出复制并粘贴到 Sublime Text 中的一个新文件中。然后我对我感兴趣的错误代码进行了“查找全部”。

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

于 2015-10-16T18:49:22.650 回答