전체 학원과 교습소 정보는 data.go.kr 에도 나오지만 업데이트가 자주 되지
않아 1년 전의 리스트만 볼 수 있습니다. 현재 시점의 학원과 교습소 정보는 https://hakwon.sen.go.kr/edusys.jsp?page=scs_m83000
에서 볼 수 있지만 페이지당 10개의 학원 박에 보이지 않고 전체 리스트를 한번에
받은 방법은 없습니다. 강남구의 경우
3천개가 넘는 학원이 있기 때문에 부득이 웹 스크래핑으로 전체 리스트를 구해야 합니다.
아래 프로그램은 파이어폭스를 띄우고 selenium를 통해 파이어폭스를 조정해서 강남구 학원과
교습소 전체 리스트를 얻습니다. 마우스가
아닌 파이썬 프로그램으로 파이어폭스 웹브라우저를 조정하는 셈입니다.
조정과 동시에 학원 이름, 주소 등을 데이터를 추출합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | # -*- coding: utf-8 -*- from selenium import webdriver import time driver = webdriver.Firefox() driver.implicitly_wait(5) driver.get('https://hakwon.sen.go.kr/edusys.jsp?page=scs_m83000') btn = driver.find_element_by_xpath("//input[@value='조회']") driver.find_element_by_xpath("//select[@id='selSearchZoneCode']/option[text()='강남구']").click() driver.execute_script("arguments[0].click()", btn) num_page = 1 while True: base = 'grdView_cell_' for row in range(10): output = "" for col in range(7): loc = base + str(row) + "_" + str(col) output = output + driver.find_element_by_xpath("//td[@id="+"'"+loc+"'"+"]").text + "|" if col == 1: school = driver.find_element_by_xpath("//td[@id="+"'"+loc+"'"+"]") driver.execute_script("arguments[0].click()", school) alert = driver.switch_to.alert driver.implicitly_wait(1) output = output + alert.text + "|" alert.accept() driver.switch_to_default_content() print(output) num_page += 1 if num_page % 10 != 1: s_num_page = '"'+"paglPg_page_" + str(num_page) + '"' driver.find_element_by_xpath("//a[@id="+s_num_page+"]").click() else: next_page = driver.find_element_by_xpath("//li[@id='paglPg_next_btn']") driver.execute_script("arguments[0].click()", next_page) time.sleep(10) |
라인 8과 11사이는
“행정구역”으로 강남구를 선택하고 “조회” 버튼을 클릭하는 문장입니다. btn.click() 대신에 driver.execute_script(“arguments[0].clock()”.btn)를 사용하는 이유는 exception이 발생하는 경우가 있기 때문입니다. 같은 이유로 라인 26과 36 형태가 필요합니다.
라인 14에서 while 무한 루프는 exception이 발생하기까지 실행합니다. 실제 문제가 있어도 중단이 되겠지만 더 이상 페이지가 없을
때에도 exception이 발생해서 중단합니다. 라인 16과 18로 이루어진 부분이 한 페이지를 읽습니다. 한 페이지에는 학원 10개가 나오니 10개의 행으로 구성되어 있고 각 행은 순번, 학원명, 설립자강사, 교습 과정 등의 열로 만들어져 있습니다.
이 중에 특별히 학원명은 클릭을 해야 alert 창이 뜨고 전화번호와 주소가 나옵니다.
학원명을 따로 처리하는 부분이 라인 21에서 28까지 입니다.
페이지를 넘기는 부분이 라인 30에서 37까지입니다.
변수 num_page을 10으로 나누어 나머지가 1이 될 때마다 하단에 “>”을 찾아 클릭하는 부분이 라인 35와 36이고 나머지가
1이 아니면 하단 숫자를 순차적으로 클릭합니다. <a id=”pagelPg_page_#”>이나
<li id=’paglPg_next_btn’> 등의 태그는 웹브라우저에서 <F12>를 눌러 나오는 디버깅툴을 이용해서 찾습니다.
댓글 없음:
댓글 쓰기