【问题标题】:Scrapy no such host crawlerScrapy 没有这样的主机爬虫
【发布时间】:2014-10-28 09:31:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: scrapy web-crawler host scrapy-spider


    【解决方案1】:

    在处理请求期间发生的异常通过 Downloader Middleware 传递,就像 Request 和 Response 对象一样,并通过 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 文件中传递设置(例如自定义EXCEPTIONS_LOG = ...)。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-06-24
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-27
        • 1970-01-01
        相关资源
        最近更新 更多