본문 바로가기
반응형
Programming/Python

파이썬(Python) 으로 피파온라인 유저랭킹 크롤링하기! (1)

by JAMINS 2020. 6. 5.

크롤링? 크롤러?

웹상에는 수많은 웹페이지가 존재한다. 한 웹사이트만해도 수십, 수백개의 웹페이지로 이루어져있으며 각기 다른 형태, 종류의 정보를 가지고 있다. 우리는 이런 정보를 자동으로 읽어들인 후 입맛에 맞게 활용할 수 있다. 이러한 행위를 하는 프로그램을 웹 크롤러라 하며 수집하는 행위를 크롤링한다 라고 표현한다.

웹 크롤러 사전적 정의

wikipedia에서는 아래와 같이 정의한다.
웹 크롤러(web crawler)는 조직적, 자동화된 방법으로 월드 와이드 웹을 탐색하는 컴퓨터 프로그램이다.

대표적으로 검색엔진을 들수있다. 구글, 네이버 등의 검색엔진은 검색결과를 보여주기위해 웹상에 흩어져있는 수많은 웹페이지들을 수집하고 가공하여 검색엔진에 인덱싱(색인)한다. 이 순간에도 웹상의 정보들은 변화하는데 이러한 최신성을 유지하기 위해 주기적으로 크롤링을 하고있다.

파이썬(Python)으로 크롤링

원하는 정보를 가져오기 위해 일반 유저도 크롤러를 개발하여 자료를 수집할 수 있다. 여기서는 파이썬을 통해서 크롤러를 만들어보는 과정을 살펴보도록 하겠다. 일단 크롤링하기 전에 무엇을 크롤링할지부터 정해야한다. 결국 목적은 어떤 자료를 가져오기 위함이니까. 그 다음은 필요한 준비물에 대해서 나열해보겠다.

무엇을 크롤링할 것인가

지금은 안하지만 한 때 자주했던 피파온라인4를 대상으로 크롤링을 해보자. 피파온라인4에서는 주기적으로 유저랭킹을 보여주는데 이번 시간은 이 랭킹 정보를 크롤링 해볼것이다.

수집할 필드

  • 순위
  • 구단주명
  • 전적
  • 승률
  • 랭킹점수

5가지 항목을 TOP20까지만 크롤링해서 출력 또는 파일로 저장해 볼 것이다.

준비물

크롤링을 하기위해 준비해야할 목록이다. Python3pip를 통해 각종 모듈을 받은 후 개발해야 한다.

  • Python3 : python3 버전으로 개발
  • Pip : 모듈을 설치하기 위한 도구
  • Requests : Python 모듈, HTTP request/response를 다루는 모듈로 HTML을 불러오기 위해 필수로 설치
  • BeautifulSoup : python 모듈, HTML을 파싱할 수 있는 모듈

모듈 설치

Python3과 pip 설치는 별도로 포스팅할 예정이고 여기서는 설치되어있다고 가정하고 넘어가겠다. 필요한 모듈을 import 하면 준비는 끝났다.

pip install bs4
pip install requests

 

 

HTML 가져오기

import requests

res = requests.get('http://fifaonline4.nexon.com/datacenter/rank')
statusCode = res.status_code
htmlText = res.text

requests 모듈을 통해 쉽게 웹에 접근하여 HTTP response를 받아올 수 있다. response에서 status_code와 html 텍스트를 얻을 수 있다.

랭킹 페이지 HTML 구조

HTML 텍스트를 받았으면 태그 구조가 어떻게 구성되어있는지 파악해야한다. 원하는 정보들이 어느 태그에 어떤 계층으로 이루어져있는지 알아야 크롤링이 가능하기 때문이다.

파이썬 콘솔에서의 HTML text이다. 이렇게 response text를 출력하면 보기힘드니 크롬 개발자 도구를 통해 태그 구조를 파악해보자. 랭킹 페이지를 열어둔 후 상단 우측 메뉴 - 도구 더보기 - 개발자도구를 클릭한다.

이와 같이 탭에 Elements로 구조를 파악할 수 있고 탭 왼쪽 화살표 버튼을 클릭하고 페이지에서 원하는 정보쪽으로 마우스커서를 가져가면 자동으로 구조가 펼쳐진다. 랭킹 정보가 있는 곳을 클릭하면 포커싱이되고 아래와 같이 HTML의 구조를 확인할 수 있다.

여기서 필요한 것은 태그들의 계층관계, 태그별 id, class명이다. 보기 힘드니 다시 정리해보았다.

피파온라인 유저 랭킹페이지 HTML 구조

  • body
    • div (id = wrapper)
      • main
        • div (class = datacenter)
          • div (class = wrap)
            • div (class = datacenter_rank)
              • div (class = list_wrap)
                • div (class = tbody)
                  • div (class = tr) # 랭킹 정보의 한 행이 된다
                    • span (class = rank_no) : 순위
                    • span (class = rank_coach)
                      • span (class = coach_wrap)
                        • span (class = profile_pointer) : 구단주명
                    • span (class = rank_before) : 전적(승, 무, 패)
                    • span (class = rank_r_rate) : 승률
                    • span (class = rank_r_win_point) : 랭킹점수

꽤나 Depth가 있는 편이다. HTML 구조도 파악했고 개발 준비도 끝냈으니 이제 본격적으로 값을 꺼내와서 어떻게 처리할지만 남았다.다음 시간에는 BeautifulSoup를 활용해 HTML을 파싱하고 원하는 값을 읽어와보도록 하겠다.

댓글