python과 selenium을 활용해 갱신버튼 누르는 것도 자동화 해보자! 😀
기본적인 사용법은 외부 스크립트로 자동화하기 글 링크로 대체합니다.
갱신버튼을 누르기 위해서는 apps script와 비슷하게 일단 캐릭터 검색 결과창으로 가야합니다. 따라서 비슷한 방법으로 1열에 존재하는 캐릭터명을 받아와 selenium으로 결과창으로 가면됩니다.
위 글 링크 예시에 있는 worksheet.col_values(1)
를 사용하여 캐릭터명을 받아왔습니다.
refresh_character.py
import gspread
def main():
scopes = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
gc = gspread.service_account(filename='JSON 파일 경로.json')
sheet = gc.open_by_url('스프레드 시트 url')
worksheet = sheet.worksheet("시트1") # 이름으로 워크시트 선택
character_list = worksheet.col_values(1)[1:] # '캐릭터명' 빼고 리스트 구성
if __name__ == '__main__':
main()
character_list = worksheet.col_values(1)[1:]
: 1열의 첫번째 값은 '캐릭터명'이므로 1번 인덱스 부터 저장하도록 슬라이싱하였습니다.$ pip install selenium
설치 시 가끔 pip 오류가 발생하는데 보통 pip 업데이트로 해결됩니다. pip 업데이트 도중에 또 에러가 발생한다면 다음 링크 글을 참조해주세요.
본 포스팅에서는 selenium 4.1.3 버전을 사용합니다.
selenium의 신규 버전(4.0.0 이상)에서는 예전처럼 직접 로컬에 크롬 드라이버를 다운 받지 않고 크롬 브라우저를 사용할 수 있습니다. 해당 기능 사용을 위해 webdriver_manager를 설치했습니다.
$ pip install webdriver_manager
이제 받아온 캐릭터명 리스트로 각각의 메이플지지 검색결과 창으로 가서 갱신버튼을 눌러주었습니다.
refresh_character.py
import gspread
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
def main():
worlds = ["루나", "스카니아", "엘리시움", "크로아", "오로라", "베라", "레드", "유니온", "이노시스",
"제니스", "아케인", "노바", "리부트1", "리부트2"]
scopes = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
gc = gspread.service_account(filename='JSON 파일 경로.json')
sheet = gc.open_by_url('스프레드시트 url')
worksheet = sheet.worksheet('명부') # 이름으로 워크시트 선택
character_list = worksheet.col_values(1)[1:] # '캐릭터명' 빼고 리스트 구성
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
for character in character_list:
if character == '' or character in worlds:
continue
base_url = 'https://maple.gg/u/'
url = base_url + character
driver.get(url) # 검색 결과 페이지로 이동
refresh = driver.find_element(by=By.XPATH, value='//*[@id="btn-sync"]') # xpath를 통해 갱신버튼 클릭
refresh.click()
time.sleep(15) # 갱신 시간 기다림
if __name__ == '__main__':
main()
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
: chromedriver를 따로 사용하지않고 설치된 크롬을 이용해 selenium을 사용합니다.refresh = driver.find_element(by=By.XPATH, value='//*[@id="btn-sync"]')
: 갱신버튼을 xpath를 통해 찾습니다.refresh.click()
: 위에서 찾은 갱신버튼을 클릭해줍니다.갱신버튼이 잘 클릭되는 것을 확인할 수 있습니다.
갱신버튼을 누르는 것은 하루 1회만 작동하면 되는 기능인 반면, 명부 갱신은 신규 인원 등록 혹은 캐릭터명 변경 등으로 하루에 여러번 시트상에서 실행될 수 있습니다. 따라서 시간절약과 편리함을 얻기 위해 두 기능을 분리하였습니다.
스크래핑을 하다 보면 에러가 발생할 수도 있는데 이런 에러들을 어떻게 처리할까? 🤔
pip 업데이트 에러 ( 재설치) 'NoneType' object has no attribute 'bytes' - [일상(日常)]
DeprecationWarning: executable_path has been deprecated selenium python