본문 바로가기
Python

[파이썬] 스타크래프트 저그, 테란, 프로토스 맵별 승률 추출 크롤링

by 퍼포먼스마케팅코더 2022. 7. 28.
반응형

이는 심심하게 와이고수에서 각 맵별 승률이 어느정도 되는지를 보고자 해서 따왔다. 한 10년 이상치의 데이터 승률이 보관돼 있는 게시판에서 해당 데이터를 가져오기가 쉽지는 않았는데.. 여윽시나 파이썬으로 긁었더니 금방 된다. 다만 와이고수에서 가져온 것이니 무단으로 계속 크롤링으로 긁어서 가져오긴 말자.  

 

파이썬 스타크래프트 저그, 테란, 프로토스 맵별 승률 추출 크롤링

아래의 파이썬 코딩을 보면 맵, 리그, 승자, 승자종족, 패자, 패자종족, 그리고 상세, 날짜 등이 있다. 이에 raw데이터 형식으로 가져와서 csv 파일로 넣어주는 방식으로 진행했다. 이에 해당 데이터를 가지고 DB에 넣어 sql로 쿼리 조회를 해보던지 아니면 pandas 로 해당 데이터의 흐름을 살펴보는것도 좋을 것 같다는 생각이 든다. 갠적으로 몇몇 데이터를 살펴봤는데, 정말 맵의 밸런싱이 최악이었던 맵들이 몇몇 있긴 했다. 그 중에서.. 스노우 바운드던가? 그런 맵도 있었다. 나중에 한번 작성해보던가 해야겟다.

import requests
from bs4 import BeautifulSoup

f =  open('C:/Users/user/raw/starcraft_stats.csv', 'w')
f.write("승자,승자종족,패자,패자종족,맵,리그,상세,날짜"+'\n')

for n in range(1, 1488) :
    raw = requests.get("https://ygosu.com/reports/?m2=result&s_type=oneonone&s_type2=all&search=&searcht=&page=" + str(n))  #와이고수 게시판
    html = BeautifulSoup(raw.text, 'html.parser')
    results = html.select('#contain > div.content_wrap2 > table > tbody > tr')
    for ar in results :
        win = ar.find("td", {"class" : "win"}).text #승자
        win_2 = win.replace("(", "") #괄호 제거
        win_3 = win_2.replace(")", "") #괄호 제거
        win_4 = win_3.replace("Z", ",저그") #저그로 바꾸기
        win_5 = win_4.replace("T", ",테란") #테란로 바꾸기
        win_6 = win_5.replace("P", ",프로토스") #프로토스로 바꾸기
        lose = ar.find("td", {"class" : "lose"}).text #패자
        lose_2 = lose.replace("(", "") #괄호 제거
        lose_3 = lose_2.replace(")", "") #괄호 제거
        lose_4 = lose_3.replace("Z", ",저그") #저그로 바꾸기
        lose_5 = lose_4.replace("T", ",테란") #테란로 바꾸기
        lose_6 = lose_5.replace("P", ",프로토스") #프로토스로 바꾸기
        map = ar.find("td", {"class" : "map"}).text #맵
        map_2 = map.replace(",", "")  #쉼표 제거
        league = ar.find("td", {"class" : "lg"}).text #리그
        league_2 = league.replace(",", "") #쉼표 제거
        det = ar.find("td", {"class" : "det"}).text #상세
        det_2 = det.replace(",", "") #쉼표 제거
        date = ar.find("td", {"class" : "date"}).text #날짜
        f.write(win_6 +',' + lose_6 +',' + map_2 +',' + league_2 +',' + det_2 +',' + date + '\n') 

f.close()
반응형

댓글