관리 메뉴

RUBY

[WebData][Schools]전국 고등학교 목록/엑셀 본문

데이터 분석/EDA_웹크롤링_파이썬프로그래밍

[WebData][Schools]전국 고등학교 목록/엑셀

ruby-jieun 2023. 12. 28. 17:15

 

 

 

 

전국 고등학교 목록
엑셀로 저장하기

 


 

 

 

 

전국 고등학교 목록만 찾아서 들어오신 분도 있을 것 같아

엑셀 먼저 공유해드립니다.

 

 

 

 

schools_data.xlsx
0.07MB

전국 고등학교 목록(2023.12.28 기준) 총 2,381곳

 

 

 

 

 

 

학교명, 학교타입, 도시형태로 저장되어 있습니다.

 

 

 

 

 

 


 

회사에서 인사정보시스템을 업데이트 하면서

기존 직원들 중 고졸 취업자분들은 학교정보 입력이 불가능한 상태였습니다.

인사팀에서 직원들의 고등학교 정보들도 인사정보에 추가 기입가능하게 만들기를 원하시더라구요.

그래서! 전국 고등학교 정보들을 전부 가져와 인사정보시스템에서 검색이 가능하도록 DB에 넣어보고자 합니다.

 

 

 

 

일단 전국 고등학교들이 나와 있는 사이트를 찾아봤습니다.

https://www.career.go.kr/cnet/front/base/school/schoolHightList.do

 

학과정보 > 학교정보 | 진로정보망 커리어넷

500여개 이상의 다양한 직업에 대한 유용한 정보

www.career.go.kr

진로정보망 커리어넷에 전국 고등학교 정보가 나와있네요.

 

 

 

 

자 그럼 크롤링을 시작해보겠습니다.

 

 

 

1. selenium 설치

!pip install selenium

 

 

 

2. Selenium을 이용해 사이트를 엽니다.

# Chrome 브라우저 옵션을 설정하기 위한 ChromeOptions 인스턴스 생성
# Chrome 드라이버 서비스를 관리하기 위한 Service 객체 생성
# Chrome WebDriver 인스턴스 생성, 여기서는 크롬 드라이버의 경로와 옵션을 지정
# 웹사이트를 열기 위한 URL

# selenium 패키지에서 webdriver 모듈을 임포트
from selenium import webdriver
# selenium.webdriver에서 chrome.service 모듈의 Service 클래스를 임포트
from selenium.webdriver.chrome.service import Service
# selenium.webdriver에서 chrome.options 모듈의 Options 클래스를 임포트
from selenium.webdriver.chrome.options import Options

# ChromeOptions 인스턴스 생성
options = Options()

# Chrome 드라이버 서비스 객체 생성
service = Service(executable_path=r"C:\Users\이름\Documents\ds_study\driver\chromedriver.exe")

# Chrome WebDriver 인스턴스 생성
driver = webdriver.Chrome(service=service, options=options)

# 웹사이트 열기
url = "https://www.career.go.kr/cnet/front/base/school/schoolHightList.do"
driver.get(url)

 

 

3.

# selenium.webdriver.common에서 By 클래스를 임포트
# By 클래스는 HTML 요소를 찾을 때 사용하는 다양한 방법들을 제공합니다.

from selenium.webdriver.common.by import By

 

 

4.

# time 모듈을 임포트
# time.sleep 함수를 사용하여 프로그램을 일시적으로 정지시킬 수 있습니다.

import time

 

 

5.

# pandas 라이브러리를 임포트
# pandas는 데이터를 쉽게 처리하고 분석할 수 있는 기능을 제공하는 라이브러리입니다.

import pandas as pd

 

 

6. 학교 정보를 저장할 리스트를 초기화합니다.

# 데이터를 저장할 리스트
school_data = []

 

 

7.

# selenium.webdriver.support.ui에서 WebDriverWait 클래스를 임포트
# WebDriverWait는 특정 조건이 만족될 때까지 웹 페이지를 대기시키는 기능을 제공합니다.
# selenium.webdriver.support에서 expected_conditions 모듈(EC)를 임포트
# EC는 WebDriverWait을 사용할 때 기다릴 조건들을 제공합니다.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

 

 

8.

# selenium.commonexc.eptions에서 NoSuchElementException 클래스를 임포트
# NoSuchElementException는 특정 요소가 존재하지 않을 때 발생하는 예외

from selenium.common.exceptions import NoSuchElementException

 

 

9. 탐색할 총 페이지 수를 정의하고 크롤링을 시작합니다.

 - 중간에 링크가 없는 학교명에서 오류가 나길래, 예외를 추가해주었습니다.

            # 학교 이름이 링크로 제공되는 경우, 링크의 텍스트를 사용
            # 링크가 없는 경우, 해당 셀(td 요소)의 텍스트를 직접 사용

# 총 페이지 수 설정
total_pages = 239

# 페이지 수만큼 반복하여 데이터 수집
for page in range(1, total_pages + 1):
    # 현재 페이지가 로드될 때까지 최대 10초간 대기
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[@id='frm']/div[3]/table/tbody/tr")))

    # 현재 페이지의 모든 행(학교 데이터)를 찾음
    rows = driver.find_elements(By.XPATH, "//*[@id='frm']/div[3]/table/tbody/tr")
    
    for row in rows:
        try:
            # 학교 이름이 링크로 제공되는 경우, 링크의 텍스트를 사용
            school_name = row.find_element(By.XPATH, ".//td[2]/a").text
        except NoSuchElementException:
            # 링크가 없는 경우, 해당 셀(td 요소)의 텍스트를 직접 사용
            school_name = row.find_element(By.XPATH, ".//td[2]").text
            
        # 학교 유형과 지역 정보를 추출
        school_type = row.find_element(By.XPATH, ".//td[3]").text
        school_region = row.find_element(By.XPATH, ".//td[4]").text
        
        # 추출된 데이터를 리스트에 추가
        school_data.append([school_name, school_type, school_region])

        # 추출된 데이터 출력
        print(f"Page {page}: {school_name} - {school_type} - {school_region}")

    # 다음 페이지로 이동, 마지막 페이지가 아닐 경우에만
    if page < total_pages:
        driver.execute_script(f"fn_list({page + 1});")
        time.sleep(2)  # 페이지 로딩을 위한 대기 시간

 

 

 

10. Selenium에서 사용한 브라우저 드라이버를 닫습니다. 

데이터 수집이 완료되면 모든 열려 있는 창을 닫고, 백그라운드에서 실행 중인 WebDriver 세션을 종료합니다

driver.quit()

 

 

 

11. 

pandas 라이브러리의 DataFrame 객체를 생성합니다. 이 DataFrame은 'school_data' 리스트에서 가져온 데이터를 포함합니다. 
여기서 'school_data'는 웹 크롤링을 통해 수집된 학교 이름, 유형, 지역 정보를 담고 있는 리스트입니다.
'columns' 인자는 DataFrame의 각 열에 대한 제목을 지정합니다. 저는 'School Name', 'Type', 'Region'으로 설정하였습니다.

df = pd.DataFrame(school_data, columns=['School Name', 'Type', 'Region'])

 

 

 

 

12.

# openpyxl 라이브러리 설치 (엑셀 파일 생성을 위함)

pip install openpyxl

 

 

 

13. 추출한 학교 데이터를 Excel 파일로 저장합니다.

# DataFrame을 엑셀 파일로 저장, 인덱스는 저장하지 않음

df.to_excel("schools_data.xlsx", index=False)
Comments