[OPGG] 페이커 게임 정보 웹 스크래핑 (1)

Updated:

1. 웹 스크래핑

이번 강의에서는 웹 스크래핑에 대해 배웠다.

여기선 페이커의 플레이 정보를 OPGG 웹 사이트에서 불러올 것이다.

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 우리가 데이터를 가져올 웹 페이지입니다.
faker_opgg_url = 'https://www.op.gg/summoner/userName=Hide%20on%20bush'

# 페이지의 html 코드를 faker_html로 저장합니다.
faker_html = requests.get(faker_opgg_url).text

# html 형식에 맞춰 파싱(parsing; 추후 이용하기 쉽도록 쪼개기)합니다.
faker_soup = BeautifulSoup(faker_html, "html.parser")
# faker_soup
  • HTML 파일을 확인 가능하나 매우 기니까 원한다면 주석 해제하여 구조를 살펴보자.
# 결과가 들어갈 빈 리스트를 만듭니다.
faker_recent_champions = []
faker_recent_kills = []
faker_recent_deaths = []
faker_recent_assists = []
faker_recent_results = []
# 전체 html 코드 중 우리가 원하는 selector를 만족하는 것만 가져오기
faker_recent_games_html = faker_soup.select('div.GameItemList div.GameItemWrap')

# 그렇게 가져온 html 코드의 element 개수 == 한 페이지에 최초로 로딩된 최근 게임 수 출력
recent_game_len = len(faker_recent_games_html)
print(recent_game_len)
20
  • OPGG에선 한 페이지에 최근 20게임이 로드된다.

  • select()등 워낙 다양한 메소드가 많으니 직접 해보면서 찾아보는 것이 중요하다.

type(faker_recent_games_html)
list
  • select() 사용하면 리스트 형태로 저장된다.
# 각 게임에 대해 웹 페이지에 기재된 스탯을 찾아서(selector 사용) 결과 리스트에 append하기
for i in range(recent_game_len):
    faker_recent_champions.append(''.join(list(faker_recent_games_html[i].select('div.ChampionName')[0].
                                               stripped_strings)))
    faker_recent_kills.append(list(faker_recent_games_html[i].select('div.KDA div.KDA span.Kill')[0].
                                               stripped_strings)[0])
    faker_recent_deaths.append(list(faker_recent_games_html[i].select_one('div.KDA div.KDA span.Death').
                                               stripped_strings)[0])
    faker_recent_assists.append(list(faker_recent_games_html[i].select('div.KDA div.KDA span.Assist')[0].
                                               stripped_strings)[0])
    faker_recent_results.append(list(faker_recent_games_html[i].select('div.GameStats div.GameResult')[0].
                                               stripped_strings)[0])
#     아래 코드는 data-game-result라는 attr 가져오는 방법 다만 다시하기도 lose라 되있어서 사용 x
#     faker_recent_results.append(faker_recent_games_html[i].select_one('div.GameItem')['data-game-result'])
  • 각 태그들은 본인이 직접 F12(개발자 모드)로 확인하면서 지정하면 된다.
# DataFrame으로 변환 후 출력
faker_recent_df = pd.DataFrame([faker_recent_champions,
                                faker_recent_results,
                                faker_recent_kills,
                                faker_recent_deaths,
                                faker_recent_assists],
                               index = ['champion', 'result', 'kills', 'deaths', 'assists']).T
faker_recent_df
champion result kills deaths assists
0 Orianna Victory 10 3 18
1 Lee Sin Victory 8 4 14
2 Anivia Defeat 7 5 10
3 LeBlanc Victory 4 2 4
4 Blitzcrank Victory 4 1 17
5 Orianna Defeat 3 3 0
6 Orianna Defeat 2 7 3
7 Tristana Victory 9 8 9
8 Vayne Victory 8 5 10
9 Aphelios Victory 5 7 2
10 Orianna Victory 6 5 9
11 Xerath Victory 9 2 9
12 LeBlanc Victory 9 2 12
13 Zed Victory 4 5 7
14 Ryze Defeat 4 8 4
15 Irelia Defeat 2 2 4
16 Varus Victory 5 2 6
17 Renekton Victory 11 2 4
18 Orianna Remake 0 0 0
19 Orianna Victory 10 5 6
  • 페이커의 최근 플레이한 정보를 위와 같이 OPGG 사이트에서 잘 불러왔다.

  • 아래 코드들은 출력 형태에 대해 파악해보려고 작성한 것이다.

faker_recent_games_html[0].select('div.ChampionName')
[<div class="ChampionName">
 <a href="/champion/orianna/statistics" target="_blank">Orianna</a>
 </div>]
faker_recent_games_html[0].find("div", attrs={"class":"ChampionName"})
<div class="ChampionName">
<a href="/champion/orianna/statistics" target="_blank">Orianna</a>
</div>
  • find() 메소드를 사용해도 된다.

  • select()와는 다르게 리스트 형태가 아닌 기존 값?을 그대로 출력한다.

faker_recent_games_html[0].select('div.ChampionName')[0].get_text()
'\nOrianna\n'
  • select()의 리스트에서 첫 번째 값을 get_text()하면 위와 같은 형태이다.
list(faker_recent_games_html[0].select('div.ChampionName')[0].strings)
['\n', 'Orianna', '\n']
  • strings를 사용하면 다음과 같이 분리되어 리스트로 나타난다.
list(faker_recent_games_html[0].select('div.ChampionName')[0].stripped_strings)
['Orianna']
  • stripped_strings을 사용하면 불필요한 문자는 지워지고 리스트로 나타난다.

Leave a comment