최근에 매직 더 개더링에 관심이 생겨서 이걸 데이터 분석을 해보려고 마음을 먹었다.
일단 MTG Goldfish에서 제공하지 않는 자료를 해보려고 생각했기에 덱 내부에 있는 소스들이 얼마나 상관관계가 있는지를 분석해보기 위해서 모든 덱의 자료를 가져왔다.
일단 어떤 카드가 얼마나 많이 쓰이는지, 그 카드의 희귀도랑 카드가 나올 확률이랑 가격이 어떤 관계가 있는지 확인을 해보기 위해 먼저 스탠다드 포맷에서 우승한 카드를 가져왔다.
============================= Python =============================
from bs4 import BeautifulSoup
import urllib.request as req
from pprint import pprint
import pandas as pd
##### csv로 카드 데이터 저장하기 #####
'''
1. https://www.mtggoldfish.com/metagame/standard/full#paper에 있는 <a href>의 내용을 저장한다.
2. https://www.mtggoldfish.com/ 에 위에 나온 값을 붙여서 페이지에 접속
3. 2에서 나온 url의 Paper 탭에서 card_qty, card_name, card_price 데이터를 저장.
4. 2에서 나온 url의 Arena 탭에서 card_rarity 데이터를 저장.
5. 3과 4에서 나온 데이터를 DataFrame으로 바꾼다.
6. 5에서 나온 DataFrame을 csv로 바꿔서 저장.
'''
# 가져올 주소
main_url = "https://www.mtggoldfish.com/metagame/standard/full#paper"
### urllib.request와 bs4를 이용하여 메타 덱 리스트 뽑는 함수
# 저장할 덱 리스트(홈페이지의 a href 주소 저장)
deck_list = []
# 메타 덱 리스트를 뽑는 함수
def get_deck_list(url):
res = req.urlopen(url)
soup = BeautifulSoup(res, "html.parser")
list = soup.select("div.archetype-tile-description-wrapper > div > h2 > span.deck-price-paper > a")
for deck in list:
deck_list.append(deck.get('href')) # 여기서 앵커 태그의 href의 부분을 추출한다.
get_deck_list(main_url) # 동작 확인
# pprint(deck_list) # 데이터 확인
### 덱 세부 내용이 있는 페이지로 접속하여 card_qty. card_name, card_price, card_rarity 데이터를 저장.
# 저장할 객체 선언.
card_qty = []
card_name = []
card_price = []
card_rarity = []
for list in deck_list:
# url을 만들어서 각 덱에 있는 자료를 수집할 준비를 한다.
deck_url = "https://www.mtggoldfish.com" + list
res = req.urlopen(deck_url)
soup = BeautifulSoup(res, "html.parser")
# css selector를 이용해서 원하는 자료를 수집한다.
card_qty_raw = soup.select("div#tab-paper > "
"div.deck-view-decklist.deck-view-decklist-compact > "
"div.deck-view-decklist-inner > "
"table.deck-view-deck-table > "
"tr > td.deck-col-qty")
card_name_raw = soup.select("div#tab-paper > "
"div.deck-view-decklist.deck-view-decklist-compact > "
"div.deck-view-decklist-inner > "
"table.deck-view-deck-table > "
"tr > td.deck-col-card > a")
card_price_raw = soup.select("div#tab-paper > "
"div.deck-view-decklist.deck-view-decklist-compact > "
"div.deck-view-decklist-inner > "
"table.deck-view-deck-table > "
"tr > td.deck-col-price")
card_rarity_raw = soup.select("div#tab-arena > "
"div.deck-view-decklist.deck-view-decklist-compact > "
"div.deck-view-decklist-inner > "
"table.deck-view-deck-table > "
"tr > td.deck-col-price")
# 위에서 나온 raw data를 가공하여 위에 선언한 객체에 저장한다.
for qty in card_qty_raw:
qty_parsing = qty.string[1:-1] # 이스케이프 문자를 없애기 위해서 파싱한다.
card_qty.append(qty_parsing)
for name in card_name_raw:
card_name.append(name.string)
for price in card_price_raw:
price_parsing = price.string[1:-1] # 이스케이프 문자를 없애기 위해서 파싱한다.
card_price.append(price_parsing)
for rarity in card_rarity_raw:
rarity_parsing = rarity.string[3:-1] # 이스케이프 문자를 없애기 위해서 파싱한다.
card_rarity.append(rarity_parsing)
# pprint(card_name) # 데이터 확인
### DataFrame으로 저장 후 csv로 저장
# csv로 바꿀 데이터
df = pd.DataFrame({
'card_qty': card_qty,
'card_name': card_name,
'card_rarity': card_rarity,
'card_price': card_price
})
# DataFrame을 저장한다.
df.to_csv("meta_card_raw_data.csv", encoding='utf-8')
============================= Python =============================
'데이터 분석 > 데이터 분석 프로젝트' 카테고리의 다른 글
[기상청 콘테스트] 해면 기상 상태에 따른 선박 사고 위험도를 측정하는 모델을 개발 - 2(데이터 전처리) (0) | 2018.07.13 |
---|---|
[기상청 콘테스트] 해면 기상 상태에 따른 선박 사고 위험도를 측정하는 모델을 개발 - 1(데이터 전처리) (0) | 2018.07.12 |
[Python Scraping] 스크래핑(크롤링)을 이용하여 위키 문헌에 있는 윤동주 작가의 작품 목록 가져오기 (0) | 2018.07.02 |
[데이터 분석] 기상데이터를 이용하여 단위 면적 다양파 생산량을 예측 분석(기상청) - 1(분석 전 단계) (0) | 2018.07.01 |
[설문조사 분석] Python으로 분석한 Kaggle 2017 Survey -5 (0) | 2018.06.28 |