선수 정보를 제공하는 API 가 없기 때문에 크롤링을 해와야한다.
Futbin 에서 가져오면 되겠고, beautifulsoup4 를 활용해야겠다.
일단 Player app 을 만들고 model 을 설정한다.
#player/models.py
from django.db import models
# Create your models here.
class Player(models.Model):
name = models.CharField(max_length=50)
club = models.CharField(max_length=50)
nation = models.CharField(max_length=20)
league = models.CharField(max_length=20)
rating = models.IntegerField()
position = models.CharField(max_length=5)
version = models.CharField(max_length=30)
priceNow = models.CharField(max_length=20)
skill_move = models.IntegerField()
weak_foot = models.IntegerField()
work_rate = models.CharField(max_length=5)
pace = models.IntegerField()
shoot = models.IntegerField()
passing = models.IntegerField()
dribble = models.IntegerField()
defence = models.IntegerField()
phyical = models.IntegerField()
beautifulsoup , requests 설치
pip install beautifulsoup4
pip install requests
futbin 의 위 테이블을 크롤링 하여 선수카드 DB 를 구축한다.
beautifulsoup 을 써서 크롤링을 하는데, header 에 브라우저로 접속하는 것이라고 속인후 요청을 해야 크롤링을 완전하게 할 수 있다.
약간 노가다로 선수정보를 크롤링 해온다.
from .models import Player
import requests
from bs4 import BeautifulSoup
ClassList = {
"name":"player_name_players_table",
"club_nation":"players_club_nation",
"rating":"rating"
}
Attribute = {
"title":"data-original-title"
}
# 페이지가 상당히 많기 때문에 베이스 URL 을 설정한다.
URL_BASE = "https://www.futbin.com/players?page="
# 브라우저로 접속하는척을 해준다.
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'none',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive'}
#page 를 입력 받으면 해당 페이지를 크롤링 해서 선수를 저장한다.
def parse_futbin_page(pageNumb):
url = URL_BASE + str(pageNumb)
page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.content, "html.parser")
playerTable = soup.select("#repTb>tbody>tr")
for player in playerTable:
# info start
cells = player.select('td')
profile_section = cells[0]
name = profile_section.select_one('div .' + ClassList['name']).text
club_nation = profile_section.select('.' + ClassList['club_nation'] +' a')
club = club_nation[0].attrs.get(Attribute['title'])
nation = club_nation[1].attrs.get(Attribute['title'])
league = club_nation[2].attrs.get(Attribute['title'])
# info end
# start feature
rating = cells[1].select_one("."+ClassList['rating']).text
position = cells[2].text
version = cells[3].text
priceNow = cells[4].select_one('span').text
skill_move = cells[5].text
weak_foot = cells[6].text
work_rate = cells[7].select('span')[0].text + '/' + cells[7].select('span')[1].text
# end feature
# stat start
pace = cells[8].select_one('span').text
shoot = cells[9].select_one('span').text
passing = cells[10].select_one('span').text
dribble = cells[11].select_one('span').text
defence = cells[12].select_one('span').text
phyical = cells[13].select_one('span').text
# stat end
thisPlayer = Player()
thisPlayer.name = name
thisPlayer.club = club
thisPlayer.nation = nation
thisPlayer.league = league
thisPlayer.rating = rating
thisPlayer.position = position
thisPlayer.version = version
thisPlayer.priceNow = priceNow
thisPlayer.skill_move = skill_move
thisPlayer.weak_foot = weak_foot
thisPlayer.work_rate = work_rate
thisPlayer.pace = pace
thisPlayer.shoot = shoot
thisPlayer.passing = passing
thisPlayer.dribble = dribble
thisPlayer.defence = defence
thisPlayer.phyical = phyical
thisPlayer.save()
print(thisPlayer.name + " saved") # 저장
sqlite 로 저장된 내용을 확인한다.
굿…
futbin 페이지에서 일단은 선수의 간단한 정보를 긁어왔다.
sqlite 도 좋지만, 이번에는 MongoDB로 적용할것이기 때문에 설치부터 진행해보자.