본문 바로가기
  • Fearless
프로그래밍언어/python

[파이썬] openpyxl & selenium 활용법

by Albatross 2022. 2. 8.
반응형
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from openpyxl import Workbook

wb = Workbook()
sheet = wb.active
sheet.append(['date','region','normal','book'])

def set_chrome_driver():
    chrome_options = webdriver.ChromeOptions()
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
    return driver

driver = set_chrome_driver()
driver.implicitly_wait(2)

id = 'GoalPanZi'
pw = 'password'

driver.get('web_url')
driver.find_element_by_name('mem_id').send_keys(ljh_id) # id
driver.find_element_by_name('mem_pass').send_keys(pw) # pw
driver.find_element_by_xpath('//*[@id="gmyd_quick_menu"]/div/div/form/p/input').click()

for i in range(5500,9871):
    driver.get('web_url.page={}'.format(i))
    title = driver.find_element_by_xpath('//*[@id="contents"]/div/div/div[3]/table/thead/tr/th').text # 지역명
    region = title[1:3]
    date = title[-9:-1]
    if "지역시세" in date:
        continue
    normal = driver.find_element_by_xpath('//*[@id="contents"]/div/div/div[3]/table/tbody/tr[6]/td/table/tbody/tr[1]/td[2]/table[4]/tbody/tr/td[2]').text
    book = driver.find_element_by_xpath('//*[@id="contents"]/div/div/div[3]/table/tbody/tr[6]/td/table/tbody/tr[1]/td[2]/table[5]/tbody/tr/td[2]').text
    normal = normal[:4]
    book = book[:4]
    if "원" in normal:
        normal = normal[:2]
    if "원" in book:
        book = book[:2]
    sheet.append([date, region, normal, book])
    wb.save('ZEZIGAZUA.xlsx')

필요할 때마다 새로이 만들었는데 정형화된 틀을 하나 저장한 뒤 상황에 맞춰 수정해나가면 좋을 듯하여 올린다. 

불과 얼마전까지만해도 bs4를 사용해왔는데 동적인 작업을 웹페이지 내에서 행할 경우 selenium이 압도적으로 좋다는 사실을 깨닫게 되었다. 또한 selenium의 경우 작업과정을 육안으로 확인할 수 있고, find_element_by_xpath라는 좋은 tool이 있기 때문에 나같은 길바닥출신들에겐 참 편리한 module이 아닌가 싶다. 

 

이번 크롤러는 특정 웹사이트에서 제공되는 원자재 지표를 엑셀에 저장하기 위해 만들어졌다. 4개의 권역별 가격이 매일 업로드되어있기 때문에 17년 하반기부터 자료를 수집할 경우 4000개의 개별데이터가 수집된다. 이번에 겪은 애로사항은 다음과 같다. 동일한 문제를 겪는 초보개발자들이 많을 듯하여 주제 넘지만 올려본다. 

 

첫째, selenium과 pycharm의 충돌로 인해 jupyter에서 구동했다. 버전 업그레이드에 따른 호환성 문제가 존재한다. 

둘째, set_chrome_driver 함수는 chromedriver가 정상적으로 작동하지 않아 만든 것이다. 불과 수개월 전만해도 기존에 사용하던 chrome application 말고 chromedriver를 따로 설치하여 이를 구동해야만 했었는데, 이 또한 호환의 문제 때문에 기존 chrome application을 사용할 수 있도록 함수를 생성했다. 

셋째, 어느 웹사이트가 그렇지 않겠냐만은 page={}에 for loop을 걸어뒀는데 중간마다 빈페이지가 존재하여 이를 예외처리 해주었다. 다행히 일정한 패턴이 존재하여 대처할 수 있었다. 아마 try except를 사용했으면 더욱 깔끔했을텐데 코드가 지저분한 감이 없잖아 있는듯하다. 

반응형