| 528 | return deferred_from_coro(self.open_spider_async(close_if_idle=close_if_idle)) |
| 529 | |
| 530 | async def open_spider_async(self, *, close_if_idle: bool = True) -> None: |
| 531 | assert self.crawler.spider |
| 532 | if self._slot is not None: |
| 533 | raise RuntimeError( |
| 534 | f"No free spider slot when opening {self.crawler.spider.name!r}" |
| 535 | ) |
| 536 | logger.info("Spider opened", extra={"spider": self.crawler.spider}) |
| 537 | self.spider = self.crawler.spider |
| 538 | nextcall = CallLaterOnce(self._start_scheduled_requests) |
| 539 | scheduler = build_from_crawler(self.scheduler_cls, self.crawler) |
| 540 | self._slot = _Slot(close_if_idle, nextcall, scheduler) |
| 541 | self._start = await self.scraper.spidermw.process_start() |
| 542 | if hasattr(scheduler, "open") and (d := scheduler.open(self.crawler.spider)): |
| 543 | await maybe_deferred_to_future(d) |
| 544 | await self.scraper.open_spider_async() |
| 545 | assert self.crawler.stats |
| 546 | if argument_is_required(self.crawler.stats.open_spider, "spider"): |
| 547 | warnings.warn( |
| 548 | f"The open_spider() method of {global_object_name(type(self.crawler.stats))} requires a spider argument," |
| 549 | f" this is deprecated and the argument will not be passed in future Scrapy versions.", |
| 550 | ScrapyDeprecationWarning, |
| 551 | stacklevel=2, |
| 552 | ) |
| 553 | self.crawler.stats.open_spider(spider=self.crawler.spider) |
| 554 | else: |
| 555 | self.crawler.stats.open_spider() |
| 556 | await self.signals.send_catch_log_async( |
| 557 | signals.spider_opened, spider=self.crawler.spider |
| 558 | ) |
| 559 | |
| 560 | def _spider_idle(self) -> None: |
| 561 | """ |