kimu0127
KimU
kimu0127
전체 방문자
오늘
어제
  • 분류 전체보기 (6)
    • notice (0)
    • life (3)
    • work & study (2)
    • good stuff (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
kimu0127

KimU

풋빈 피파23 선수 크롤링 with 파이썬
work & study

풋빈 피파23 선수 크롤링 with 파이썬

2023. 2. 2. 11:58

futbin FIFA23 players crawling with python

 

----------

 

축구와 풋살을 즐기고 해외축구 시청을 자주 하는 사람으로

당장 요즘 많이하지는 않지만 한때 즐겨하던 게임인 피파시리즈의 선수 데이터를 모아보았다.

 

피파시리즈의 여러 데이터를 모아서 보여주는 사이트인 futbin.com에서 데이터를 가져왔다.

게임유저들에게 많은 도움이 되고자 사이트를 만들었다고 한다. 정말 감사합니다 ㅎㅎ

 

총 18000개가 넘는 선수카드 데이터가 있지만 실제로 Fifa Ultimate Team으로 트레이딩과 게임을 하며 사용할 만한 카드의 마지노선인 OVR 성능이 80 이상인 2117개의 데이터만 가져오도록 했다.

먼저 OVR 80과 79가 나뉘는 페이지가 23년2월 기준으로 71페이지 라는것을 직접 페이지를 열어봐서 알아내고 페이지수를 입력했지만 앞으로는 이러한 조건도 코드로 자동화하여 할 수 있도록 만들어야겠다. 귀찮음은 자기발전의 가장 큰 적이다.

 

https://www.futbin.com/players?page=1 으로 접속하면 게임 내 선수들의 데이터를 가져와서 보여준다.

 

from tqdm import tqdm	#for문의 진행도를 보여준다
from bs4 import BeautifulSoup as BS
from urllib.request import Request, urlopen
import pandas as pd
import time

name = []
club = []
nation = []
league =[]
rating = []
position = []
subposi = []
version = []
price = []

header = {'User-Agent': 'Mozilla/5.0'}

for x in tqdm(range(1,72)):
    site = f'https://www.futbin.com/players?page={x}'
    url = Request(site, headers=header)
    html = urlopen(url)
    soup = BS(html, 'html.parser')
    playertr = soup.find('tbody').findAll('tr', class_ = ['player_tr_1', 'player_tr_2'])
    time.sleep(3)
    
    for y in range(0,len(playertr)):
        td = playertr[y].findAll('td')
        if int(td[2].text) < 80:	#선수 OVR이 80미만이면 종료
            print('79 over done')
            break
        name.append(td[1].text.strip())
        rating.append(td[2].text)
        position.append(td[3].findAll('div')[0].text)
        subposi.append(td[3].findAll('div')[1].text)
        version.append(td[4].findAll('div')[0].text)
        price.append(td[5].findAll('span')[0].text.strip())
        club.append(td[1].findAll('a')[1]['data-original-title'])
        nation.append(td[1].findAll('a')[2]['data-original-title'])
        league.append(td[1].findAll('a')[3]['data-original-title'])
        
data = pd.DataFrame(
    {"name" : name,
     "club" : club,
     "nation" : nation,
     "league" : league,
     "rating" : rating,
     "position" : position,
     "subposi" : subposi,
     "version" : version,
     "price" : price})

data.to_csv('futbin23over79.csv', index=False, encoding='utf-8-sig')	#엑셀 파일로 저장

 

- 크롤링을 처음 배우고 연습할 때는 requests를 사용했었는데 해당 웹사이트에서는 제대로 작동하지 않는 것 같아서 급하게 urllib의 사용법을 구글링하여 찾아서 작성해 보았다.

- for문의 진행도를 progress bar로 표현하여 쳐다보기 위해 tqdm을 추가했다. 코드를 실행해놓고 기약없이 기다리는 것은 성격에 맞지 않는다.

- 코드를 실행하여 연속으로 각 페이지의 데이터를 가져 올 때 20페이지를 넘어가면 403 Forbidden : to many requests 에러가 뜨는 것을 볼 수 있었다. 어쩔 수 없이 한 페이지를 가져올 때 마다 3초간 딜레이를 넣기 위해 time모듈을 추가했다.

- Pelé, Mbappé, Müller등 음성기호가 들어간 알파벳을 포함한 이름의 선수들이 상당수 존재하는데 이를 utf-8로 인코딩시 글자깨짐현상이 발생했다. utf-8-sig로 인코딩해서 해결했다.

 

1페이지의 선수카드 30개 데이터를 가져와서 저장이 된 모습

 

세부스탯 체형 달리기형태 개인기 약발 키몸무게 등의 수많은 데이터가 더 존재하지만 크롤링 연습으로 대표적인 데이터만 간단하게 가져왔다.

'work & study' 카테고리의 다른 글

풋빈 크롤링 후기?  (0) 2023.02.02
    'work & study' 카테고리의 다른 글
    • 풋빈 크롤링 후기?
    kimu0127
    kimu0127
    김유

    티스토리툴바