Computer Science/자동화

셀레니움을 이용한 웹툰 감상

netjung 2021. 7. 6. 00:36

셀레니움

자동화란 언제나 설레고, 뿌듯한 작업입니다.
그 중의 하나인 셀레니움을 익히게 되었고, 그로 인해 바로 활용하며 즐길 수 있는 코드를 작성하여 보았습니다.

웹툰감상 자동화

기본적인 프로세스는 다음과 같습니다.

  1. 좋아하는 웹툰들의 링크를 리스트로 모아두고, 원하는 웹툰 번호를 입력합니다.
  2. 몇 번째 화를 볼지 선택 합니다.
  3. 셀레니움 실행 후 해당 웹툰, 해당 화가 실행됩니다.
  4. 정해진 시간마다 일정하게 스크롤하여 내립니다.
  5. 맨 밑까지 스크롤 완료 후 다음 화로 가는 버튼을 클릭합니다.
  6. 4번 5번을 반복합니다.

1,2번까지의 코드, UI로서의 역할

class Webtoon:
    def __init__(self, number, name, url):
        self.number = number
        self.name = name
        self.url = url
        print(str(number) + ": " + name)


class Nopage(Exception):
    pass


print("choose your webtoon to watch automatically")
webtoonList = []
webtoonList.append(Webtoon(1, "웹툰이름", "웹툰링크"))
webtoonList.append(Webtoon(2, "웹툰이름", "웹툰링크"))
webtoonList.append(Webtoon(3, "웹툰이름", "웹툰링크"))


chooseNum = input("choose with number: ")
epNumber = input("what episode you gonna start?")

for n in range(0, len(webtoonList)):
    if int(chooseNum) == webtoonList[n].number:
        playUrl = webtoonList[n].url
        break

웹툰을 클래스화 후 번호입력하는 창을 만들었다.

나머지 실행부분

browser = webdriver.Chrome(ChromeDriverManager().install())

browser.get(playUrl)
browser.set_window_position(2100, 0)
browser.maximize_window()
time.sleep(2)

episode = browser.find_elements_by_class_name("웹툰에피소드 클래스")
for n, ep in enumerate(episode[::-1]):
    if n == int(epNumber) - 1:
        ep.click()
        break

while True:
    try:
        next_page = browser.find_element_by_id("다음화 아이디")
        print("page exist")
        scroll_size = browser.execute_script("return document.body.scrollHeight")
        total_sections = ceil(scroll_size / 900)
        for section in range(total_sections + 1):
            browser.execute_script(f"window.scrollTo(0,{section*900})")
            time.sleep(1.5)
        next_page.click()
    except:
        print("no page")
        scroll_size = browser.execute_script("return document.body.scrollHeight")
        total_sections = ceil(scroll_size / 900)
        for section in range(total_sections + 1):
            browser.execute_script(f"window.scrollTo(0,{section*900})")
            time.sleep(1.5)
    break
browser.quit()

webdriver를 통해 크롬 실행후, 저의 환경에 맞게 창을 오른쪽 모니터로 이동 후 최대화 하는 작업까지 들어있습니다.
에피소드 선택은 맨 밑에서부터 1화라 역순으로 선택하도록 하였습니다.
반복문으로 스크롤 후 다음화 선택을 하도록 하였습니다.
스크롤은 해당 화면의 scrollHeight을 받아와서 적당한 스크롤을 하도록 나누었습니다.
다음화 버튼이 없을경우 오류나서 예외처리로 나누었고, 다음화 없을경우 끝까지 본 후 종료하게 만들었습니다.

여기까지만 해도 매번 스크롤과 다음화 누르는 작업이 사라졌지만, 해당 셀레니움 가상환경에 접속하여 파이썬 파일 실행하는 것 조차 귀찮기때문에, batch 파일을 처음 만들어 보았습니다.

@echo off
call 가상환경경로/activate.bat
cd 파일경로
python webtoon.py
cmd /k

이를 통해 batch파일 누르는 것으로 웹툰감상 자동화 프로그램을 사용할 수 있게 되었습니다.