浏览器自动恢复逻辑
This commit is contained in:
@@ -96,7 +96,10 @@ class CloudflareSessionManager:
|
||||
return self._to_verified_session(existing)
|
||||
|
||||
logger.debug("创建新会话:session_name=%s force_refresh=%s", session_name, force_refresh)
|
||||
session = await self._create_verified_session(session_name=session_name, target_url=target_url)
|
||||
session = await self._build_with_browser_retry(
|
||||
f"创建验证会话({session_name})",
|
||||
lambda: self._create_verified_session(session_name=session_name, target_url=target_url),
|
||||
)
|
||||
return session
|
||||
|
||||
async def fetch_html(self, target_url: str) -> tuple[str, VerifiedSession]:
|
||||
@@ -135,9 +138,28 @@ class CloudflareSessionManager:
|
||||
return html, self._warm_to_session(warm)
|
||||
|
||||
logger.info("创建保活上下文:session_name=%s", session_name)
|
||||
warm, html = await self._build_warm_context(session_name, target_url)
|
||||
warm, html = await self._build_with_browser_retry(
|
||||
f"创建保活上下文({session_name})",
|
||||
lambda: self._build_warm_context(session_name, target_url),
|
||||
)
|
||||
return html, self._warm_to_session(warm)
|
||||
|
||||
async def _build_with_browser_retry(self, what: str, factory: Any) -> Any:
|
||||
"""执行 factory();若因浏览器断链失败,重建浏览器后整段重试一次。
|
||||
|
||||
factory 每次都从零创建上下文与页面(_build_warm_context / _create_verified_session
|
||||
均如此),故断链重建后重试是安全的。此层覆盖 new_page、goto、content 等
|
||||
「上下文创建之后」才发生的断链——这些阶段浏览器池内逐操作的重试无法触及。
|
||||
"""
|
||||
try:
|
||||
return await factory()
|
||||
except Exception as exc:
|
||||
if not BrowserPool.is_disconnect_error(exc):
|
||||
raise
|
||||
logger.warning("%s 因浏览器断链失败,重建后重试一次:err=%s", what, exc)
|
||||
await self._browser_pool.ensure_ready()
|
||||
return await factory()
|
||||
|
||||
async def _reuse_warm(self, session_name: str, target_url: str) -> tuple[str, WarmContext] | None:
|
||||
"""尝试复用已有保活上下文。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user