본문 바로가기
Python

Python으로 잔여백신 상태 확인하기

by yu901 2021. 7. 25.

각 병원에서 잔여백신이 언제 풀리는지 알 수 없다. 컴퓨터가 자동으로 잔여백신 상태를 확인하도록 코딩하자.

웹 자동화 툴인 Selenium을 사용하고 이전에 포스팅한 크롤링을 응용할 것이다.

Selenium에 대한 자세한 내용은 다음에 포스팅하겠다.

 

 


 

1. 네이버 로그인


from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

from bs4 import BeautifulSoup

import time
chrome_driver = 'D:/seleniumdrivers/chromedriver'
driver = webdriver.Chrome(chrome_driver)

 

 

Selenium 패키지 이것저것 import 하고, 설치한 Chrome 드라이버를 사용하여 드라이버 객체를 만든다.

웹 드라이버를 사용하여 자동으로 Chrome 소프트웨어를 제어하는 것인데, 자세한 개념은 다음에 포스팅하겠다.

위 코드를 실행하려면 Selenium 패키지, Chrome 드라이버를 설치하고, 드라이버를 다운로드한 위치를 'D:/...' 부분에 입력하라.

 

 

chrome_driver = 'D:/seleniumdrivers/chromedriver'
driver = webdriver.Chrome(chrome_driver)

# 네이버 로그인
driver.get('https://www.naver.com')

driver.find_element_by_class_name('link_login').click()

id_text = driver.find_element_by_id('id')
id_text.send_keys("아이디")
pw_text = driver.find_element_by_id('pw')
pw_text.send_keys("패스워드")
pw_text.send_keys(Keys.RETURN)

 

 

네이버를 열고, 로그인 버튼을 클릭하고, 아이디와 패스워드를 입력한 후 엔터키를 누르는 코드이다.

위 코드를 실행하면, 아래 gif와 같이 자동으로 Chrome이 열리고 네이버로 이동하여 로그인을 시도할 것이다.

 

 

네이버 로그인

 

 

다만 네이버에서 '안전을 위해 자동 입력 방지 문자를 입력해주세요.'라는 문구와 함께 간단한 퀴즈를 낼 것이다. 그러면 수동으로 정답을 입력해서 자연스럽게 로그인하면 된다!🤖

 

 

 

2. 잔여백신 페이지 크롤링


# 잔여백신 페이지
driver.get('https://m.place.naver.com/rest/vaccine?vaccineFilter=used')

# '목록보기'가 로딩 될때까지 대기
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '._31ySW')))
# '목록보기' 클릭
driver.find_element_by_class_name('_31ySW').click()

# 현재 페이지 html
soup = BeautifulSoup(driver.page_source)

 

 

이제 병원 별 잔여백신 보유 상태를 확인하자. 잔여백신 페이지로 이동하고, '목록보기' 버튼을 클릭하여 주변에 있는 병원 정보를 불러오고, 페이지 소스를 BeatifulSoup 모듈에 넣는다.

 

 

잔여백신 페이지

 

 

개발자 도구에서 필요한 정보가 어떤 element인지 확인하자. 잔여 백신을 확인하는데 필요한 element는 병원 항목에 해당하는 <li class="_1mrr7"> 태그, 각 병원의 잔여 백신의 상태를 값으로 가지는 <strong> 태그, 새로고침 버튼에 해당하는 <a herf="#" role="button" class="_1MCHh"> 태그, '접종 예약신청' 버튼에 해당하는 <a href="#" role="button" class="lwEWu _1dEyY"> 태그가 있다.

 

 

vaccin = False

# 잔여 백신을 찾는 반복문
while vaccin == False: 
    soup = BeautifulSoup(driver.page_source)
    no = 0
    
    # 잔여 백신이 있는 경우, 반복문 종료
    for hospital in soup.select('li._1mrr7'):
        status = hospital.select_one('a._46SXN > strong').get_text()
        if (status != '대기중') and (status != '마감') and (status != '0'):
            vaccin = True
            break
        no += 1
    
    # 잔여 백신이 없는 경우, 새로고침 버튼 클릭
    if no == 100:
        reset_btn = driver.find_element_by_css_selector('a._1MCHh')
        reset_btn.click()
    

# 잔여 백신이 있는 병원의 '접종 예약 신청' 버튼 클릭
apply_btns = driver.find_elements_by_css_selector("a[class='lwEWu _1dEyY'")
apply_btns[no].click()

 

 

페이지 소스에서 각 병원을 크롤링하고, 잔여 백신 상태를 확인한다. 잔여 백신 상태는 '대기중', '마감', 숫자 값 중 하나를 가지므로 '대기중'이나 '마감'이 아닌 경우, 반복문을 종료한다. 목록 있는 100개 병원 전부 백신을 가지고 있지 않다면 새로고침 버튼을 클릭한다. 백신이 있어서 반복문을 종료하면 해당 병원의 '접종 예약신청' 버튼을 클릭한다.

 


 

 

잔여 백신을 본 적이 없어서, 제대로 동작하는지 확인 못했다. '접종 예약신청' 버튼을 클릭하면 어떤 페이지가 나오는지도 모른다. 이후 단계는 알아서 하자!

'Python' 카테고리의 다른 글

알쓸코드 - 데이터 분석  (1) 2023.11.04
[Python] 리스트 컴프리헨션(list comprehension)  (0) 2021.10.12
영화 리뷰 크롤링  (2) 2021.06.19
Python으로 크롤링(Crawling)하기  (2) 2021.06.07
웹 기본 지식  (2) 2021.05.29

댓글