선수 데이터 크롤링

KHoney·2022년 7월 16일
0

futqualizer

목록 보기
2/8

선수 정보를 제공하는 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로 적용할것이기 때문에 설치부터 진행해보자.

profile
좋은 개발자가 되고싶은

0개의 댓글