본문 바로가기
PROJECT/LOST ARK Web Crawling Project

[ LOST ARK Web Crawling Project ] 각인 추출하기

by 2CHAE._.EUN 2022. 1. 8.
정적 크롤링을 사용

MGX.KR URL 패턴을 사용해서 각 클래스에 대한 상위 5개의 공통 각인 추출
상대적으로 더 많이 사용하는 직업 각인 추출
추가적인 요소로 각 각인들의 레벨 추출하기
( 각 각인들에 대한 설명은 DB 구축 후 진행 )

 

import requests
from bs4 import BeautifulSoup
import csv

fhand = open('./lostark_class_name.csv', 'r')
rdr = csv.reader(fhand)
next(rdr)

my_class = input("검색하고자 하는 클래스 입력 : ")

for row in rdr :
    if my_class in row[0] :
        my_class_english = row[1]

fhand.close()

URL = "https://www.mgx.kr/lostark/statistic/?character_class=" + my_class_english +"&min_level=1460&max_level=1490"

raw = requests.get(URL)

html = BeautifulSoup(raw.text, 'html.parser')

common_box = html.find('div', {'class' : 'common_carving_box'})
job_box = html.find('div', {'class' : 'job_carving_box'})

common_carvings = common_box.find_all('div', {'class' : 'carving'})
job_carvings = job_box.find_all('div', {'class' : 'carving'})


print("\n<<< 직업 각인 >>>\n")

rank = 0
for carving in job_carvings[:2] :
    rank += 1 
    carving_name = carving.find('div', { 'class' : 'carving_name'})
    carving_percent = carving.find('div', { 'class' : 'carving_percent_text'})

    print(f"{rank}. '{carving_name.text}'을(를) 유저 중 {carving_percent.text} 가 사용")


print("\n<<< 공통 각인 >>>\n")

rank = 0
for carving in common_carvings :
    if rank == 5 :
        break
    
    rank += 1
    carving_name = carving.find('div', { 'class' : 'carving_name'})

    if '감소' in carving_name.text :
        rank -= 1
        continue

    print(rank, ".", carving_name.text)

print()

 


[ 코드 설명 ]

 

CSV 파일 불러오기

 

import csv

fhand = open('./lostark_class_name.csv', 'r')
rdr = csv.reader(fhand)
next(rdr)

my_class = input("검색하고자 하는 클래스 입력 : ")

for row in rdr :
    if my_class in row[0] :
        my_class_english = row[1]

fhand.close()

 

open 함수의 옵션을 'r'로 설정하여 파일을 읽어온다. rdr에 CSV 읽어오는 객체 변수를 설정.

검색하고자 하는 클래스를 입력하면 입력한 클래스의 영어이름을 읽어온 CSV 파일에서 찾아와 변수에 저장한다.

CSV 파일은 모든 데이터를 이중 리스트의 형태로 가지고 있기 때문에 반복문을 사용해서 행 별로 데이터를 검색하다가

검색한 클래스와 일치하는 행이 있으면 그에 해당하는 영어 이름을 변수에 저장하면 된다.

 

원하는 데이터를 변수에 저장하면 close 함수를 사용해서 open 함수를 사용해 열었던 파일을 닫아준다.

파일을 닫지 않으면 CSV 파일 손상 가능성이 존재하므로 꼭 닫아줘야한다.

 

 

URL 받아오기

 

import requests
from bs4 import BeautifulSoup

URL = "https://www.mgx.kr/lostark/statistic/?character_class=" + my_class_english +"&min_level=1460&max_level=1490"

raw = requests.get(URL)

html = BeautifulSoup(raw.text, 'html.parser')

common_box = html.find('div', {'class' : 'common_carving_box'})
job_box = html.find('div', {'class' : 'job_carving_box'})

common_carvings = common_box.find_all('div', {'class' : 'carving'})
job_carvings = job_box.find_all('div', {'class' : 'carving'})

 

해당 클래스의 각인을 받아오기 위해서는 정적 크롤링을 사용한다.

 

정적 크롤링을 위한 라이브러리인 requests와 bs4를 import 해준다.

requests는 http의 요청을 쉽게 사용하기 위해 만들어진 라이브러리이고, BeautifulSoup 라이브러리는 HTML를

효율적으로 탐색하고 원하는 정보를 손쉽게 추출하기 위해 만들어진 라이브러리이다.

 

각인은 'MGX.KR'에서 정적 크롤링을 통해 데이터를 받아올 것이기 때문에 우리가 입력했던 클래스의 정보가 나와있는 URL의 주소를 get 함수의 인자로 넣어 해당 웹 페이지의 내용을 요청해 받아온다. 

 

웹 페이지의 내용인 raw.text는 문자열타입이기 때문에 실제 HTML 코드로 변환해주기 위해서는 데이터 타입이

"html.parser'인 bs4의 BeautifulSoup 클래스를 사용해야한다.

 

find 함수를 통해 인자로 받은 태그와 일치하는 데이터를 리턴할 수있는데 box 변수에는 데이터를 감싸는 큰 틀을

추출하고 find_all 함수를 통해 그 큰 틀안에 있는 일치하는 모든 데이터를 리스트의 형태로 받아온다.

 

 

 각인 추출하기

 

print("\n<<< 직업 각인 >>>\n")

rank = 0
for carving in job_carvings[:2] :
    rank += 1 
    carving_name = carving.find('div', { 'class' : 'carving_name'})
    carving_percent = carving.find('div', { 'class' : 'carving_percent_text'})

    print(f"{rank}. '{carving_name.text}'을(를) 유저 중 {carving_percent.text} 가 사용")


print("\n<<< 공통 각인 >>>\n")

rank = 0
for carving in common_carvings :
    if rank == 5 :
        break
    
    rank += 1
    carving_name = carving.find('div', { 'class' : 'carving_name'})

    if '감소' in carving_name.text :
        rank -= 1
        continue

    print(rank, ".", carving_name.text)

print()

 

직업 각인과 공통 각인 모두 반복문을 사용해서 데이터를 얻어온다.  얻어온 각인 형태는 리스트의 형태이므로

find 함수를 통해 리스트 안에서 태그와 선택자가 일치하는 데이터를 리턴하면 된다. 

 

하지만 각인 중 '감소'가 붙은 게임 내에서 불필요한 각인들이 존재하는데 얻어온 각인 리스트에 '감소'라는 단어가

존재하면 continue로 설정해 해당 각인은 넘어간다.

 

 

결과 출력

 

 


* 검색하고자 하는 클래스를 잘못 입력했을 경우 추가

 

import sys

if my_class not in rdr :
    print("잘못 입력하셨습니다.")
    sys.exit()