{"record":{"id":"b4630308aed0c219","repo":"D4Vinci/Scrapling","slug":"self-class-name-configure-sessions-did","errorCode":null,"errorMessage":"{self.__class__.__name__}.configure_sessions() did not add any sessions","messagePattern":"(.+?)\\.configure_sessions\\(\\) did not add any sessions","errorType":"exception","errorClass":"SessionConfigurationError","httpStatus":null,"severity":"error","filePath":"scrapling/spiders/spider.py","lineNumber":151,"sourceCode":"            Path(self.log_file).parent.mkdir(parents=True, exist_ok=True)\n            file_handler = logging.FileHandler(self.log_file)\n            file_handler.setFormatter(formatter)\n            self.logger.addHandler(file_handler)\n\n        self.crawldir: Optional[Path] = Path(crawldir) if crawldir else None\n        self._interval = interval\n        self._engine: Optional[CrawlerEngine] = None\n        self._original_sigint_handler: Any = None\n\n        self._session_manager = SessionManager()\n\n        try:\n            self.configure_sessions(self._session_manager)\n        except Exception as e:\n            raise SessionConfigurationError(f\"Error in {self.__class__.__name__}.configure_sessions(): {e}\") from e\n\n        if len(self._session_manager) == 0:\n            raise SessionConfigurationError(f\"{self.__class__.__name__}.configure_sessions() did not add any sessions\")\n\n        self.logger.info(\"Spider initialized\")\n\n    async def start_requests(self) -> AsyncGenerator[Request, None]:\n        \"\"\"Generate initial requests to start the crawl.\n\n        By default, this generates Request objects for each URL in `start_urls`\n        using the session manager's default session and `parse()` as callback.\n\n        Override this method for more control over initial requests\n        (e.g., to add custom headers, use different callbacks, etc.)\n        \"\"\"\n        if not self.start_urls:\n            raise RuntimeError(\n                \"Spider has no starting point, either set `start_urls` or override `start_requests` function.\"\n            )\n\n        for url in self.start_urls:","sourceCodeStart":133,"sourceCodeEnd":169,"githubUrl":"https://github.com/D4Vinci/Scrapling/blob/5d213a2d4764002bfc4fed33c32fe09fa8b0bf7f/scrapling/spiders/spider.py#L133-L169","documentation":"Spider.__init__ verifies that configure_sessions() registered at least one session. If your override returns without adding any session via manager.add(), the spider cannot fetch anything and init fails fast.","triggerScenarios":"Overriding configure_sessions(self, manager) but forgetting to call manager.add(...); conditional logic in the override that skipped all add() calls (e.g. an if branch that never ran); overriding only to inspect the manager without adding sessions.","commonSituations":"Copying a skeleton override from docs and not filling it in; scaffolding a new spider class with empty hook methods; early-return statements placed before add() calls.","solutions":["Call manager.add(id, session) at least once inside the override, e.g. manager.add(\"default\", FetcherSession())","If you don't need custom sessions, delete the override entirely — the base implementation registers a default FetcherSession"],"exampleFix":"// before\ndef configure_sessions(self, manager):\n    pass  # nothing added\n\n// after\ndef configure_sessions(self, manager):\n    manager.add(\"default\", FetcherSession())","handlingStrategy":"validation","validationCode":"def configure_sessions(self, manager):\n    manager.add(\"default\", FetcherSession())\n    assert len(manager) > 0, \"at least one session required\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["End every configure_sessions override with at least one manager.add call","Delete the override if the default session is sufficient"],"tags":["session","configuration","validation"],"backgroundTag":null,"analyzedSha":"5d213a2d4764002bfc4fed33c32fe09fa8b0bf7f","analyzedAt":"2026-08-14T22:23:09.440Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}