IT’s Portfolio

[Python] 파이썬 웹 크롤링으로 롤 전적검색 프로그램을 만들어보자 본문

Development Study/Python

[Python] 파이썬 웹 크롤링으로 롤 전적검색 프로그램을 만들어보자

f1r3_r41n 2019. 11. 2. 23:00
728x90
반응형

요새 웹 크롤링에 꽂혀서 많은 것을 만들어보고 있다.
그 중 롤 전적검색 프로그램을 만들어보려고 한다.

 

준비물 : python, requests 라이브러리, bs4 라이브러리, op.gg사이트, 당신의 뇌

 

import와 변수선언

import requests
from bs4 import BeautifulSoup

Name = input("소환사명을 입력하세요: ")
SummonerName = ""
Ranking = ""
TierUnranked = ""
LeagueType = []
Tier = []
LP = []
Wins = []
Losses = []
Ratio = []

requests와 bs4의 BeautifulSoup을 import.

소환사명을 입력받고 저장할 Name 변수선언.

다른 변수들은 귀찮으니 설명은 스킵하고 나머지 변수선언. 영어를 읽을 줄 안다면 어떤 변수인지 짐작이 갈 것이다.

 

데이터 수집 대상 url과 Header값 변경 및 requests, BeautifulSoup 설정

url='https://www.op.gg/summoner/userName=' + Name

hdr = {'Accept-Language': 'ko_KR,en;q=0.8', 'User-Agent': ('Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Mobile Safari/537.36')}
req = requests.get(url, headers=hdr)
html = req.text
soup = BeautifulSoup(html, 'html.parser')

 

 

op.gg 사이트에서 전적검색을 하고 url을 살펴보면 소환사명이 어떻게 포함되어있는지 알 수 있다.

Header값에 Accept-Language을 ko_KR,en;q=0.8로 설정해두면 편하다.

Accept-Language를 변경하지 않으면 파싱해오는 데이터가 영어로 파싱된다.

 

참고로 User-Agent를 모바일로 설정해두면 프로그램 실행시간을 줄일 수 있다.

웹 크롤링 프로그램을 제작할 때 크롬을 기준으로 F12를 눌러 개발자 도구를 연 후

빨간 동그라미 쳐진 버튼(Toggle device toolbar)을 누르고 새로고침을 하면 모바일 버전의 사이트가 나온다.

 

req = request.get(url, header=hdr)

url과 Header값을 가지고 서버에게 GET 요청을 하고 받는 html 소스를 req에 저장.

 

html = req.text

req 변수에 저장되어있는 html 소스를 html로 가져온다.

 

soup = BeautifulSoup(html, 'html.parser')

BeautifulSoup에 html의 값은 html이라 html.parser를 사용해야함.

 

크롤링

# 소환사 이름 크롤링
for i in soup.select('div[class=SummonerName]'):
    SummonerName = i.text

# 랭킹 크롤링
for i in soup.select('span[class=ranking]'):
    Ranking = i.text

# 언랭 판별용 티어 크롤링
TierUnranked = soup.select('div.Cell')

# 리그 타입 크롤링
for i in soup.select('div[class=LeagueType]'):
    LeagueType.append(i.text)

# 티어 크롤링
for i in soup.select('div[class=Tier]'):
    Tier.append(i.text)

# 리그 포인트 크롤링
for i in soup.select('div[class=LP]'):
    LP.append(i.text)

# 승리 패배 판수 크롤링
for i in soup.select('span[class=Wins]'):
    Wins.append(i.text)

for i in soup.select('span[class=Losses]'):
    Losses.append(i.text)

# 승률 크롤링
for i in soup.select('span[class=Ratio]'):
    Ratio.append(i.text)

나머지는 비슷하니 하나만 설명하겠음.

 

for i in soup.select('div[class=LeagueType]')

soup에서 div태그 LeagueType클래스를 모두 찾아라

 

조건식 및 정보 출력

if SummonerName != "":
    check = input(SummonerName + "님의 솔로랭크 정보가 궁금하시면 '솔랭'을, 자유랭크 정보가 궁금하시면 '자랭'을 입력해주세요: ")
    if check == '솔랭':
        if 'Unranked' in str(TierUnranked[0]):
            print("==================================")
            print(SummonerName + "님은 솔로랭크 Unranked입니다.")
            print("==================================")
        else:
            print("==================================")
            print(SummonerName + "님의 솔로랭크 정보입니다.")
            print("==================================")
            print("티어: " + Tier[0].strip('\n\t'))
            print("LP: " + LP[0])
            print("승/패: " + Wins[0] + " " + Losses[0])
            print("승률: " + Ratio[0])

    elif check == '자랭':
        if 'Unranked' in str(TierUnranked[1]):
            print("==================================")
            print(SummonerName + "님은 자유랭크 Unranked입니다.")
            print("==================================")
        else:
            print("=====================================")
            print(SummonerName + "님의 자유랭크 정보입니다.")
            print("=====================================")
            print("티어: " + Tier[1].strip('\n\t'))
            print("LP: " + LP[1])
            print("승/패: " + Wins[1] + " " + Losses[1])
            print("승률: " + Ratio[1])

    else:
        print("Error! 정확하게 입력해주세요.")
else:
    print("소환사 정보가 없습니다.")

만약 크롤링해온 SummonerName 문자열이 비어있지 않다면 솔랭정보 및 자랭정보 물어보기.

만약 check 문자열이 솔랭이라면

만약 TierUnranked[0]에 Unranked라는 문자열이 포함되어있다면 솔로랭크 Unranked 문자열 출력.

포함되어있지 않다면 솔로랭크 정보 출력.

 

만약 check 문자열이 자랭이라면

만약 TierUnranked[1]에 Unranked라는 문자열이 포함되어있다면 자유랭크 Unranked 문자열 출력.

포함되어있지 않다면 자유랭크 정보 출력.

 

만약 check 문자열이 솔랭과 자랭이 아니라면 에러 문자열 출력.

만약 크롤링해온 SummonerName 문자열이 비어있다면 소환사 정보가 없습니다 문자열 출력.

 

실행결과

 

제작 후기

존나 재밌다 ㅋㅋ

이게 인생인가?

728x90
반응형
Comments