7.3 进阶设置
现在,我们要探讨一些Scrapy中不太常见的方面,以及Scrapy扩展的相关设置,后续章节中会详细介绍这些内容。这些进阶设置如图7.2所示。
图7.2 Scrapy进阶设置
7.3.1 项目相关设置
在这里可以找到一些与具体项目相关的管理设置,如BOT_NAME、SPIDER_MODULES等。你可以快速浏览一下这些设置的文档,因为它们会提升具体用例的生产效率,不过通常情况下,Scrapy的startproject和genspider命令都已经提供了合理的默认值,即使不显式修改它们,也能很好地运行。邮件相关的设置,比如MAIL_FROM,可以让你配置MailSender类,该类目前用于统计邮件信息(另外参见STATSMAILER_RCPTS)以及内存使用信息(另外参见MEMUSAGE_NOTIFY_MAIL)。还有两个环境变量:SCRAPY_SETTINGS_MODULE以及SCRAPY_PROJECT,可以让你调整Scrapy项目与其他项目集成的方式,比如Django项目。scrapy.cfg还允许你调整设置模块的名称。
7.3.2 Scrapy扩展设置
这些设置能够让你扩展并修改Scrapy的几乎所有方面。这些设置中最重要的当属ITEM_PIPELINES。它可以让你在项目中使用Item处理管道。第9章会看到更多的例子。除了管道之外,还可以通过不同的方式扩展Scrapy,其中一些将会在第8章中进行总结。COMMANDS_MODULE允许我们添加常用命令。比如,可以在properties/hi.py文件中添加如下内容。
from scrapy.commands import ScrapyCommand class Command(ScrapyCommand): default_settings = {'LOG_ENABLED': False} def run(self, args, opts): print("hello")
当在settings.py文件中添加COMMANDS_MODULE='properties.hi'时,就激活了这个小命令,我们可以在Scrapy帮助中看到它,并且通过scrapy hi运行。在命令的default_settings中定义的设置,会被合并到项目的设置当中,并覆盖默认值,不过其优先级低于settings.py文件或命令行中设定的设置。
Scrapy使用-_BASE字典(比如FEED_EXPORTERS_BASE)存储不同框架扩展的默认值,并允许我们在settings.py文件或命令行中,通过设置它们的非-_BASE版本(比如FEED_EXPORTERS)进行自定义。
最后,Scrapy使用DOWNLOADER、SCHEDULER等设置,保存系统基本组件的包/类名。我们可以继承默认的下载器(scrapy.core.downloader.Downloader),重载一些方法,然后将DOWNLOADER设置为自定义的类。这样可以让开发者大胆地对新特性进行实验,并且可以简化自动化测试过程,不过除非你明确了解自己做的事情,否则不要轻易修改这些设置。
7.3.3 下载调优
RETRY_*、REDIRECT_*以及METAREFRESH_*设置分别用于配置重试、重定向以及元刷新中间件。例如,将REDIRECT_PRIORITY_ADJUST设为2,意味着每次发生重定向时,新请求将会在所有非重定向请求完成服务后才会被调度;而将REDIRECT_MAX_TIMES设置为20,则表示在执行20次重定向后,下载器将会放弃尝试,并返回目前所见到的内容。这些设置在爬取一些运行不太正常的网站时非常有用,不过在大多数情况下,默认值已经可以提供很好的服务了。它同样也适用于HTTPERROR_ALLOWED_CODES以及URLLENGTH_LIMIT。
7.3.4 自动限速扩展设置
AUTOTHROTTLE_*设置用于启用并配置自动限速扩展。虽然对它有很大期望,但从实践来看,我发现它往往有些保守,不容易调整。它使用下载延迟,来了解我们和目标服务器的负载情况,并据此调整下载器的延迟。如果你很难找到DOWNLOAD_DELAY的最佳值(默认为0),就会发现该模块很有用。
7.3.5 内存使用扩展设置
MEMUSAGE_*设置用于启用并配置内存使用扩展。当超出内存限制时,将会关闭爬虫。当运行在共享环境时,该设置非常有用,因为此时需要非常礼貌的行为。大多数情况下,你可能会发现它只有在接收报警邮件时才会有用,此时我们需要将MEMUSAGE_LIMIT_MB设置为0,禁用关闭爬虫的功能。该扩展只在类UNIX平台上适用。
MEMDEBUG_ENABLED和MEMDEBUG_NOTIFY用于启用并配置内存调试扩展,在爬虫关闭时打印出仍然存活的引用数量。总之,追踪内存泄露不是一件简单而有趣的事情(好吧,它还是有一些乐趣的)。我们可以阅读 Debugging memory leaks with trackref 这篇优秀的文档,了解更多内存泄露排查的方法,不过最重要的建议是,保持你的爬虫相对简短、批量处理,并且需要根据服务器的能力运行。我认为没有什么好的理由可以让我们批量运行超过几千页或几分钟。
7.3.6 日志和调试
最后,还有一些日志和调试功能。LOG_ENCODING、LOG_DATEFORMAT和LOG_FORMAT可以用来调整日志格式,当准备使用日志管理解决方案时(比如Splunk、Logstash和Kibana),会发现这些设置非常有用。DUPEFILTER_DEBUG和COOKIES_ DEBUG将会帮助你调试相对复杂的情况,比如得到的请求数少于预期或会话意外丢失。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论