{"record":{"id":"005783263e9b1704","repo":"NanmiCoder/MediaCrawler","slug":"playwright-page-is-required-for-browser-based-crea-005783","errorCode":null,"errorMessage":"playwright_page is required for browser-based creator notes fetching","messagePattern":"playwright_page is required for browser-based creator notes fetching","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"media_platform/tieba/client.py","lineNumber":692,"sourceCode":"                    \"_client_type\": \"20\",\n                },\n                use_sign=True,\n            )\n            return self._page_extractor.extract_creator_info_from_api(api_data)\n\n        except Exception as e:\n            utils.logger.error(f\"[BaiduTieBaClient.get_creator_info_by_url] Failed to get creator info: {e}\")\n            raise\n\n    async def get_notes_by_creator_portrait(\n        self, portrait: str, page_number: int, page_size: int = 20\n    ) -> Dict:\n        \"\"\"\n        Get creator's thread feed by creator portrait from current PC JSON API.\n        \"\"\"\n        if not self.playwright_page:\n            utils.logger.error(\"[BaiduTieBaClient.get_notes_by_creator_portrait] playwright_page is None, cannot use browser mode\")\n            raise Exception(\"playwright_page is required for browser-based creator notes fetching\")\n\n        utils.logger.info(\n            f\"[BaiduTieBaClient.get_notes_by_creator_portrait] Accessing creator feed API, \"\n            f\"portrait: {portrait}, page: {page_number}\"\n        )\n        return await self._fetch_json_by_browser(\n            \"/c/u/feed/myThread\",\n            params={\n                \"pn\": page_number,\n                \"rn\": page_size,\n                \"portrait\": portrait,\n                \"type\": 1,\n                \"un\": \"\",\n                \"subapp_type\": \"pc\",\n                \"_client_type\": \"20\",\n            },\n            use_sign=True,\n        )","sourceCodeStart":674,"sourceCodeEnd":710,"githubUrl":"https://github.com/NanmiCoder/MediaCrawler/blob/d6f7c5bb906b6dac40ddf343ef9e26438a3de092/media_platform/tieba/client.py#L674-L710","documentation":"Raised by BaiduTieBaClient.get_notes_by_creator_portrait (media_platform/tieba/client.py:692) when self.playwright_page is None. The creator thread feed (/c/u/feed/myThread) is fetched through the browser session to inherit cookies and defeat API detection, so a live Playwright page is required. It is the feed-level guard; the caller get_all_notes_by_creator_url passes the portrait in after its own extraction.","triggerScenarios":"Calling get_notes_by_creator_portrait(portrait, page_number) directly on a client without a page, or reaching it via get_all_notes_by_creator_url when the browser was never started/closed.","commonSituations":"Creator crawls launched before login completes; browser crash or manual close mid-crawl leaving playwright_page unset/stale; scripts calling the low-level API method without the standard crawler bootstrap.","solutions":["Run the standard browser+login bootstrap so the client holds a live page before creator feed calls","Guard caller code: skip or re-initialize the browser when client.playwright_page is missing","Ensure Playwright and its Chromium build are installed in the deployment environment"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"if not client.playwright_page or client.playwright_page.is_closed():\n    client.playwright_page = await browser_context.new_page()","typeGuard":"def feed_fetch_ready(client) -> bool:\n    p = getattr(client, \"playwright_page\", None)\n    return p is not None and not p.is_closed()","tryCatchPattern":null,"preventionTips":["Ensure the login flow owning the browser context finished before creator feed paging","Watch for browser crashes during long creator crawls and re-initialize"],"tags":["playwright","tieba","creator","browser-context","validation"],"backgroundTag":null,"analyzedSha":"d6f7c5bb906b6dac40ddf343ef9e26438a3de092","analyzedAt":"2026-08-15T01:39:07.505Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}