- Selenium을 활용한 학교 식단정보 크롤링 -

 

 

 

<개요>

1. 크롬 드라이버를 통해 학교 식단 홈페이지에 접속

2. table로 이루어진 식단표에 접근하여 데이터를 받아 출력

 

 

 

<코드 설명>

chromedriver.exe

시작하기 전에 자신의 chrome 과 맞는 버전의 chromedriver.exe 파일을 설치해,

실행하려는 코드와 같은 경로 상에 위치

 

 

import time
from selenium import webdriver

필요한 라이브러리들 import

time 라이브러리는 웹상에서 로딩하는 시간을 기다려주기 위함임

 

 

# 크롬 드라이버 실행
driver = webdriver.Chrome('./chromedriver.exe')  # 주소 앞에 . 붙여서 chromedriver 실행
# 학교 식단정보 홈페이지 주소를 가지고 옴.
driver.get("https://www.kopo.ac.kr/daegu/content.do?menu=4175")
time.sleep(0.3)

크롬 드라이버를 이용해 웹 브라우저를 실행시켜 학교 식단정보 홈페이지 주소로 접속

 

 

학교 식단정보 홈페이지

 

 

# 요일 선택지 제공
days = ['월', '화', '수', '목', '금']

for i, day in enumerate(days):
    print(f"{i+1}.{day}\t", end='')

print()
# input 을 통해 요일 선택할 것임
userInput = int(input("요일을 선택하세요 : "))
print()

요일 선택지를 제공

for문에서 enumerate함수 활용시 인덱스 번호와 컬렉션의 원소를 tuple형태로 반환

1. 월    2. 화    3. 수    4. 목    5. 금  --> 이런식으로 출력

1번부터 시작하기 위해 i+1

 

 

# table 을 불러올 때 전체 테이블의 full xpath 주소
table = driver.find_element_by_xpath("/html/body/div[2]/article/div[1]/section[2]/div/div[2]/table[2]")
# table 안에 있는 tbody 를 tag_name 을 통해 가져옴
tbody = table.find_element_by_tag_name("tbody")
# tbody 안에 있는 몇 번째 행을 가져올것인지 userInput 을 통해 결정
rows = tbody.find_elements_by_tag_name("tr")[userInput - 1]
# tr (행)중 모든 td (열)들을 가져옴
columns = rows.find_elements_by_tag_name("td")

find_element_by_xpath 메소드를 활용해 전체 table 주소를 table 변수에 저장

find_element_by_tag_name 메소드를 활용해 table 안에 있는 tbody 를 tbody 변수에 저장

find_elements_by_tag_name 메소드를 활용해 tr 을 rows 변수에 저장

여기서 element 와 elements 의 차이는 단수/복수를 담는 것의 차이

--> tbody 와 달리 tr 은 여러개 존재하기 때문에 elemnets를 사용

마지막으로 find_elements_by_tag_name 메소드를 활용해 td 들을 columns 변수에 저장

 

 

개발자모드(F12)로 본 홈페이지 - table 접근

 

 

# userInput 을 통한 요일 출력
if userInput == 1:
    print("<월요일 식단>")
elif userInput == 2:
    print("<화요일 식단>")
elif userInput == 3:
    print("<수요일 식단>")
elif userInput == 4:
    print("<목요일 식단>")
elif userInput == 5:
    print("<금요일 식단>")

# columns 는 리스트 형태 --> 인덱스로 접근하여 아침, 점심, 저녁을 출력
# columns 를 출력하면 주소값이 출력이 되므로 .text 메소드를 활용해 출력
print("아침 : " + columns[1].text)
print("점심 : " + columns[2].text)
print("저녁 : " + columns[3].text)

요일과 함께 시간별 메뉴를 출력

 

 

.text 메소드를 사용하지 않은 경우 --> 주소값이 출력

 

 

print()
print("^^ 식사 맛있게 하세요 ^^")

driver.close()

문구와 함께 크롬 드라이버를 종료

 

 

 

<전체 코드>

import time
from selenium import webdriver

days = ['월', '화', '수', '목', '금']

for i, day in enumerate(days):
    print(f"{i+1}.{day}\t", end='')

print()
userInput = int(input("요일을 선택하세요 : "))
print()

driver = webdriver.Chrome('./chromedriver.exe')
driver.get("https://www.kopo.ac.kr/daegu/content.do?menu=4175")
time.sleep(0.3)

table = driver.find_element_by_xpath("/html/body/div[2]/article/div[1]/section[2]/div/div[2]/table[2]")
tbody = table.find_element_by_tag_name("tbody")
rows = tbody.find_elements_by_tag_name("tr")[userInput - 1]
columns = rows.find_elements_by_tag_name("td")

if userInput == 1:
    print("<월요일 식단>")
elif userInput == 2:
    print("<화요일 식단>")
elif userInput == 3:
    print("<수요일 식단>")
elif userInput == 4:
    print("<목요일 식단>")
elif userInput == 5:
    print("<금요일 식단>")

print("아침 : " + columns[1].text)
print("점심 : " + columns[2].text)
print("저녁 : " + columns[3].text)

print()
print("^^ 식사 맛있게 하세요 ^^")

driver.close()

 

 

 

<실행 화면>

 

 

 

 

- Just Do It -

 

반응형

'Python > Web_crawling' 카테고리의 다른 글

[Python] 항공권 크롤링  (3) 2021.07.31
복사했습니다!