[토이 프로젝트] 자동 갱신 게임 명부 제작(2) - 캐릭터 정보 갱신버튼 클릭 자동화

chaejm55·2022년 4월 12일
0

0. 이번 단계 진행 아이디어

python과 selenium을 활용해 갱신버튼 누르는 것도 자동화 해보자! 😀

1. gspread 사용하기

기본적인 사용법은 외부 스크립트로 자동화하기 글 링크로 대체합니다.

2. 명부 시트에서 정보 받아오기

갱신버튼을 누르기 위해서는 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번 인덱스 부터 저장하도록 슬라이싱하였습니다.

3. selenium으로 갱신버튼 누르기

1) selenium 설치 및 chromedriver 다운

$ 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회만 작동하면 되는 기능인 반면, 명부 갱신은 신규 인원 등록 혹은 캐릭터명 변경 등으로 하루에 여러번 시트상에서 실행될 수 있습니다. 따라서 시간절약과 편리함을 얻기 위해 두 기능을 분리하였습니다.

4. 다음 고민

스크래핑을 하다 보면 에러가 발생할 수도 있는데 이런 에러들을 어떻게 처리할까? 🤔

5. Reference

pip 업데이트 에러 ( 재설치) 'NoneType' object has no attribute 'bytes' - [일상(日常)]

Selenium 4.1.0 documentation

DeprecationWarning: executable_path has been deprecated selenium python

profile
여러가지를 시도하는 학생입니다

0개의 댓글