최근에 매직 더 개더링에 관심이 생겨서 이걸 데이터 분석을 해보려고 마음을 먹었다.

일단 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 =============================

+ Recent posts