소개 및 아키텍처 개요
루팅 없는 안드로이드 네이티브 헤드리스 브라우저 자동화 및 스텔스 웹 스크래핑 엔진
1줄 빠른 설치 가이드
공식 패키지 매니저를 통해 즉시 단말기 환경에 설치하세요:
# 파이썬 공식 패키지 매니저
pip install termux-playwright
# Node.js 공식 패키지 매니저
npm install termux-playwright
기술적 당면 과제
모바일 환경에서 웹 브라우저를 자동화하려면 무거운 데스크톱 가상 머신(X11/VNC)이 필요했고, 일반적인 봇 탐지 시스템에 의해 모바일 IP와 세션이 빈번하게 차단되는 한계가 있었습니다.
아키텍처 혁신 및 기술 돌파구
Android ARM64 네이티브 Chromium을 CDP(Chrome DevTools Protocol)로 직접 제어하고 터널 바이패스 스텔스 파이프라인을 구축하여, 가상 머신이나 루팅 없이도 완벽한 모바일 웹 자동화를 실현합니다.
핵심 가치 제안 (Why It Matters)
컴퓨터 켜지 않고 누워서 폰 하나로 원하는 웹사이트 정보만 쏙쏙 모아보세요. 어려운 환경 설정이나 차단 걱정 없이, 내 스마트폰 터미널이 스스로 알아서 웹을 누비는 똑똑한 맞춤형 비서가 됩니다.
주요 기능 및 하드웨어 강화
루팅 없는 네이티브 헤드리스 브라우징
PRoot나 chroot 리눅스 컨테이너 없이 안드로이드 순수 샌드박스 내부에서 안전하게 실행됩니다.
스텔스 안티-봇 탐지 우회
자동화 플래그를 은닉하고 실제 모바일 크롬 브라우저와 동일한 핑거프린트를 생성하여 차단을 회피합니다.
비동기 고속 스크린샷 및 PDF 생성
웹페이지 렌더링 결과를 완벽한 해상도의 스크린샷과 PDF 문서로 즉시 저장합니다.
폼 자동 입력 및 세션 영구 보존
로그인 세션과 쿠키를 로컬에 암호화 저장하여 매번 로그인할 필요 없이 연속된 작업을 수행합니다.
초경량 메모리 제어 아키텍처
브라우저 탭과 프로세스를 정밀 제어하여 모바일 메모리 한도 내에서 가볍게 유지됩니다.
지원 연산 커널 및 하드웨어 가속 매트릭스
| 서브시스템 분류 | 지원 연산 및 가속 커널 | 상태 |
|---|---|---|
| CDP WebSocket Transport | 초당 수천 건의 브라우저 DOM 조작 명령을 전송하는 저지연 파이프 | 프로덕션 안정 |
| Stealth Fingerprint Evasion | WebRTC 누출 방지 및 캔버스 핑거프린트 지터 자동 주입 | 프로덕션 안정 |
| DOM Mutation Observer | 페이지 비동기 렌더링 완료 상태를 보장하는 스마트 대기 큐 | 프로덕션 안정 |
| Zero-Subprocess IPC Pool | 다중 브라우저 인스턴스를 격리 관리하는 고신뢰성 프로세스 매니저 | 프로덕션 안정 |
표준 사용 예제 (Python & Node.js)
Python (pip) 사용 예제
from termux_playwright import PlaywrightEngine
# 1. 스텔스 모바일 브라우저 세션 초기화
with PlaywrightEngine(headless=True, stealth=True) as browser:
page = browser.new_page()
page.goto("https://news.google.com")
# 2. 웹페이지 제목 및 주요 기사 헤드라인 수집
titles = page.query_selector_all("article h3")
print(f"[수집된 헤드라인 {len(titles)}건]:")
for t in titles[:5]:
print(f" - {t.inner_text()}")
# 3. 모바일 화면 캡처
page.screenshot(path="news_mobile.png")
print("[완료] 스크린샷이 news_mobile.png로 저장되었습니다.")
Node.js (npm) 사용 예제
const { PlaywrightEngine } = require('termux-playwright');
async function main() {
const browser = new PlaywrightEngine({ headless: true });
await browser.launch();
const page = await browser.newPage();
await page.goto('https://news.google.com');
console.log(`[페이지 제목]: ${await page.title()}`);
await browser.close();
}
main();