본문 바로가기
개발/Python

Python Selenium 동적 페이지 크롤링(Docker)

by 궁즉변 변즉통 통즉구 2023. 8. 13.
반응형

Python의 Selenium을 활용해서 동적 페이지 크롤링 하는 부분을 docker 환경에서 실행해본다. 

일반적인 데스크탑 환경과 다른점은 docker는 linux 환경으로 UI가 없다는 점이다. 하지만 Chrome 브라우저는 사용하게 된다.

 

먼저 다음과 같이 Dockerfile을 작성한다. python은 3.9 버전을 사용하고 Google Chrome을 설치한다. 그리고 python 실행에 필요한 패키지들을 requirements.txt를 통해서 설치하고, python 샘플코드를 실행한다.

FROM python:3.9
WORKDIR /app
RUN apt-get -y update && \
    apt install wget && \
    wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
    apt -y install ./google-chrome-stable_current_amd64.deb   # Google Chrome 다운로드 및 설치

COPY requirements.txt .  # requirements.txt 파일
COPY selenium_test.py .  # python app 파일
RUN pip install --no-cache-dir -r requirements.txt  # 패키지 의존성 설치
CMD [ "python", "selenium_test.py" ]  # python 실행

 

이제 requirements.txt 파일을 Dockerfile과 동일한 디렉토리에 작성한다.

requests==2.31.0
selenium==4.10.0
webdriver-manager==3.8.6

 

마지막으로 selenium_test.py 파일을 Dockerfile, requirements.txt 과 동일한 디렉토리에 작성한다.

import requests
import time

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.common.by import By

def hello():
    options = ChromeOptions()
    user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
    options.add_argument('user-agent=' + user_agent)
    options.add_argument("lang=ko_KR")
    options.add_argument('headless') # headless 모드(실제 브라우저와 동일하게 동작하지만 창은 뜨지 않음)
    options.add_argument('window-size=1920x1080') # 해상도
    options.add_argument("disable-gpu") # none gpu
    options.add_argument("--no-sandbox")
    options.add_argument('--disable-dev-shm-usage')

    # chromw driver install
    release = 'https://chromedriver.storage.googleapis.com/LATEST_RELEASE'
    version = requests.get(release).text # 버전을 받아온다
    service = ChromeService(executable_path=ChromeDriverManager(version=version).install()) # 최신드라이버 설치

    driver = webdriver.Chrome(service=service, options=options)

    url = "https://vuejs.org/examples/#hello-world"
    driver.get(url)

    time.sleep(5) # To load entire webpage

    print(driver.page_source) # print
 
    driver.close()


hello()

 

이제 실행을 해보자. 먼저 docker image를 생성한다.

docker build -t selenium:test .

 

다음으로 컨테이너를 실행하면 결과를 콘솔에서 확인 할 수 있다. 

docker run selenium:test

selenium을 잘 활용하는 방법에 대해서는 좀 더 알아봐야 한다.

 

참조: https://velog.io/@ywoosang/asd

반응형

댓글