[OPGG] 페이커 게임 정보 스크래핑 (3)
Updated:
1. 페이커 신드라 정보
이번엔 모든 챔피언이 아닌 신드라에 대한 정보만 스크래핑 할 것이다.
큰 차이는 없으며 selenium으로 신드라를 입력하고 클릭하는 명령을 추가해주었다.
import requests
import time
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
# selenium을 백그라운드로 실행하기 위해 옵션 설정
options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('window-size=1920x1080')
# 우리가 데이터를 가져올 웹 페이지입니다.
faker_opgg_url = 'https://www.op.gg/summoner/userName=Hide%20on%20bush'
# selenium이 제어할 chrome을 실행합니다.
# driver = webdriver.Chrome("./chromedriver")
driver = webdriver.Chrome("./chromedriver", options= options)
# 데이터를 가져올 페이지로 이동합니다.
driver.get(faker_opgg_url)
# 챔피언 검색창에 'Syndra' 입력
driver.find_element_by_id('right_search_champion').find_element_by_css_selector('input.Input').send_keys('신드라\n')
time.sleep(1)
# 매치 탭에서 'Ranked Solo' 클릭
driver.find_element_by_id('right_gametype_soloranked').click()
time.sleep(1)
# '더 보기' 버튼이 활성화되어있으면(리스트의 끝까지 도달하지 않았으면) 계속 클릭하여 이전 게임을 모두 로딩합니다.
while True:
try:
driver.find_element_by_css_selector('.GameMoreButton').click()
# 게임 로딩, html 코드 변경까지 여유 시간을 1초 가집니다.
time.sleep(1)
# 에러가 나면(페이지에서 '더 보기' 버튼이 없을 경우) while문을 탈출합니다.
except Exception as e:
pass
break
# 결과가 들어갈 빈 리스트를 만듭니다.
faker_champions = []
faker_kills = []
faker_deaths = []
faker_assists = []
faker_results = []
# 각 게임에 대해 웹 페이지에 기재된 스탯을 찾아서(selector 사용) 결과 리스트에 append하기
for gamelist in driver.find_elements_by_css_selector('div.GameItemList'):
for game in gamelist.find_elements_by_css_selector('div.GameItemWrap'):
faker_champions.append(game.find_element_by_css_selector('div.ChampionName').text.strip())
faker_kills.append(game.find_element_by_css_selector('div.KDA').
find_element_by_css_selector('div.KDA').
find_element_by_css_selector('span.Kill').text.strip())
faker_deaths.append(game.find_element_by_css_selector('div.KDA').
find_element_by_css_selector('div.KDA').
find_element_by_css_selector('span.Death').text.strip())
faker_assists.append(game.find_element_by_css_selector('div.KDA').
find_element_by_css_selector('div.KDA').
find_element_by_css_selector('span.Assist').text.strip())
faker_results.append(game.find_element_by_css_selector('div.GameStats').
find_element_by_css_selector('div.GameResult').text.strip())
-
page_source
를 사용해서requests
패키지를 사용하는 대신 셀레니움 자체에서 진행 -
gamelist에는 한 세트(20개의 대전 정보)가 있고 이중 for문 형태
# selenium이 제어하는 크롬을 종료합니다.
driver.quit()
# DataFrame으로 변환 후 출력
faker_total_df = pd.DataFrame([faker_champions,
faker_results,
faker_kills,
faker_deaths,
faker_assists],
index = ['champion', 'result', 'kills', 'deaths', 'assists']).T
faker_total_df
champion | result | kills | deaths | assists | |
---|---|---|---|---|---|
0 | 신드라 | 승리 | 5 | 2 | 3 |
1 | 신드라 | 승리 | 7 | 4 | 4 |
2 | 신드라 | 승리 | 5 | 2 | 4 |
3 | 신드라 | 패배 | 6 | 4 | 6 |
4 | 신드라 | 승리 | 5 | 4 | 9 |
5 | 신드라 | 승리 | 8 | 3 | 17 |
6 | 신드라 | 패배 | 5 | 10 | 10 |
7 | 신드라 | 패배 | 4 | 3 | 4 |
8 | 신드라 | 승리 | 7 | 4 | 10 |
9 | 신드라 | 승리 | 6 | 6 | 9 |
10 | 신드라 | 승리 | 17 | 4 | 5 |
11 | 신드라 | 패배 | 3 | 10 | 2 |
12 | 신드라 | 승리 | 6 | 6 | 10 |
13 | 신드라 | 패배 | 5 | 4 | 2 |
14 | 신드라 | 패배 | 0 | 7 | 9 |
15 | 신드라 | 패배 | 2 | 1 | 0 |
16 | 신드라 | 승리 | 3 | 3 | 6 |
17 | 신드라 | 승리 | 15 | 6 | 13 |
18 | 신드라 | 패배 | 5 | 4 | 10 |
19 | 신드라 | 승리 | 4 | 4 | 6 |
20 | 신드라 | 승리 | 8 | 1 | 4 |
21 | 신드라 | 패배 | 7 | 7 | 4 |
22 | 신드라 | 승리 | 1 | 5 | 8 |
23 | 신드라 | 패배 | 4 | 9 | 5 |
24 | 신드라 | 승리 | 3 | 2 | 9 |
25 | 신드라 | 패배 | 5 | 7 | 3 |
26 | 신드라 | 승리 | 4 | 1 | 4 |
27 | 신드라 | 승리 | 6 | 2 | 8 |
28 | 신드라 | 패배 | 1 | 2 | 1 |
29 | 신드라 | 패배 | 4 | 6 | 9 |
30 | 신드라 | 승리 | 7 | 2 | 14 |
31 | 신드라 | 패배 | 4 | 5 | 6 |
32 | 신드라 | 패배 | 2 | 3 | 1 |
33 | 신드라 | 승리 | 3 | 4 | 6 |
34 | 신드라 | 패배 | 2 | 5 | 2 |
Leave a comment