[Selenium]파이썬 셀레니움을 이용한 자동 이미지 캡쳐 프로그램

sonsazang

·

2022. 6. 22. 01:04

이번에 진행하게 된 작업은 우연히 교회 청년부에서 오늘의 QT 이미지를 업로드하는 역할을 담당하게 되어서 제작하게 되었습니다. 이전부터 셀레니움에 관심이 있었으며 한 번쯤? 자동화시키면 편할 것 같아서 진행하게 되었습니다.

조금 다양한 기술을 활용해 보아서 실생활에서 활용하기 좋게 구현 했습니다 :) 

천천히 코드를 읽어주시면 내용 확인이 가능할것 같습니다.

지금도 사용중입니다!

 

진행 방식

1. 파이썬 셀레니움을 이용한 원하는 요소 이미지 캡처 구현

2. Slack API를 활용해서 [1] 번 로직 결과물 전달 구현

3. 파이썬 라이브러리 Schedule을 이용해서 원하는 시간에 반복적으로 실행되도록 구현
4. 노드 JS에서 프로세스 관리용으로 사용하는 모듈인 PM2를 사용해서 항상 로직이 돌아가도록 구현 

 

구현

1. 파이썬 셀레니움을 이용한 원하는 요소 이미지 캡처 구현

driver.find_element_by_css_selector() -> 이 부분 값 설정하는 방법

1. 원하는 이미지 위에서 오른쪽 마우스 클릭 -> 검사 클릭

2. 우측에 나오는 크롬 개발자 모드 창 확인 -> 오른쪽 마우스 -> Copy 클릭 -> Copy selector 클릭 및 붙여 넣기

# 1. 파이썬 셀레니움을 이용한 원하는 요소 이미지 캡쳐 구현

# 셀레니움, 셀레니움 크롬옵션 임포트
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 크롬 옵션 생성
chorme_options = Options()
chorme_options.add_argument('--profile-directory=Default') # 프로필 설정
chorme_options.add_argument("--incognito") # 시크릿모드 실행
chorme_options.add_argument('--headless') # headless모드 브라우저가 뜨지 않고 실행
chorme_options.add_argument('--no-sandbox') # GUI를 제공하지 않는 리눅스 서버에서 사용하는 옵션
chorme_options.add_argument("--disable-plugins-discovery") # 플러그인 설정
chorme_options.add_argument("--start-maximized") # 최대화 크기 실행
# 크롬 드라이버 설정(경로, 크롬옵션)
driver = webdriver.Chrome(executable_path="/usr/bin/chromedriver", chrome_options=chorme_options)

url = "" # 캡쳐 원하는 사이트 주소
pagename = "" # 캡쳐 이미지 이름

# 오늘의 QT 본문말씀 페이지 저장
def setUrl_biblePage():
    pagename = 'bible'
    url = "https://www.duranno.com/qt/view/bible.asp?qtDate="
    capture(url, pagename)
    
# 오늘의 QT 본문해설 페이지 저장
def setUrl_explainPage():
    pagename = 'explain'
    url = "https://www.duranno.com/qt/view/explain.asp?qtDate="
    capture(url, pagename)

# 오늘의 QT 이미지 캡쳐
def capture(url, pagename):
    driver.get(url) # 사이트 열기
    original_size = driver.get_window_size() # 화면 사이즈에 따라서 조절
    # 페이지 끝까지 가려면 document.body.scrollHeight, Widht 를 사용
    required_width = driver.execute_script('return document.body.parentNode.scrollWidth')
    required_height = driver.execute_script('return document.body.parentNode.scrollHeight')
    # 페이지 양끝 사이즈 적용
    driver.set_window_size(required_width, required_height)
    # 캡쳐 원하는 부분 크롬 개발자 모드에서 Copy Selector로 찾은 후 입력
    element = driver.find_element_by_css_selector('body > div > div > div.contents.right.last-div')
    # 설정한 부분 png로 저장
    element_png = element.screenshot_as_png
    # 파일 이름 설정
    with open('TodayQT_{0}.png'.format(pagename), "wb") as file:
        file.write(element_png)

setUrl_biblePage()
setUrl_explainPage()

2. Slack API를 활용해서 [1] 번 로직 결과물 전달 구현, 
3. 파이썬 라이브러리 Schedule을 이용해서 원하는 시간에 반복적으로 실행되도록 구현

본인 슬랙 토큰 구하기(해당 글 참고) -> Python으로 Slack Bot 만들기

 

Python으로 Slack Bot 만들기

Python으로 슬랙봇 만들기

wooiljeong.github.io

# 2. Slack API를 활용해서 [1]번 로직 결과물 전달 구현

from slack_sdk import WebClient # 슬랙 SDK 라이브러리 임포트
import schedule # 특정 시간별로 함수 호출을 위한 Schedule 라이브러리 임포트
import time # 시간을 위한 time 임포트
import imageChrome # 앞에서 작성한 이미지 캡쳐 코드 임포트

class SlackAPI:
    def __init__(self, token):
        # 슬랙 클라이언트 인스턴스 생성
        self.client = WebClient(token)
   
	# 채널 ID 파싱 함수     
    def get_channel_id(self, channel_name):
        # conversations_list() 메서드 호출
        result = self.client.conversations_list()
        # 채널 정보 딕셔너리 리스트
        channels = result.data['channels']
        # 채널 명이 'test'인 채널 딕셔너리 쿼리
        channel = list(filter(lambda c: c["name"] == channel_name, channels))[0]
        # 채널ID 파싱
        channel_id = channel["id"]
        return channel_id

	# 파일 보내기 함수
    def post_file(self, channel_id, file):
    	# files_upload() 메서드 호출
        result = self.client.files_upload(
        	# 채널 이름 입력
            channels=channel_id,
			# 보낼 파일 입력
            file=file
        )
        return result

token = "xoxb-본인 슬랙 토큰 입력"
slack = SlackAPI(token)

channel_name = "todayqt"

# -----------------------------------------------------------------------
# 자동화 함수
def main():
    imageChrome.setUrl_biblePage() # 이미지 캡쳐 함수 1
    imageChrome.setUrl_explainPage() # 이미지 캡쳐 함수 2
    channel_id = slack.get_channel_id(channel_name) # 채널 이름을 입력해서 슬랙 채널 ID 파싱
    slack.post_file(channel_id, 'TodayQT_bible.png') # ID를 통해 해당 채널에 파일 전송
    slack.post_file(channel_id, 'TodayQT_explain.png') 

# 3. 파이썬 라이브러리 Schedule을 이용해서 원하는 시간에 반복적으로 실행되도록 구현

# Schedule 라이브러리를 활용해서 매일 00시 00분에 main 함수 실행
schedule.every().day.at("00:00").do(main)

# 무한 루프를 돌면서 Schedule 을 유지
while True:
    schedule.run_pending()
    time.sleep(1)

 

4. 노드 JS에서 프로세스 관리용으로 사용하는 모듈인 PM2를 사용해서 항상 로직이 돌아가도록 구현 

PM2 설치 글 확인 -> PM2를 이용한 프로그램 실행 및 시작프로그램 등록

 

PM2를 이용한 프로그램 실행 및 시작프로그램 등록

이 글은 어떤 사람들을 위한 글인가요? 리눅스에서 시작프로그램을 등록하고 싶어요 (라즈베리파이) 윈도우에서 사용하시려면 링크를 참조해주세요 그 프로그램이 예상치 못한 런타임에러로

velog.io

PM2 설치 후 본인 서버에서 pm2 Start SlackAPI.py 실행


00시 00분에 파일 전송 확인 후 프로젝트 종료

참조한 글

Python - Selenium

https://dev-guardy.tistory.com/87 

http://daplus.net/selenium-selenium-webdriver%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%A0%84%EC%B2%B4-%ED%8E%98%EC%9D%B4%EC%A7%80%EA%B0%80-%EC%95%84%EB%8B%8C-%ED%8A%B9%EC%A0%95-%EC%9A%94%EC%86%8C%EC%9D%98/

Python - Schedule

https://wikidocs.net/137924

Python - SlackAPI 연동

https://wooiljeong.github.io/python/slack-bot/

PM2

https://velog.io/@cckn/2019-11-05-0611-%EC%9E%91%EC%84%B1%EB%90%A8-17k2kwsgms