네이버 부스트 캠프가 떨어지고 지독한 코딩에 침식되고 있던 중
성훈이의 전역과 "같이 파이썬으로 다시 달려보자!" 라는 말로 시작되어
학원 데일리 업무 중 문제를 복사 -> 붙여넣기 -> 작성
하는 업무가 있었는데 너무 귀찮아 이걸 해결해야겠다는 생각이 들었다!
일단 프로그래밍 언어는 공부하던 파이썬으로 채택했고
두 가지에 중점을 둬 BeautifulSoup 과 Selenium 중
홈페이지를 동적으로 다룰 수 있는 Selenium 을 채택하기로 했다.
전체 페이지 수 체크 후 리턴이 이상하리만큼 오래 걸린다.(대략 30초 정도?)
-> 아마 코드 구조 문제인 것 같다
urlretrieve 를 통한 파일 다운로드 시 0번째 index 가 두 번
다운로드되는 문제 발생
-> 아직도 이유를 모르겠다.
-> 1번째 index 시 contiune 하는 코드도 작성해보았는데 동일하다..
실행 코드가 지저분함
-> 코드 구조에 대한 공부가 더 필요하다
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("정상 작동")