[ETOOS] Selenium 으로 일 안하기

재현·2021년 8월 21일
0
post-thumbnail

그동안 저는요

네이버 부스트 캠프가 떨어지고 지독한 코딩에 침식되고 있던 중
성훈이의 전역과 "같이 파이썬으로 다시 달려보자!" 라는 말로 시작되어
학원 데일리 업무 중 문제를 복사 -> 붙여넣기 -> 작성
하는 업무가 있었는데 너무 귀찮아 이걸 해결해야겠다는 생각이 들었다!

어떻게?

일단 프로그래밍 언어는 공부하던 파이썬으로 채택했고

  1. 파이썬으로 어떻게 문제를 긁어 올 것인가?
  2. 로그인 해야하는 홈페이지를 어떻게 다룰 것 인가?

두 가지에 중점을 둬 BeautifulSoup 과 Selenium 중
홈페이지를 동적으로 다룰 수 있는 Selenium 을 채택하기로 했다.

작동방식

  1. 로그인 -> 학생 관리 페이지 -> 최상단에 위치한 학생 페이지 클릭
  2. 문제 출력을 희망하는 과목 입력
  3. 이번 달 중 전체 페이지 수 체크
  4. 문제 출력을 희망하는 날짜 입력
  5. 과목 별 해당하는 날짜 폴더 생성 및 문제 출력 후 저장

문제

  1. 전체 페이지 수 체크 후 리턴이 이상하리만큼 오래 걸린다.(대략 30초 정도?)
    -> 아마 코드 구조 문제인 것 같다

  2. urlretrieve 를 통한 파일 다운로드 시 0번째 index 가 두 번
    다운로드되는 문제 발생
    -> 아직도 이유를 모르겠다.
    -> 1번째 index 시 contiune 하는 코드도 작성해보았는데 동일하다..

  3. 실행 코드가 지저분함
    -> 코드 구조에 대한 공부가 더 필요하다

CODE

from os import major
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import os.path
from urllib.request import urlretrieve
import time

class Etoos() :
# ETOOS 데일리테스트 문제 crawling 하기 위해 작성된 코드입니다.

    def login() : 
        # 로그인 후 과목 선택 전까지 작동 코드

        URL = 'https://www.etoos.com/member/login.asp?returnUrl=http://ilsandonggu247.etoos.com/lms/index.do'
        ID = input("아이디를 입력하세요 : ")
        PW = input("비밀번호를 입력하세요 : ")

        global driver
        driver = webdriver.Chrome('chromedriver')
        driver.get(URL)

        # 첫 번째로 띄워진 window
        window_before = driver.window_handles[0]

        # ID 작성
        driver.find_element_by_id("mem_id")
        ActionChains(driver).send_keys(ID).perform()

        # PW 작성
        driver.find_element_by_name("pwdtmp").click()
        ActionChains(driver).send_keys(PW).perform()

        # Login 클릭
        driver.find_element_by_class_name("btn_login").click()
        driver.implicitly_wait(10)

        # 첫 번째 메뉴 클릭
        driver.find_element_by_css_selector("#lnbmenu > ul > li:nth-child(1) > a").click()
        driver.implicitly_wait(10)

        # 첫 번째 메뉴 - 전체 학생 관리
        driver.find_element_by_id("m_PB200922").click()
        driver.implicitly_wait(50)

        # 첫 번째 학생 관리 페이지 클릭
        driver.find_element_by_css_selector("#content > div.wrap_tbl_sdw.mgt_20 > table > tbody > tr:nth-child(1) > td:nth-child(6) > a").click()

        # 두 번째로 띄워진 window 으로 driver 가 넘어감
        window_after = driver.window_handles[1]
        driver.switch_to_window(window_after)

    def selectMajor() : 
    # 데일리테스트 - 국어 
        global Major
        Major = input("출력이 필요한 과목을 입력하세요. ex) 국어, 수학 : ")
        
        if Major == '국어' : 
            driver.find_element_by_css_selector("#menuList > ul > li.subject1 > a").click()
            print("Loading ...")
            

        elif Major == '수학' : 
            driver.find_element_by_css_selector("#menuList > ul > li.subject2 > a").click()
            print("Loading ...")
            

        else :
            print("올바른 과목을 입력해주세요 : ")
            return Etoos.selectMajor()

    def countPage() :

        tatal_page_tag = driver.find_element_by_css_selector("#DailyTestCommentaryForm > div > div > div.wrap_test_answer > div.wrap_test > div.paging_etc.clear > div > span").text
        position_slash = tatal_page_tag.rfind('/')
        str(tatal_page_tag)

        total_page = int(tatal_page_tag[-position_slash:])

        return total_page

    def crawlingQ(total_page, Major,Input_day) :
        
        edit_Input_day = Input_day.replace("/","")

        Reading_folder = './국어/{}'.format(edit_Input_day)
        Math_folder = './수학/{}'.format(edit_Input_day)
        filetype = "PNG"

        if Major == '국어' : 

            if not os.path.isdir(Reading_folder) :

                os.makedirs(Reading_folder)
                time.sleep(2.0)

                for i in range(1, total_page+1) :

                    PNG_link = driver.find_element_by_css_selector("#wr_question > div.cont > img").get_attribute("src")

                    urlretrieve(PNG_link, "/Applications/mampstack-8.0.3-1/apache2/htdocs/jay/Git/GIT/Python/Ultimate-Python/Etoos/{}/{}.{}".format(Reading_folder,i,filetype))
                    time.sleep(1.0)
                    driver.find_element_by_css_selector("#DailyTestCommentaryForm > div > div > div.wrap_test_answer > div.wrap_test > div.paging_etc.clear > div > a.bt_next").click()

            alert = driver.switch_to.alert
            alert.accept()

        else :

            if not os.path.isdir(Math_folder) :
                
                os.makedirs(Math_folder)
                time.sleep(2.0)
                
                for i in range(1, total_page+1) :

                    PNG_link = driver.find_element_by_css_selector("#wr_question > div.cont > img").get_attribute("src")

                    urlretrieve(PNG_link, "/Applications/mampstack-8.0.3-1/apache2/htdocs/jay/Git/GIT/Python/Ultimate-Python/Etoos/{}/{}.{}".format(Math_folder,i,filetype))
                    time.sleep(1.0)
                    driver.find_element_by_css_selector("#DailyTestCommentaryForm > div > div > div.wrap_test_answer > div.wrap_test > div.paging_etc.clear > div > a.bt_next").click()

            alert = driver.switch_to.alert
            alert.accept()

    def countDay() :

        day_list = []
        day_selector_list = []

        for week in range(6) : 

            days = driver.find_elements_by_css_selector("#math_day > td:nth-child({}) > div > strong".format(week+1))

            for day in range(5) :                     
                try : 

                    Find_day = days[day].text
                    Find_day_key = days[day]
                    day_list.append(Find_day)
                    day_selector_list.append(Find_day_key)

                except : 
                    continue

        return day_list, day_selector_list

    def selectDay(day_list, day_selector_list) : 
        
        global Input_day
        Input_day = input("희망하는 날짜를 입력하세요. ex) 07 / 01 : ")
        
        for i in range(len(day_list)) : 

            if Input_day == day_list[i] : 
                
                day_selector_list[i].click()
                
                alert = driver.switch_to.alert
                alert.accept()

            elif len(Input_day) != 7 :

                print("양식에 맞는 날짜를 입력해주세요.")
                return Etoos.selectDay()

Etoos.login()

Etoos.selectMajor()

day_list,day_selector_list = Etoos.countDay()
Etoos.selectDay(day_list,day_selector_list)

total_page = Etoos.countPage() 

Etoos.crawlingQ(total_page, Major, Input_day)

print("정상 작동")
profile
Do Work As We & Respect 🙆🏾 🙆🏻‍♂️ 🙆🏻‍♀️ 🙆‍♀️

0개의 댓글