信号¶
Scrapy广泛地使用信号来通知何时发生某些事件。您可以在Scrapy项目中捕获一些信号(例如使用 延期)执行其他任务,或者扩展Scrapy以添加开箱即用的功能。
即使信号提供了几个参数,捕获它们的处理程序不需要接受所有的参数 - 信号分配机制将仅传递处理程序接收的参数。
您可以通过 信号API 连接到信号(或发送自己的信号)。
这里是一个简单的例子,显示如何捕获信号和执行一些操作:
from scrapy import signals
from scrapy import Spider
class DmozSpider(Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/",
]
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = super(DmozSpider, cls).from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
return spider
def spider_closed(self, spider):
spider.logger.info('Spider closed: %s', spider.name)
def parse(self, response):
pass
延迟信号处理程序¶
一些信号支持从他们的处理程序返回 Twisted deferreds,见下面的 内置信号参考 知道哪些。
内置信号参考¶
这里是Scrapy内置信号及其含义的列表。
engine_started¶
-
scrapy.signals.
engine_started
()¶ 当Scrapy引擎开始抓取时发送。
此信号支持从处理程序返回延迟。
注解
该信号可以被发射 after 的 spider_opened
信号,这取决于如何启动蜘蛛。所以 别 依靠这个信号在 spider_opened
之前被触发。
item_scraped¶
item_dropped¶
spider_closed¶
-
scrapy.signals.
spider_closed
(spider, reason)¶ 在蜘蛛关闭后发送。这可以用于释放在
spider_opened
上保留的每个spider资源。此信号支持从处理程序返回延迟。
参数: - spider (
Spider
object) – 已经关闭的蜘蛛 - reason (str) – 一个描述蜘蛛关闭的原因的字符串。如果它被关闭,因为蜘蛛已经完成刮,原因是
'finished'
。否则,如果通过调用close_spider
引擎方法手动关闭了蜘蛛,那么原因是在该方法的reason
参数中传递的参数(默认为'cancelled'
)。如果引擎关闭(例如,通过按Ctrl-C停止它),原因将是'shutdown'
。
- spider (
spider_opened¶
spider_idle¶
-
scrapy.signals.
spider_idle
(spider)¶ 当蜘蛛闲置时发送,这意味着蜘蛛没有进一步:
请求正在等待下载
请求计划
项目管道中正在处理的项目
如果在该信号的所有处理程序完成之后空闲状态仍然存在,则发动机开始关闭该蜘蛛。在蜘蛛完成关闭后,发送
spider_closed
信号。例如,您可以在
spider_idle
处理程序中安排一些请求,以防止蜘蛛关闭。此信号不支持从处理程序返回延迟。
参数: spider ( Spider
object) – 已经空闲的蜘蛛