Close (cancel) spider and clear all its outstanding requests. .. versionadded:: 2.14
(self, *, reason: str = "cancelled")
| 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", |