라즈베리파이에서 셀레니움 크롤링을 눈으로 보기 — VNC + 가상 디스플레이 세팅
안녕하세요, 천상나타입니다.
시리즈 앞 글들에서 SD 슬롯 고장난 파이를 USB 부팅으로 살리고, 첫 부팅을 완전 자동화한 얘기를 했는데요. 이번엔 그 파이에 Jenkins와 셀레니움 크롤러를 올린 뒤, 헤드리스인데도 브라우저가 움직이는 걸 눈으로 보게 만든 세팅입니다.
자동화 잡이 진짜로 사이트를 여는지, 캡차에 막히는지, 어디서 멈추는지를 확인하려면 화면이 필요한데 — Lite 이미지엔 GUI가 아예 없거든요. xvfb-run으로 임시 가상 화면을 만드는 방법도 있지만, 그건 실행할 때만 생기고 끝나면 사라지는 거라 "지금 뭐 하고 있는지"는 볼 수 없습니다.
그래서 고정된 가상 디스플레이 + VNC 서버를 만들어서, 맥에서 파이의 화면에 상시 접속하게 했습니다.
첫 시도: Xvfb + x11vnc — 됐다가 안 됐다
직관적인 조합부터 썼습니다:
Xvfb :1— 가상 X 서버를 띄워서 화면 없이 GUI 프로그램이 그려지게 함x11vnc— 그 :1 화면을 VNC로 중계
동작은 했어요 — VNC로 접속하면 가상 데스크톱이 보였습니다. 문제는 부팅 때마다 죽는 것. 로그를 보니 x11vnc가 Xvfb보다 먼저 뜨면서 연결할 화면이 없어 죽거나, MIT-SHM BadAccess 에러로 브라우저가 창을 못 띄웠어요.
원인은 구조 자체에 있었습니다 — x11vnc는 "이미 존재하는 X 서버의 화면을 중계"하는 도구라, 중계 대상이 먼저 준비돼야 합니다. systemd로 순서를 맞춰도 타이밍이 불안정했어요.
정착: TigerVNC + openbox — X서버를 VNC가 직접 띄운다
답은 중계가 아니라 생성이었습니다. TigerVNC의 Xvnc는 VNC 서버와 가상 X 서버가 한 프로세스라 — 시작 순서 문제가 아예 없습니다.
구성은 이렇게 했어요:
# 1) TigerVNC + 최소 창 관리자 + 한글 폰트
sudo apt install tigervnc-standalone-server openbox fonts-noto-cjk
# 2) VNC 비밀번호 설정 (8자 제한 주의)
vncpasswd ~/.config/tigervnc/passwd
# 3) :1 세션에서 openbox가 창을 관리하도록
cat > ~/.config/tigervnc/xstartup <<'SH'
#!/bin/sh
unset SESSION_MANAGER
openbox &
SH
chmod +x ~/.config/tigervnc/xstartup
# 4) systemd 서비스로 부팅 시 자동 기동
vncserver -localhost no :1
포인트 몇 가지:
~/.vncvs~/.config/tigervnc— 최신 버전은 후자를 씁니다. 전자에 파일을 만들면 "마이그레이션 실패"로 안 뜹니다(이것도 삽질했어요)- 비밀번호 8자 제한 —
vncpasswd가 8자 이상을 받아도 실제론 8자까지만 저장됩니다 -localhost no— 이거 없으면 로컬호스트만 들어요. 같은 네트워크의 맥에서 접속하려면 필수

맥에서 접속 — 앱 설치 필요 없음
맥은 VNC 클라이언트가 내장돼 있습니다. Finder에서 ⌘+K(서버에 연결) → vnc://192.168.45.253:5901 입력하면 화면공유가 바로 뜨고 비밀번호 넣으면 파이의 가상 데스크톱이 보여요.
처음엔 브라우저가 안 보이는 빈 화면만 나왔는데 — openbox가 창 관리만 하는 최소 환경이라 그렇습니다. 크롬을 띄우면 그제서야 창이 생겼어요:
DISPLAY=:1 chromium-browser --no-sandbox https://www.google.com &
VNC 화면에 크롬 창이 실제로 뜨는 걸 확인했습니다 — headless 파이에서 GUI가 살아있다는 증거.
진짜 목적: 셀레니움 크롤러를 눈으로 보기
이제 본론 — Jenkins에서 돌던 성북구 크롤링 스크립트를 VNC 화면에서 실행해 봤습니다.
DISPLAY=:1 venv/bin/python3 SbSubscription.py
이 한 줄이 다입니다. 셀레니움이 chromedriver를 통해 chromium을 띄우는데, DISPLAY=:1이 잡아서 창을 가상 디스플레이에 그립니다. 그리고 그 화면을 VNC가 중계하니까 — 맥 화면에서는 크롤러가 사이트를 열고, 스크롤하고, 버튼을 누르는 게 실시간으로 보였어요.

왜 이게 필요했냐면:
- 크롤러가 조용히 실패할 때 — 로그에 "element not found"만 뜨면 원인을 추측해야 하는데, 화면 보면 "아 사이트 구조가 바뀌어서 버튼이 없구나"가 바로 보입니다
- 캡차·봇 탐지 확인 — headless에서만 나오는 차단 화면이 있는지 직접 확인 가능
- 디버깅 중 브라우저 상태를 유지한 채로 다른 터미널에서 로그 확인 가능
나중에 잡을 Jenkins에 올릴 땐 xvfb-run -a로 돌리면 됩니다 — 실행마다 임시 화면을 만들고 정리하니까 부담이 없어요. 개발·검증할 땐 VNC로 보고, 운영할 땐 xvfb-run으로 하는 게 제 결론입니다.
추가로 겪은 사소한 문제들
- 한글 깨짐 — 처음엔 사이트 한글이 전부 네모(□)로 나왔습니다. Lite 이미지엔 폰트가 빈 거나 마찬가지라
fonts-noto-cjk하나 설치로 해결 - VNC 비밀번호 입력 안 됨 — 맥 화면공유에서 붙여넣기가 안 먹혀서 직접 타이핑. 8자 제한 때문에 짧은 비밀번호로 해두길 잘했습니다
- 화면 공유 끊김 후 재접속 — vncserver는 데몬으로 돌고 있어서 끊겨도 세션은 유지됩니다. 다시 접속하면 하던 화면이 그대로 있어요
정리
헤드리스 파이에서 브라우저 자동화를 돌릴 때 "눈으로 보는" 건 사치가 아니라 디버깅 도구입니다. 정리하면:
Xvfb+x11vnc중계 방식은 시작 순서·MIT-SHM 문제로 불안정 →TigerVNC+openbox가 정답vncserver :1로 고정 가상 디스플레이를 만들고,DISPLAY=:1로 GUI 프로그램을 띄움- 맥은 내장 화면공유로
vnc://IP:5901접속 — 별도 앱 없이 바로 - 개발·검증할 땐 눈으로 보고, Jenkins 운영 잡은
xvfb-run -a로 headless 유지
이걸로 파이 세팅 시리즈는 마무리입니다 — 죽은 슬롯 우회, 첫 부팅 자동화, 눈으로 보는 크롤링까지. 이제 이 파이는 Jenkins + 크롤러 + Tailscale 원격 접속까지 갖춘 완전한 작업 서버가 됐어요.
'IT > Linux' 카테고리의 다른 글
| 라즈베리파이 첫 부팅 완전 자동화 — firstrun.sh로 WiFi·계정·SSH 한 번에 세팅 (0) | 2026.11.15 |
|---|---|
| SD 슬롯이 고장난 라즈베리파이 살리기 — 카드리더 USB 부팅으로 우회한 후기 (0) | 2026.11.15 |
| Linux 환경에서 VI 에디터 없이 사용하는 방법 (0) | 2023.04.04 |
| 리눅스 iptables 포트포워딩 간략 정리 (port foward) (0) | 2018.10.17 |
| 리눅스 자주 쓰는 명령어 alias주기(톰켓 실시간 로그 출력) (0) | 2018.03.12 |