【问题标题】:Scrapy no such host crawlerScrapy 没有这样的主机爬虫
【发布时间】:2014-10-28 09:31:46
【问题描述】:
【问题讨论】:
标签:
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 中的一个新文件中。然后我对我感兴趣的错误代码进行了“查找全部”。
选择错误代码的所有实例后,我只是将选择扩展到整行,然后将其复制并粘贴到另一个纯文本文件中,该文件相当于返回错误的所有链接/域的列表我感兴趣的代码。