3단계

"3단계 진행해 보자."

Intro

좋습니다! 이제 3단계: Selenium + Headless 브라우저 환경 구성으로 넘어가겠습니다. 이 단계에서는 실제 웹 브라우저를 Docker 컨테이너 안에서 Headless 모드로 실행하여, JavaScript까지 렌더링되는 웹페이지를 제어하는 환경을 구성할 거예요.

✅ 3단계 목표 요약

목표 내용
Selenium 환경 구성 selenium/standalone-chrome Docker 이미지 사용
NAS Python 코드에서 원격으로 Selenium 제어 RemoteWebDriver로 연결
JavaScript 렌더링되는 웹페이지 크롤링 테스트 Google, YouTube, 동적 페이지 등 실습 가능

🧱 구성 아키텍처

NAS (Python 코드)  
   ⇅ (HTTP:4444)
Docker 컨테이너 (Selenium + Chrome Headless)

✅ Step-by-Step 실행

📥 1. Selenium Docker 이미지 다운로드

sudo docker pull selenium/standalone-chrome

이 이미지는 Chrome + WebDriver + VNC 서버가 모두 포함된 풀 패키지입니다.

🚀 2. Selenium 컨테이너 실행

sudo docker run -d --name selenium-chrome \
  -p 4444:4444 \
  selenium/standalone-chrome
  • 4444 포트는 WebDriver와 통신하는 포트입니다.
  • 컨테이너가 실행되면 Selenium Grid 서버가 열립니다.

상태 확인: http://<NAS_IP>:4444/status

🧪 3. NAS에서 Python 스크립트 작성 (selenium-test.py)

# selenium-test.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

options = Options()
options.add_argument("--headless")  # 창 없이 실행
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")

driver = webdriver.Remote(
    command_executor="http://<NAS_IP>:4444/wd/hub",
    options=options
)

driver.get("https://example.com")
print("Page title:", driver.title)
driver.quit()

반드시 <NAS_IP>를 실제 IP 주소로 바꿔주세요 (예: 192.168.0.201)

▶ 4. Python 실행 환경에서 테스트

sudo docker run -it --rm \
  -v /volume1/docker-scripts:/app \
  python:3.10 bash

컨테이너 내부에서:

cd /app
pip install selenium
python selenium-test.py

✅ 결과 기대 출력

Page title: Example Domain

→ 브라우저가 실제로 열리진 않지만 Headless Chrome이 해당 페이지를 받아서 제목을 출력한 것입니다. => 저자의 DNS에서는 example.com이 resolve되지 않았지만, chrome browser에서는 DNS over HTTPS (DoH) 또는 DNS over TLS (DoT) 사용 혹은 로컬 OS DNS 설정 무시하고 자체적으로 구글/클라우드플레어 등의 DNS를 사용할 수 있다고 한다.

📌 다음 가능 실습

  • 특정 요소 추출: driver.find_element(By.ID, "some-id")
  • 스크린샷 저장: driver.save_screenshot("page.png")
  • YouTube 같은 SPA(Single Page App) 페이지 분석

지금 실행해보시고, 잘 되면 4단계로 자동화 및 로그 저장으로 넘어가볼게요!
진행 중 오류가 있으면 어떤 메시지 나왔는지 공유해주시면 바로 도와드릴게요.

4 단계

"4단계 진행해 보자."

Intro

좋습니다! 이제 4단계: NAS 내부에서 Python 코드와 Selenium 컨테이너 연동 자동화로 넘어가겠습니다.

이 단계는 지금까지 구성한 환경을 실제 자동화 스크립트 형태로 정리하고,

  • NAS 공유 폴더에 코드/결과를 저장하고
  • 여러 번 실행해도 안정적으로 동작하도록 구성하는 것을 목표로 합니다.

✅ 4단계 목표 요약

항목 설명
Python 코드 자동 실행 크론탭이나 수동 실행이 가능한 형태로 구성
컨테이너 상태 자동 체크 Selenium 서버가 떠 있는지 확인
결과 저장 크롤링 결과 또는 스크린샷을 NAS에 저장
에러 시 재시도 또는 로그 저장 나중에 디버깅을 위해 남겨두기

✅ Step-by-Step

📁 1. NAS 공유 폴더 구조 설정 (예: /volume1/docker-scripts)

/volume1/docker-scripts/ -> 내환경은 /volume2/backups/scripts/
├── selenium-test.py
├── output/
│   ├── last_result.txt
│   └── page_screenshot.png
└── logs/
    └── run.log

필요한 하위 디렉토리를 미리 만들어주세요.

🐍 2. selenium-test.py 업데이트 (자동화 + 저장)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
import os
from datetime import datetime

# 설정
NAS_OUTPUT_DIR = "/app/output"
NAS_LOG_DIR = "/app/logs"
URL = "https://example.com"

# 로그 기록
def log(message):
    timestamp = datetime.now().strftime("[%Y-%m-%d %H:%M:%S]")
    with open(os.path.join(NAS_LOG_DIR, "run.log"), "a") as f:
        f.write(f"{timestamp} {message}\n")
    print(f"{timestamp} {message}")

try:
    log("Starting browser...")

    options = Options()
    options.add_argument("--headless")
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")

    driver = webdriver.Remote(
        command_executor="http://<NAS_IP>:4444/wd/hub",  # 실제 NAS IP 입력
        options=options
    )

    driver.get(URL)
    log(f"Accessed: {URL}")

    # 저장: 제목과 스크린샷
    title = driver.title
    with open(os.path.join(NAS_OUTPUT_DIR, "last_result.txt"), "w") as f:
        f.write(f"Page Title: {title}\n")

    screenshot_path = os.path.join(NAS_OUTPUT_DIR, "page_screenshot.png")
    driver.save_screenshot(screenshot_path)
    log(f"Saved screenshot to: {screenshot_path}")

    driver.quit()
    log("Browser closed.")

except Exception as e:
    log(f"ERROR: {e}")

🔁 <NAS_IP>는 반드시 실제 IP로 대체해주세요.
📁 /app/output, /app/logs는 Docker에서 마운트할 NAS 공유 폴더입니다.

🐳 3. Python 컨테이너에서 실행

sudo docker run -it --rm \
  -v /volume1/docker-scripts:/app \
  python:3.10 bash

컨테이너 내부에서:

cd /app
pip install selenium
python selenium-test.py

✅ 결과 확인

  • output/last_result.txt: 페이지 제목
  • output/page_screenshot.png: 렌더링된 스크린샷
  • logs/run.log: 실행 로그 기록

page_screenshot.png

🔄 자동 실행 팁 (선택)

추후 cron 또는 Synology의 작업 스케줄러(Task Scheduler) 를 이용해서 아래 명령을 정기적으로 실행 가능:

sudo docker run --rm \
  -v /volume1/docker-scripts:/app \
  python:3.10 python /app/selenium-test.py

셸 스크립트로 저장해두면 더 편리합니다

✅ 다음 단계로 준비되셨다면…

  • Selenium 대신 Playwright, Pyppeteer 등 대안 브라우저 사용
  • Selenium 컨테이너에서 Python까지 통합 실행
  • Docker Compose로 Selenium + Python 함께 구성 (5단계)

지금 자동화된 스크립트 실행해보시고, outputlogs에 결과 잘 남는지 확인해 보세요!
오류나 디테일 조정 원하시면 언제든지 도와드릴게요.

추가 단계

"자동 실행의 예에서는 selenium package 설치가 안되어 있어서 실패 할 것 같은데. 어떻게 생각해?"

이를 기반으로 Dockfile을 통해서 docker image를 만드는 방법을 알게 되었다.

"selenium beautifulsoup4 requests openai 까지 포함하는 docker image를 만드는 Dockerfile을 제안해줘. python-webscrap이라는 이름의 이미지로 만들었으면해. 추후에 이 이미지를 이용해서 news website를 bs4 혹은 selenium으로 scrapping하고 openai로 요약하는 작업을 해보려해."

Intro

멋진 계획입니다! 요청하신 대로 다음과 같은 Python 패키지들이 포함된 Docker 이미지를 만들기 위한 Dockerfile을 아래에 제안드립니다:

  • selenium
  • beautifulsoup4
  • requests
  • openai

이미지 이름은 python-webscrap으로 빌드할 수 있도록 구성하겠습니다.

✅ Dockerfile: python-webscrap

# 1. Python 3.10 베이스 이미지 사용
FROM python:3.10

# 2. 필수 패키지 설치
RUN pip install --no-cache-dir \
    selenium \
    beautifulsoup4 \
    requests \
    openai

# 3. 작업 디렉토리 설정 (선택 사항)
WORKDIR /app

📄 파일 이름 예시: /volume1/docker-scripts/Dockerfile-webscrap

✅ 이미지 빌드 방법

cd /volume1/docker-scripts -> 내 환경에서는 /volume2/backups/scripts
sudo docker build -t python-webscrap -f Dockerfile-webscrap .

-f 옵션은 Dockerfile 파일명이 기본값(Dockerfile)이 아닌 경우에 사용

✅ 이미지 실행 예시

sudo docker run -it --rm \
  -v /volume2/backups/scripts:/app \
  python-webscrap bash

이 실행 파일은 내 환경에 맞추고 interactive한 환경에서 python 명령어들을 테스트할 수 있게 하였다. 이 때, selenium-test.py와 openai-test.py를 테스트 해볼 수 있다.

from openai import OpenAI
import os

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY") or "YOUR KEY")
prompt = f"한국어로 3 문장 생성해줘."
try:
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}]
    )
    print(response.choices[0].message.content.strip())
except Exception as e:
    print(f"(생성 실패: {e})")

 

1단계 Docker 설치 및 실행

단계별로 접근할 때, 문의를 해본다.

"1단계 부터 해보자."

좋습니다! 1단계: Docker 기본 이해 및 Synology에서 사용법 익히기 단계부터 차근히 시작해보죠.

1단계: Synology NAS에서 Docker 기본 사용법 익히기

1-1. Docker 패키지 설치

  1. DSM(웹관리페이지)에 로그인
  2. 패키지 센터 > 검색창에 Docker 입력
  3. Docker 패키지를 설치
  4. 설치 후 "열기"를 눌러 Docker GUI 실행

1-2. 첫 Docker 이미지 실행 (hello-world or nginx)

(1) Docker에서 이미지 검색 및 다운로드

  • Docker GUI > 레지스트리 탭 클릭
  • nginx 검색 > nginx:latest 선택 후 다운로드

(2) 이미지 실행 (포트 매핑 포함)

  • 이미지 탭 > nginx:latest 선택 > 실행
  • 컨테이너 이름: test-nginx
  • 포트 설정: 로컬 포트: 8080컨테이너 포트: 80
    => 로컬 포트는 설정을 할 수가 없어서 이 부분 분석하는데 시간이 소요되었다.

(3) 결과 확인

  • 브라우저에서 http://NAS_IP:로컬포트 접속
  • nginx Welcome Page가 나오면 성공!

(4) 결과 확인

CLI에서 하면, 로컬 포트도 설정 가능함을 몇 번의 시도로 알 수 있었다.

sudo docker run --name test-nginx2 -p 8081:80 -d nginx

1-3. 컨테이너 관리 실습

  • 컨테이너 탭에서 test-nginx 확인
    • 시작 / 중지 / 재시작 / 로그 보기
    • 중지 후 삭제도 해보세요
  • 볼륨 탭 확인: 아직은 없음 (2단계에서 실습 예정)

1-4. 명령어로도 실행해보기 (선택사항, SSH 접속 필요)

Synology NAS에 SSH 접속이 가능하다면:

docker run --name hello-container hello-world
  • 메시지에 "Hello from Docker!"가 나오면 성공

다음 단계로 넘어가기 전 체크리스트

  • Docker 패키지를 설치했다
  • Docker GUI에서 이미지(nginx)를 다운로드하고 실행해 봤다
  • 브라우저에서 nginx 페이지를 확인했다
  • 컨테이너 시작/중지/삭제를 해봤다

2단계

"단계 2를 해보자."라는 Prompting으로 다음 사항이 제공된다.

✅ 2단계 목표 요약

  1. Python Docker 이미지 다운로드 (python:3.10 권장)
  2. NAS의 공유 폴더를 Docker 컨테이너에 마운트
  3. Python 컨테이너에서 간단한 웹 크롤링 코드 실행 (requests, beautifulsoup4)
  4. 코드 실행 결과를 NAS 폴더에 저장

🔧 준비: NAS에 공유 폴더 하나 만들기 (예: docker-scripts)

Synology DSM > 제어판 > 공유 폴더에서 다음처럼 하나 생성:

  • 이름: docker-scripts
  • 내부 경로 예: /volume1/docker-scripts -> /volume2/backups/scripts를 사용하기로 함.
  • 이후 Python 코드 파일을 여기에 넣고 Docker 컨테이너에서 마운트해서 사용할 예정

✅ Step-by-Step: Docker CLI로 Python 컨테이너 실행

📥 1. Python 이미지 다운로드

sudo docker pull python:3.10

최신 안정 버전으로 3.10을 권장하지만, 필요 시 다른 버전도 가능 (3.11, 3.9 등)

🗂 2. 예제 코드 파일 생성

/volume1/docker-scripts/test.py로 아래 코드를 저장하세요:
-> /volume2/backups/scripts에 저장

# test.py
import requests
from bs4 import BeautifulSoup

res = requests.get("https://example.com") # examples.com으로 변경해서 테스트
soup = BeautifulSoup(res.text, "html.parser")
print("Page title:", soup.title.string)

``

🚀 3. Docker 컨테이너 실행 (NAS 폴더 마운트)

sudo docker run -it --rm \
  --dns=1.1.1.1 \
  -v /volume2/backups/scripts:/app \
  python:3.10 bash

이 명령은:

  • -it: 인터랙티브 터미널
  • --rm: 실행 후 컨테이너 자동 삭제
  • -v: NAS 공유 폴더 /volume2/backups/scripts 를 컨테이너 내부 /app으로 마운트

🧪 4. 컨테이너 내부에서 실행

cd /app
pip install requests beautifulsoup4
python test.py

결과:

Page title: 403

✅ 잘 되었는지 확인 체크리스트

  • python:3.10 이미지 다운로드 성공
  • /volume1/docker-scripts/test.py 파일 생성
  • Docker 컨테이너에서 /app/test.py 실행
  • Page title: 출력 확인

성공했다면 이제 Python 코드도 NAS에서 Docker로 돌릴 수 있게 된 거예요!

문제 정의

BeautifulSoup을 이용한 Web Scrapping의 경우는 Dynamic Web의 경우, 동작하지 않는 경우가 많다. 이럴 경우, 실재 Web Browser를 이용한 것과 동일하게 Web Scrapping을 하는 방법이 있다. Selenium이다.

하지만, (1)에서 살펴 본것과 같이 Synology NAS에서는 X11 GUI가 없다. 그래서, Selenium을 쓰기 어렵다. 필자의 경우, Docker를 써보지 못해서 난이도가 높았다. 그래서, 다음과 같이 Prompting을 하고 필요한 절차를 작게 나누어 도전해보고자 한다. 이를 통해서, 여러 학습이 이루어 질 것으로 기대한다.

"Synology NAS에 Docker를 적용하여 나중에는 Selenium을 사용해서 Web Scrapping을 하려고해. 내가 Docker에 대해서는 아주 초보자여서 몇가지 단계를 나눠서 실행해 보고 이해도를 높이고 싶어 어떤 절차로 나눠서 하는 것이 좋을지 제안해줘."

Docker 학습 단계 제안

Synology NAS에서 Docker를 이용해 Selenium 기반 웹 스크래핑 환경을 구성하고자 한다면, 아래와 같이 단계를 나눠서 진행하는 것이 좋습니다. 각 단계는 개별적으로 실습하며 Docker에 대한 이해를 점차 높이는 구조로 구성했습니다:

1단계: Docker 기본 이해 및 Synology에서 사용법 익히기

  • Synology DSM에서 Docker 패키지 설치
  • Docker GUI로 간단한 이미지 다운로드 및 컨테이너 실행 (예: hello-world, nginx)
  • 컨테이너의 시작, 중지, 삭제 실습
  • 볼륨과 포트 매핑 개념 익히기

실습 예시:

docker run -d -p 8080:80 nginx

브라우저에서 NAS_IP:8080으로 접속해 nginx 테스트

2단계: Python 실행 환경 구성

  • Python 실행 가능한 Docker 이미지(Python 3.x) 다운로드
  • 로컬 폴더를 컨테이너에 마운트해서 코드 실행
  • 간단한 requests, beautifulsoup4 기반 웹 크롤링 스크립트 실행해 보기

실습 예시:

docker run -it -v /volume1/docker/scraper:/app python:3.10 bash cd /app && python simple_scraper.py

3단계: Selenium 및 Headless 브라우저 환경 구성

  • Selenium + Chromium (또는 Firefox) 기반의 Docker 이미지 사용
  • 웹 페이지의 JavaScript 렌더링 후 데이터 추출 테스트
  • Headless 모드 동작 확인 (selenium/standalone-chrome 등 사용)

실습 예시:

docker run -d -p 4444:4444 --shm-size="2g" selenium/standalone-chrome
  • 로컬에서 Python 코드로 Selenium Remote WebDriver로 접속하여 테스트

4단계: NAS 내부에서 Python 코드와 Selenium 연동

  • NAS에 설치된 Python 환경에서 Selenium 서버(Docker 컨테이너)로 연결
  • 컨테이너 간 네트워크 이해 (bridge, host, custom network)
  • 내부적으로 자동 크롤링 스케줄링 구성 (예: cron, watchtower, supervisord)

5단계: 결과 저장 및 자동화

  • 크롤링 결과를 NAS의 공유 폴더에 저장 (CSV/Markdown)
  • 로그 파일 관리 및 실패 시 재시도 처리 추가
  • 필요 시 이메일/텔레그램/카카오톡으로 알림 전송 기능 추가

6단계: 보안 및 관리 최적화

  • Docker Compose 사용해 환경 설정 자동화
  • selenium-chrome에 인증서 문제 해결 및 User-Agent 변경 등 고급 설정
  • Docker 컨테이너 백업 및 업데이트 전략 이해 (watchtower 등 활용)

참고 문헌

(1) https://technical-leader.tistory.com/181

+ Recent posts