MCPcopy
hub / github.com/scrapy/scrapy / close_spider_async

Method close_spider_async

scrapy/core/engine.py:595–686  ·  view source on GitHub ↗

Close (cancel) spider and clear all its outstanding requests. .. versionadded:: 2.14

(self, *, reason: str = "cancelled")

Source from the content-addressed store, hash-verified

593 return deferred_from_coro(self.close_spider_async(reason=reason))
594
595 async def close_spider_async(self, *, reason: str = "cancelled") -> None: # noqa: PLR0912
596 """Close (cancel) spider and clear all its outstanding requests.
597
598 .. versionadded:: 2.14
599 """
600 if self.spider is None:
601 raise RuntimeError("Spider not opened")
602
603 if self._slot is None:
604 raise RuntimeError("Engine slot not assigned")
605
606 if self._slot.closing is not None:
607 await maybe_deferred_to_future(self._slot.closing)
608 return
609
610 spider = self.spider
611
612 logger.info(
613 "Closing spider (%(reason)s)", {"reason": reason}, extra={"spider": spider}
614 )
615
616 try:
617 await self._slot.close()
618 except Exception:
619 logger.error("Slot close failure", exc_info=True, extra={"spider": spider})
620
621 try:
622 self.downloader.close()
623 except Exception:
624 logger.error(
625 "Downloader close failure", exc_info=True, extra={"spider": spider}
626 )
627
628 try:
629 await self.scraper.close_spider_async()
630 except Exception:
631 logger.error(
632 "Scraper close failure", exc_info=True, extra={"spider": spider}
633 )
634
635 if hasattr(self._slot.scheduler, "close"):
636 try:
637 if (d := self._slot.scheduler.close(reason)) is not None:
638 await maybe_deferred_to_future(d)
639 except Exception:
640 logger.error(
641 "Scheduler close failure", exc_info=True, extra={"spider": spider}
642 )
643
644 try:
645 await self.signals.send_catch_log_async(
646 signal=signals.spider_closed,
647 spider=spider,
648 reason=reason,
649 )
650 except Exception:
651 logger.error(
652 "Error while sending spider_close signal",

Callers 14

stop_asyncMethod · 0.95
close_asyncMethod · 0.95
_spider_idleMethod · 0.95
close_spiderMethod · 0.95
test_no_slotMethod · 0.95
test_no_spiderMethod · 0.95
test_exception_slotMethod · 0.95
test_exception_signalMethod · 0.95
test_exception_statsMethod · 0.95

Calls 9

maybe_deferred_to_futureFunction · 0.90
argument_is_requiredFunction · 0.90
global_object_nameFunction · 0.90
ensure_awaitableFunction · 0.90
infoMethod · 0.80
errorMethod · 0.80
send_catch_log_asyncMethod · 0.80
closeMethod · 0.45
close_spiderMethod · 0.45

Tested by 10

test_no_slotMethod · 0.76
test_no_spiderMethod · 0.76
test_exception_slotMethod · 0.76
test_exception_signalMethod · 0.76
test_exception_statsMethod · 0.76