프로젝트/[DA] 데이터 분석 : 배구

데이터 수집 (웹 크롤링) (3) - 경기 세부 데이터

sollllllll 2022. 3. 27. 00:10

크롤링을 진행하는 방법은 크롤링(1) 포스트와 크롤링(2) 포스트에서 자세히 다루었다.

크롤링(2) 포스트의 마지막에서 얘기했듯이 이번 포스트에서는 두 번째 크롤링에서 수집한 데이터를 이용해서 세 번째 크롤링을 수행하려고 한다.

 

 

(1) 수집할 태그 찾기

이번에는 아래의 웹 페이지에서 데이터를 모을 예정이다.

url을 보면 "https://m.sports.naver.com/game/20211016018F2/record" 의 형태로,

공통부분 뒤의 '경기날짜(20211016)+018(리그 고유번호이다. 18번째 리그라는 뜻)+F(여자부)+경기번호' 가 경기마다 바뀌는 내용이다.

바로 이것 때문에 이전 포스트에서 데이터를 수집할 때 가공된 새 날짜와 경기 번호 데이터를 저장한 것이다.

경기 세부 기록

한 경기에서의 세부 기록들이 나와있다.

이 중 [공격 성공률, 블로킹, 서브, 상대 범실, 디그, 리시브, 세트] 데이터를 통해 세부 기록 데이터를 만들 것이다.

 

데이터를 모으기 위해 태그가 나타나있는 코드를 살펴보았다.

페이지 코드

기존과 같이 table 안에 데이터들이 있는데 뭔가 기존 방법대로 하기에는 복잡해 보인다.

하지만 자세히 보면 값을 저장하는 부분은 div 태그 안의 클래스명이 "MatchRecord_score__n8YYu"으로 모두 동일하다.

따라서 이번에는 조금 다른 방식으로 데이터를 모아볼 것이다.

 

 

 

(2) 코드 작성

코드 작성에서 기존과 공통인 부분은 생략한다.

일단 이전에 수집한 새 날짜, 경기 번호, 총 세트 수를 저장한 리스트의 길이는 서로 같다.

따라서 날짜 리스트를 이용해 반복문의 범위를 지정하고 각 날짜, 경기번호, 총 세트 수를 새로운 변수에 저장했다.

 

다음은 url 을 설정하는 부분인데, 이번 시즌 정규 리그는 2021년 10월부터 2022년 03월까지 진행되었다.

따라서 url 의 날짜를 설정하는 부분이 월에 따라 연도가 다른데, date 변수와 조건문을 통해 설정해주었다.

그리고 위에서 미리 찾아놓은 div 태그의 클래스명으로 요소들을 찾았다. (find_elements)

"MatchRecord_score__n8YYu" 을 클래스명으로 가진 태그들을 모두 모으고 그 중 몇 번째인지에 따라 값을 저장한 것이다. 예를 들어 공격 성공률은 2,3 인덱스, 공격 총 개수는 4,5 인덱스에 저장되어 있었다.

추가로 공격 성공률 외의 데이터는 경기 도중의 총 개수인데 이를 세트 당 개수로 변환하고 2의 자리까지 반올림했다.

또한 범실 부분은 상대 범실이 등록되어 있었기 때문에 순서를 바꾸어 저장했다.

(마찬가지로 데이터를 리스트에 추가하는 부분은 생략했다.)

for i in range(len(ndatelist)):
    date = ndatelist[i]
    gamenum = gamenumlist[i]
    setnum = setlist[i]
    if date[0]=='1':
        search_url = "https://m.sports.naver.com/game/"+'2021'+date+"018F"+gamenum+"/record"
    else:
        search_url = "https://m.sports.naver.com/game/"+'2022'+date+"018F"+gamenum+"/record"

    ...

    # 크롤링 할 데이터 클래스 찾기
    val = browser.find_elements_by_class_name('MatchRecord_score__n8YYu')

    atsuccH = float(val[2].text)
    atsuccA = float(val[3].text)
    atcntH = round(int(val[4].text)/setnum,2)
    atcntA = round(int(val[5].text)/setnum,2)
    blcntH = round(int(val[6].text)/setnum,2)
    blcntA = round(int(val[7].text)/setnum,2)
    svcntH = round(int(val[8].text)/setnum,2)
    svcntA = round(int(val[9].text)/setnum,2)
    errcntH = round(int(val[13].text)/setnum,2)
    errcntA = round(int(val[12].text)/setnum,2)
    digcntH = round(int(val[14].text)/setnum,2)
    digcntA = round(int(val[15].text)/setnum,2)
    rscntH = round(int(val[16].text)/setnum,2)
    rscntA = round(int(val[17].text)/setnum,2)
    setcntH = round(int(val[18].text)/setnum,2)
    setcntA = round(int(val[19].text)/setnum,2)

...

 

 

 

(3) 데이터 저장

이렇게 모은 데이터들을 마찬가지로 데이터 프레임으로 변환한 후 csv 파일로 저장했다.

경기 세부 데이터

이전에 모았던 경기의 대략적인 데이터와 총 개수가 같은 것을 볼 수 있다.

이렇게 두 번에 걸쳐서 경기 데이터를 모두 수집했다. 이제 가지고 있는 데이터들을 통해 모델을 학습시켜 볼 것이다.