扩展
扩展框架提供了一种将自己的自定义功能插入到Scrapy中的机制。
扩展只是在Scrapy启动时实例化的常规类,当扩展被初始化时。
扩展设置
扩展程序使用Scrapy设置来管理其设置,就像任何其他Scrapy代码一样。
扩展程序通常以其自己的名称对其设置进行前缀,以避免与现有(和未来)扩展名冲突。例如,处理Google Sitemaps的假设扩展将使用GOOGLESITEMAP_ENABLED,GOOGLESITEMAP_DEPTH等设置。
加载和激活扩展
通过实例化扩展类的单个实例,在启动时加载和激活扩展。因此,所有扩展初始化代码必须在类构造函数(__init__方法)中执行。
要使扩展程序可用,请将其添加到Scrapy设置中的EXTENSIONS设置。在EXTENSIONS中,每个扩展名由一个字符串表示:扩展名类的完整Python路径。例如:
EXTENSIONS = {
'scrapy.extensions.corestats.CoreStats':500,
'scrapy.extensions.telnet.TelnetConsole':500,
}
您可以看到,EXTENSIONS设置是一个dict,其中的键是扩展路径,它们的值是订单,用于定义扩展加载顺序。 EXTENSIONS设置与Scrapy中定义的EXTENSIONS_BASE设置合并(并不意味着被覆盖),然后按顺序排序以获得已启用扩展的最终排序列表。
由于扩展通常不依赖于彼此,它们的加载顺序在大多数情况下是无关紧要的。这就是为什么EXTENSIONS_BASE设置定义了所有具有相同顺序(0)的扩展。但是,如果您需要添加依赖于已加载的其他扩展名的扩展名,则可以利用此功能。
可用,启用和禁用的扩展
并非所有可用的扩展程序都将启用。其中一些通常取决于特定的设置。例如,默认情况下HTTP缓存扩展可用,但禁用,除非设置了HTTPCACHE_ENABLED设置。
禁用扩展
为了禁用默认启用的扩展(即EXTENSIONS_BASE设置中包含的扩展名),您必须将其顺序设置为“无”。例如:
EXTENSIONS = {
'scrapy.extensions.corestats.CoreStats':无,
}
编写自己的扩展名
每个扩展都是一个Python类。 Scrapy扩展的主要入口点(也包括中间件和流水线)是from_crawler类方法,它接收Crawler实例。通过Crawler对象,您可以访问设置,信号,统计信息,还可以控制爬网行为。
通常,扩展连接到信号并执行由它们触发的任务。
最后,如果from_crawler方法引发NotConfigured异常,扩展将被禁用。否则,扩展将被启用。
示例扩展
这里我们将实现一个简单的扩展来说明上一节中描述的概念。此扩展程序将每次都会记录一条消息:
一只蜘蛛打开
一只蜘蛛关闭
特定数量的物品被刮
扩展程序将通过MYEXT_ENABLED设置启用,项目数将通过MYEXT_ITEMCOUNT设置进行指定。
以下是此类扩展的代码:
内置扩展引用
通用扩展
日志统计信息扩展
class scrapy.extensions.logstats.LogStats
记录基本统计信息,例如抓取的网页和已刮取的项目。
核心统计扩展
class scrapy.extensions.corestats.CoreStats
只要已启用统计信息收集功能,请启用核心统计信息的收集(请参阅统计信息收集)。
Telnet控制台扩展
class scrapy.extensions.telnet.TelnetConsole
提供一个telnet控制台,用于在当前正在运行的Scrapy进程中进入Python解释器,这对调试非常有用。
必须通过TELNETCONSOLE_ENABLED设置启用telnet控制台,服务器将侦听TELNETCONSOLE_PORT中指定的端口。
内存使用扩展
class scrapy.extensions.memusage.MemoryUsage
注意
此扩展在Windows中不起作用。
监视运行蜘蛛的Scrapy进程使用的内存:
当超过一定值时发送通知电子邮件
当蜘蛛超过一定值时关闭蜘蛛
当达到某个警告值(MEMUSAGE_WARNING_MB)和达到最大值(MEMUSAGE_LIMIT_MB)时,可以触发通知电子邮件,这也将导致蜘蛛关闭,并且Scrapy进程被终止。
此扩展名由MEMUSAGE_ENABLED设置启用,可以使用以下设置进行配置:
MEMUSAGE_LIMIT_MB
MEMUSAGE_WARNING_MB
MEMUSAGE_NOTIFY_MAIL
MEMUSAGE_CHECK_INTERVAL_SECONDS
内存调试器扩展
class scrapy.extensions.memdebug.MemoryDebugger
用于调试内存使用的扩展。它收集有关以下信息:
Python垃圾回收器未收到的对象
活着的对象不应该。有关更多信息,请参阅使用trackref调试内存泄漏
要启用此扩展程序,请打开MEMDEBUG_ENABLED设置。信息将被存储在统计信息中。
关闭蜘蛛扩展
class scrapy.extensions.closespider.CloseSpider
在满足某些条件时自动关闭一个蜘蛛,使用每个条件的特定关闭原因。
关闭蜘蛛的条件可以通过以下设置进行配置:
CLOSESPIDER_TIMEOUT
CLOSESPIDER_ITEMCOUNT
CLOSESPIDER_PAGECOUNT
CLOSESPIDER_ERRORCOUNT
CLOSESPIDER_TIMEOUT
默认值:0
一个指定秒数的整数。如果蜘蛛保持打开超过这个秒数,它将被自动关闭,原因是shutpider_timeout。如果为零(或未设置),则蜘蛛不会被超时关闭。
CLOSESPIDER_ITEMCOUNT
默认值:0
一个整数,用于指定一些项目。如果蜘蛛超过该数量,并且这些物品被物料管道传递,蜘蛛将被关闭,原因是shutpider_itemcount。当前在下载队列中(最多CONCURRENT_REQUESTS个请求)的请求仍然被处理。如果为零(或非设置),则蜘蛛不会被传递的项目的数量关闭。
CLOSESPIDER_PAGECOUNT
0.11版新功能
默认值:0
一个整数,指定爬网响应的最大数量。如果蜘蛛爬得更多,蜘蛛会被关闭,因为shutpider_pagecount。如果为零(或未设置),则蜘蛛不会被爬网响应的数量关闭。
CLOSESPIDER_ERRORCOUNT
0.11版新功能
默认值:0
一个整数,它指定在关闭蜘蛛之前要接收的最大错误数。如果蜘蛛生成的错误数量超过了这个数量,那么将关闭它的原因是shutpider_errorcount。如果为零(或未设置),则蜘蛛不会被错误的数量关闭。
StatsMailer扩展
class scrapy.extensions.statsmailer.StatsMailer
每次域名完成刮取时,这个简单的扩展可用于发送通知电子邮件,包括收集的Scrapy统计信息。电子邮件将发送到STATSMAILER_RCPTS设置中指定的所有收件人。
调试扩展
堆栈跟踪转储扩展
class scrapy.extensions.debug.StackTraceDump
当接收到SIGQUIT或SIGUSR2信号时,转储运行过程的信息。倾销的信息如下:
引擎状态(使用scrapy.utils.engine.get_engine_status())
实时参考(请参阅使用trackref调试内存泄漏)
所有线程的堆栈跟踪
堆栈跟踪和引擎状态转储后,Scrapy进程将继续正常运行。
此扩展仅适用于符合POSIX的平台(即不是Windows),因为SIGQUIT和SIGUSR2信号在Windows上不可用。
至少有两种方式可以发送Scrapy SIGQUIT信号:
当Scrapy进程正在运行时,按Ctrl键?仅限Linux?
通过运行此命令(假设<pid>是Scrapy进程的进程标识):
kill -QUIT <pid>
调试器扩展
class scrapy.extensions.debug.Debugger
当接收到SIGUSR2信号时,在正在运行的Scrapy进程内调用一个Python调试器。调试器退出后,Scrapy进程继续正常运行。
有关更多信息,请参阅Python中的调试。
此扩展仅适用于符合POSIX的平台(即Windows)。