본문 바로가기
Python

Python&티스토리 api로 kbo 경기 기록 자동 포스팅하기(2)

by _sweep 2021. 6. 14.

먼저 우리가 가져올 페이지를 확인해야 한다.

한화이글스의 경기 기록 페이지를 들어가는 것은 여러 방법이 있다.

 

1. 오늘 날짜의 경기 기록 페이지 url로 바로 들어가기

한화가 대역전을 했던 날인 6월 6일 페이지를 가져왔다.

 

https://m.sports.naver.com/game/20210606HHNC02021/record

 

위 url을 살펴보면 경기 날짜와 팀 이름으로 url 주소가 이루어진 것을 알 수 있다.

따라서 오늘 날짜 + HH(한화) + 상대팀으로 url 주소를 유추할 수 있다.

 

하지만 이런 방법을 사용하기에는 경우의 수가 많다.

오늘 경기를 할 팀을 미리 확인해야 하고, 한화의 홈 경기인지 원정 경기인지에 따라 팀 이름의 위치가 바뀌기 때문에 이런 점도 신경써야 한다.

 

2. 일정 표에서 오늘 날짜의 경기 기록 결과 버튼을 눌러 들어가기

그래서 나는 2번째 방법을 택했다.

 

 

네이버 스포츠 > 야구 > 일정/결과 페이지로 들어가 하단의 일정 표에서 한화를 클릭하여 한화의 경기 기록만을 띄운 후 이곳에서 오늘 날짜의 경기 결과 버튼을 눌러 해당 페이지로 들어가는 것이다.

 

오늘 날짜의 한화 경기 기록 페이지 URL 얻기

 

1. 일정표에서 한화 경기 기록만 띄우게 하기

 

먼저 네이버 스포츠 > 야구 > 일정/결과 페이지에서 한화를 눌러 한화의 경기 기록만을 띄우게 해야 한다.

 

크롬의 개발자도구(f12)를 켜 해당 버튼을 살펴보면 다음과 같이 구성되어 있다.

 

"tab_team"이라는 클래스를 가진 div 태그 밑에 ul, li 태그 들이 있고 li 태그 밑에 a, img, p 태그가 있는데 이 p 태그의 text가 한화인 것을 볼 수 있다.

 

따라서 "tab_team"이라는 클래스를 가진 element를 찾고 또 찾은 내용에서 한화라는 text를 가진 element를 찾아 클릭하도록 하면 된다.

 

from selenium import webdriver
from bs4 import BeautifulSoup

browser = webdriver.Chrome()

url = 'https://sports.news.naver.com/kbaseball/schedule/index.nhn#'
browser.get(url)

# 일정 테이블에서 한화 클릭하기
browser.find_element_by_class_name('tab_team').find_element_by_link_text("한화").click()

 

이제 일정 표는 한화의 경기기록만을 보여줄 것이다.

 

2. 표에서 경기 기록 태그 가져오기

 

오늘 날짜의 경기 기록을 보기 위해서는 다시 개발자도구로 이 표가 어떻게 구성되어있는지 확인해야 한다.

 

"tb_wrap"이라는 클래스를 가진 div 태그 밑에 "sch_tb"로 시작하는 클래스들을 가진 div 태그가 있고 이 div 태그들이 각 날짜와 일대일 매칭된다.

따라서 6일 경기 기록을 찾기 위해서는 "tb_wrap"이라는 클래스를 가진 div 태그 밑에 6번째 div 태그를 찾으면 된다.

 

여기서 문제점은 div 태그들의 클래스가 다 같지 않고 "sch_tb"와 "sch_tb2"가 번갈아 나온다는 것이다.

sch_tb로 시작하는 클래스를 가진 div 태그를 모두 찾기 위해 정규식을 사용해야 한다.

 

import re

soup = BeautifulSoup(browser.page_source, "lxml")

game = soup.find("div", attrs={"class":"tb_wrap"}).find_all("div", attrs={"class":re.compile("^sch_tb")})

 

3. 더블헤더 처리

 

game에서 오늘 날짜를 찾고 경기 기록 페이지 url을 가져오면 되지 않을까 싶지만, 야구에는 더블헤더가 있다.

 

 

하루에 두 차례 경기를 하는 경우 한 날짜 안에 경기 기록 페이지가 2개 생기게 된다. 

따라서 이러한 처리도 해줘야 한다.

 

더블헤더가 이뤄지는 날짜의 경우 표의 태그를 살펴보면 tbody > tr > td의 rowspan이 2인 것을 확인할 수 있다.

 

 

위 사실과 python의 datetime을 이용해 오늘 날짜를 저장한 후 해당 날짜에 더블헤더 일정이 있는지 체크해주면 된다.

체크를 위해 isDH라는 글로벌 변수를 생성했고 이 곳에다가 더블헤더가 있으면 True를, 없으면 False를 저장하게 했다.

 

from datetime import datetime

today = datetime.today().day
global isDH 

# 오늘 날짜에 더블헤더 일정이 있는지 체크
if(game[today - 1].find("td", attrs={"rowspan":"2"}) == None):
    isDH = False
else:
    isDH = True

 

4. 경기 결과 페이지 url 가져오기

 

표에서 오늘 날짜의 div 태그도 가져왔고 더블헤더 일정도 체크했으니 이제 마지막으로 경기결과 버튼을 이용해 오늘 날짜의 경기 기록 페이지 url을 가져오면 된다.

 

 

경기결과 버튼을 살펴보면 위와 같은 태그로 구성되어 있다.

 

"td_btn"이라는 클래스를 가진 span 태그 아래 a 태그에 우리가 원하는 값인 url 주소가 적혀있는 것을 볼 수 있다.

 

# 오늘 날짜의 경기 고르기
if not isDH:
    link = "https://sports.news.naver.com/" + game[today - 1].find("span", attrs={"class":"td_btn"}).find("a")["href"]
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"]

 

드디어 link 라는 변수에 우리가 원하는 오늘 날짜의 경기 기록 페이지 url 주소를 저장했다.

댓글