Record worker browser sessions
This commit is contained in:
+29
-4
@@ -20,6 +20,7 @@ from selenium.webdriver.chrome.options import Options
|
||||
from selenium_stealth import stealth
|
||||
|
||||
from config import config
|
||||
from crawler.recording import SessionRecorder
|
||||
from logger import get_logger
|
||||
|
||||
log = get_logger(__name__)
|
||||
@@ -88,6 +89,7 @@ def _build_options(
|
||||
headless: bool,
|
||||
chrome_binary: str,
|
||||
profile_dir: str | None = None,
|
||||
display: str | None = None,
|
||||
) -> Options:
|
||||
opts = Options()
|
||||
opts.binary_location = chrome_binary
|
||||
@@ -96,6 +98,9 @@ def _build_options(
|
||||
opts.add_argument("--headless=new")
|
||||
if profile_dir:
|
||||
opts.add_argument(f"--user-data-dir={profile_dir}")
|
||||
if display:
|
||||
opts.add_argument(f"--display={display}")
|
||||
opts.add_argument("--ozone-platform=x11")
|
||||
opts.add_argument(f"--user-agent={user_agent}")
|
||||
opts.add_argument("--no-sandbox")
|
||||
opts.add_argument("--disable-gpu")
|
||||
@@ -109,12 +114,13 @@ def _build_options(
|
||||
def make_driver(
|
||||
headless: bool | None = None,
|
||||
profile_dir: str | None = None,
|
||||
display: str | None = None,
|
||||
) -> uc.Chrome:
|
||||
"""Return a stealthed undetected Chrome instance."""
|
||||
use_headless = config.headless if headless is None else headless
|
||||
chrome_binary, major = _detect_chrome()
|
||||
ua = random.choice(_USER_AGENTS)
|
||||
opts = _build_options(ua, use_headless, chrome_binary, profile_dir)
|
||||
opts = _build_options(ua, use_headless, chrome_binary, profile_dir, display)
|
||||
|
||||
log.debug("Starting ChromeDriver (headless=%s, Chrome %d)", use_headless, major)
|
||||
|
||||
@@ -125,7 +131,9 @@ def make_driver(
|
||||
use_subprocess=True,
|
||||
)
|
||||
|
||||
if not use_headless:
|
||||
if display:
|
||||
driver.set_window_size(1920, 1080)
|
||||
elif not use_headless:
|
||||
driver.maximize_window()
|
||||
else:
|
||||
driver.set_window_size(1920, 1080)
|
||||
@@ -180,11 +188,26 @@ def _terminate_profile_processes(profile_dir: str) -> None:
|
||||
|
||||
|
||||
@contextmanager
|
||||
def driver_session(headless: bool | None = None) -> Generator[uc.Chrome, None, None]:
|
||||
def driver_session(
|
||||
headless: bool | None = None,
|
||||
recording_name: str | None = None,
|
||||
) -> Generator[uc.Chrome, None, None]:
|
||||
profile_dir = tempfile.mkdtemp(prefix="seed-chrome-")
|
||||
driver: uc.Chrome | None = None
|
||||
recorder: SessionRecorder | None = None
|
||||
display: str | None = None
|
||||
effective_headless = config.headless if headless is None else headless
|
||||
try:
|
||||
driver = make_driver(headless, profile_dir=profile_dir)
|
||||
if config.record_sessions:
|
||||
recorder = SessionRecorder(recording_name)
|
||||
if recorder.start():
|
||||
display = recorder.display
|
||||
effective_headless = False
|
||||
driver = make_driver(
|
||||
effective_headless,
|
||||
profile_dir=profile_dir,
|
||||
display=display,
|
||||
)
|
||||
yield driver
|
||||
finally:
|
||||
_terminate_profile_processes(profile_dir)
|
||||
@@ -194,6 +217,8 @@ def driver_session(headless: bool | None = None) -> Generator[uc.Chrome, None, N
|
||||
except Exception as exc:
|
||||
log.warning("Driver shutdown error: %s", exc)
|
||||
_terminate_profile_processes(profile_dir)
|
||||
if recorder is not None:
|
||||
recorder.stop()
|
||||
shutil.rmtree(profile_dir, ignore_errors=True)
|
||||
log.debug("Driver session closed")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user