지난 포스팅에서 오늘 치뤄진 한화 경기 기록 페이지의 url 주소를 link라는 변수에 저장했으니 이제 이 페이지에 들어가 원하는 부분을 캡쳐 후 저장하면 된다.
경기 기록 페이지에서 원하는 부분 캡쳐 후 저장하기
1. 원하는 부분을 어떻게 추출할지 생각하기
한화 경기 기록 페이지로 들어가 원하는 부분이 어디 있는지 확인한다.
내가 가져오고자 했던 부분은 상단의 경기 결과, 기록 그래프, 한화 선수단의 경기 기록이다.
1-1. 경기 기록
상단의 경기 기록에 대해 크롬의 개발자도구(f12)를 켜 확인해 본 결과는 다음과 같다.
"Home_game_head__3EEZZ"라는 클래스를 가진 section 태그로 이루어진 것을 알 수 있다.
1-2. 기록 그래프
"TeamVS_comp_team_vs__fpu3N"라는 클래스를 가진 div 태그로 이루어진 것을 볼 수 있다.
1-3. 한화선수단 기록
"PlayerRecord_record_table_group__2bRI3" 클래스를 가진 div 태그로 이루어진 것을 알 수 있다.
+ 확인 결과 창의 크기에 따라 이 부분의 클래스명은 달라진다. 나는 browser 설정 시 옵션으로 fullscreen 옵션을 주었기 때문에 이 클래스를 가진 div 태그를 택했다.
# headless, fullscreen 옵션 설정
options = webdriver.ChromeOptions()
options.headless = True
options.add_argument("window-size=1920x1080")
options.add_argument('--start-fullscreen')
options.add_argument("user-agent=본인의 user agent 값')
# 옵션 설정 후 browser = webdriver.Chrome(options=options)
2. 해당 페이지로 들어가 원하는 부분 캡쳐하기
지난 포스팅의 link를 저장하는 부분에서 경기 기록 페이지로 들어가는 함수를 따로 만들었다.
# 오늘 날짜의 경기 고르기
if not isDH:
link = "https://sports.news.naver.com/" + game[today - 1].find("span", attrs={"class":"td_btn"}).find("a")["href"]
enterPage(link, 0)
else:
for i in range(0,2):
link = "https://sports.news.naver.com/" + game[today - 1].find_all("span", attrs={"class":"td_btn"})[i].find_all("a")[0]["href"]
enterPage(link, i + 1)
이번에는 바로 코드를 보면서 설명하겠다.
import time
def enterPage(link, num):
browser.get(link)
try:
time.sleep(1)
# 홈 / 원정 확인
home = browser.find_elements_by_class_name('MatchBox_name__11AyG')[1].text
# 경기 결과 캡쳐 후 이미지 저장
result = browser.find_element_by_class_name('Home_game_head__3EEZZ').screenshot_as_png
recordGraph = browser.find_element_by_class_name('TeamVS_comp_team_vs__fpu3N').screenshot_as_png
if(home == '한화'):
playerRecord = browser.find_elements_by_class_name('PlayerRecord_record_table_group__2bRI3')[1].screenshot_as_png
else:
playerRecord = browser.find_elements_by_class_name('PlayerRecord_record_table_group__2bRI3')[0].screenshot_as_png
createImage('result', result, num)
createImage('recordGraph', recordGraph, num)
createImage('playerRecord', playerRecord, num)
except:
print("Enter page Error")
enterPage 함수는 첫번째 인자로 link를 받아 해당 페이지로 들어간다.
경기 기록 페이지를 확인해야 하는데 로딩에 시간이 조금 걸리므로 time.sleep(1)을 해주었다.
time.sleep(1)을 해주지 않으면 찾고자하는 element가 없다고 에러메세지가 나온다.
아까 찾아둔 각 속성을 이용해 해당 element를 찾고 selenium의 속성 중 하나인 .screenshot_as_png을 이용해 각 객체를 png 형식의 바이너리로 추출한다.
여기서 홈/원정 확인이 필요한 이유는 한화가 홈경기인지 원정경기인지에 따라 한화 선수단 기록 표의 위치가 바뀌기 때문이다. (선수단 기록 표는 원정팀-홈팀 순서)
따라서 한화가 홈팀이라면 두번째 표를, 원정팀이라면 첫번째 표를 저장하도록 했다.
마지막으로 저장한 내용을 png 파일로 만드는 부분은 createImage 함수를 따로 만들어 그곳에다 구현하였다.
+ 2021.06.25 이후로 네이버 스포츠 페이지가 개편되어 일부분이 달라졌다.
대표적으로 선수단 기록표가 투수/야수로 나뉘었고 이에 따라 이루어진 태그, 클래스명도 모두 바뀌었다.
따라서 지금 페이지로 만들기 위하여 다음과 같은 수정이 필요하다.
코드 일부분을 발췌한 것이니 이해만 하고 넘어가면 된다.
# team에 한화가 없으면 한화 원정 경기, 있으면 한화 홈 경기
if(team.find('한화') == -1):
playerRecord = browser.find_elements_by_class_name('PlayerRecord_table_area__1fIBC')[0].screenshot_as_png
pitcherRecord = browser.find_elements_by_class_name('PlayerRecord_table_area__1fIBC')[2].screenshot_as_png
# 한화의 승 / 패 여부 확인 -> 한화가 아닌 상대팀이 졌으면 한화 승
if(team.find("승") == -1):
isWin = True
else:
isWin = False
else:
playerRecord = browser.find_elements_by_class_name('PlayerRecord_table_area__1fIBC')[1].screenshot_as_png
pitcherRecord = browser.find_elements_by_class_name('PlayerRecord_table_area__1fIBC')[3].screenshot_as_png
3. png 파일로 저장하기
from datetime import datetime
date = str(datetime.today().month)+ "월" + str(datetime.today().day) + "일"
def createImage(filename, file_png, num):
if not isDH:
with open('image/{}_{}.png'.format(filename,date), 'wb') as f:
f.write(file_png)
else:
with open('image/{}_{}_{}.png'.format(filename,date,num), 'wb') as f:
f.write(file_png)
createImage의 첫번째 인자는 파일 이름, 두번째 인자는 enterPage 함수에서 png 형식의 바이너리값을 저장한 변수, 세번째 인자는 더블헤더 처리를 위한 숫자이다.
더블헤더 경기가 없는 날일 경우, 각 이미지 파일은 image 폴더 아래 파일이름_n월n일.png으로 저장된다.
더블헤더 경기가 있는 날일 경우, 각 이미지 파일은 image 폴더 아래 파일이름_n월n일_n.png으로 저장된다.
여기서 1은 1차전, 2는 2차전을 뜻한다.
+) image 폴더 생성 및 삭제
image 폴더 안에 이미지들을 저장하는데 이 이미지들은 사실 포스팅 이후에는 지워도 되는 이미지들이다.
매번 image 폴더 안을 비워주는 작업이 번거롭다고 느껴져 프로그램 시작 시 image 폴더를 만들고 티스토리 포스팅 이후 image 폴더를 삭제하도록 했다.
import os
import shutil
def createDirectory():
try:
if not os.path.exists('image'):
os.makedirs('image')
except OSError:
print('createDirectory Error')
def removeDirectory():
try:
if os.path.exists('image'):
shutil.rmtree('image')
except OSError:
print('removeDirectory Error')
폴더를 만드는 작업은 os모듈만으로도 가능하지만 os모듈의 rmdir()은 해당 폴더 안에 아무 파일도 없을 경우 가능하다.
나는 이미지 파일이 있는 image 폴더를 지우고 싶기 때문에 shutil모듈의 rmtree() 함수를 사용하였다.
'Python' 카테고리의 다른 글
Python&티스토리 api로 kbo 경기 기록 자동 포스팅하기(6) (0) | 2021.06.17 |
---|---|
Python&티스토리 api로 kbo 경기 기록 자동 포스팅하기(5) (0) | 2021.06.17 |
Python&티스토리 api로 kbo 경기 기록 자동 포스팅하기(4) (0) | 2021.06.17 |
Python&티스토리 api로 kbo 경기 기록 자동 포스팅하기(2) (0) | 2021.06.14 |
Python&티스토리 api로 kbo 경기 기록 자동 포스팅하기(1) (0) | 2021.06.14 |
댓글