본문 바로가기
코딩/Python

[파이썬 웹크롤링] beautiful soup를 이용한 웹크롤링 후 간단한 게임 만들기

by JuBro 2024. 1. 8.

주제 : 웹크롤링을 이용한 술게임 만들기

피로그래밍 2주차 팀 과제로 주어진 주제인데,

뭘할지 계속 고민을 하다가 

 

더 많이 더 적게

구글 검색량을 이용한 중독성 넘치는 검색량 비교 게임

www.higherlowerkorea.com

검색량을 단순 비교해서 무슨 키워드가 더 검색량이 많은지 선택하는 '더 많이 더 적게' 사이트에서 아이디어를 얻어

 

네이버 페이 증권 사이트에서 TOP 종목 중 랜덤으로 가져와서 이날 이 주식이 상승했는지, 하락했는지 단순 선택하는 술게임을 만들 것입니다.

 

 

beautifulsoup 설치 및 임포트
#!pip install BeautifulSoup4
#!pip install requests

import requests
from bs4 import BeautifulSoup as bs

 

우선 웹 크롤링은 beautifulsoup를 이용했기에, 다음과 같이 설치 및 임포트를 해옵니다.

 

 

 

 

헤더 추가

네이버의 경우 무분별한 크롤링이 막혀있기에, 크롤링이 아니라 우리가 직접 들어가는 것이다!를 코드에 표현해줘야 크롤링을 할 수 있습니다.

header = {"User-Agent" : "본인 user agent 복붙"} #네이버 페이지 입장용 헤더
 

What is my user agent?

Every request your web browser makes includes your User Agent; find out what your browser is sending and what this identifies your system as.

www.whatismybrowser.com

 

해당 사이트에 들어가서, 본인 컴퓨터의 agent를 찾아 해당 코드를 작성한다면, 사용자가 직접 웹페이지에 들어가는것으로 인식되어 네이버 사이트에 접근 할 수 있습니다.

 

 

url 불러오고 파싱하기
url="https://finance.naver.com/"
response=requests.get(url, headers=header)

soup = bs(response.text, 'html.parser')

 

 

 

사이트 html 분석 및 리스트로 가져오기

사이트의 개발자 도구를 켜보면(개발자도구 단축키 Windows: F12 or ctrl + shift + c/ Mac: command + option + I)

해당 차트 부분 html이 <table class="_topItems1> 인것을 알 수 있습니다.

그래서 해당 아이템을 가져오려면 아래와 같은 코드를 작성할 수 있습니다.

top_items_tbody = soup.find('tbody', {'id': '_topItems1'}) #id가 topitems1인 tbody가져오기 

item_names = [a.text for a in top_items_tbody.find_all('a')] #태이블 속 a 태그 들의 텍스트 가져오기
item_change = [span.text for span in top_items_tbody.find_all('span')] #태이블 속 span 태그 들의 텍스트 가져오기
item_change_value = [tr.find_all('td')[2].text for tr in top_items_tbody.find_all('tr')] #테이블 속 tr태그중 3번째 자손 가져오기

 

이는 실제 html 바디를 보면서  작성하면 되는데, bequtifulsoup의 명령어는 아래의 홈페이지에서 확인할 수 있다.

 

Beautiful Soup Documentation — Beautiful Soup 4.12.0 documentation

Beautiful Soup Documentation Beautiful Soup is a Python library for pulling data out of HTML and XML files. It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree. It commonly saves programmers h

www.crummy.com

 

 

게임 코드 구현
while True:
            try:
                if(players[i]['name']==username):
                    answer=input('1.상승 2.하락 :')
                    if not (answer=='1' or answer =='2'):
                        raise ValueError
                else:
                    answer=random.choice(['1', '2'])
                    if answer=='1':
                        print('상승한다!📈')
                    else:
                        print('하락한다!⬇️')
                if((answer=='1' and item_change[random_numbers[i]]=='상승') or (answer=='2' and item_change[random_numbers[i]]=='하락')):
                    print("정답입니다! 촉이 좋은 개미시군요!!😎")
                    print(f"{item_names[random_numbers[i]]}는 오늘 {item_change_value[random_numbers[i]]} {item_change[random_numbers[i]]}했어\n")
                    break
                else:
                    print("당신은 주식하면 큰일나겠네요!😮")
                    print(f"{item_names[random_numbers[i]]}는 오늘 {item_change_value[random_numbers[i]]} {item_change[random_numbers[i]]}했어")
                    print(f"{players[i]['name']} 한잔해~🍻\n")
                    fail_player.append(players[i]['name'])
                    break
            except ValueError:
                print("1과 2만 입력해주세요!")
        time.sleep(1)

 

이후 게임 코드 구현은 정말 간단합니다.

리스트도 다 만들어져 있으니, 해당 주식 리스트를 가져와 이 주식이 오늘 상승헀냐 하락했냐? 를 물어보며 맞추면 통과, 틀리면 마시는 스크립트를 띄우면 됩니다.

그리고 상승, 하락 외에 입력하지 않도록 while true 안에 try 와 except문으로 반복시켰습니다.

 

 

전체코드

그리고 이는 그냥 게임 실행 함수일뿐이고, 다른 전체 술게임 진행 코드는 다른파일에 입력했습니다

#!pip install BeautifulSoup4
#!pipinstall requests
#슈퍼개미게임 : 임의의 주식이 오늘 올랐는지, 떨어졌는지 선택하면 되는 간단한 게임입니다! 틀리면 마셔~! 
from main import players
import random
import requests
import time
from bs4 import BeautifulSoup as bs

header = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"} #네이버 페이지 입장용 헤더

url="https://finance.naver.com/"
response=requests.get(url, headers=header)

soup = bs(response.text, 'html.parser')

top_items_tbody = soup.find('tbody', {'id': '_topItems1'}) #주식 거래 top 

item_names = [a.text for a in top_items_tbody.find_all('a')] #주식 이름 텍스트
item_change = [span.text for span in top_items_tbody.find_all('span')] #주식 상승, 하락 텍스트 가져오기
item_change_value = [tr.find_all('td')[2].text for tr in top_items_tbody.find_all('tr')] # 주식 상승 하락 값

number_range = range(0, len(item_names)-1)
fail_player =[]

def antgame(players, username):
    num_of_random_numbers = len(players)
    random_numbers = random.sample(number_range, num_of_random_numbers)
    print(random_numbers)

    print('개미는~뚠뚠!🐜 오늘도~뚠뚠!🐜 열심히~주식~하네~🐜 오늘의 주식이 상승했는지 하강했는지 맞춰보세요!')

    for i in range(len(players)):
        print(f"{players[i]['name']}님 차례입니다")
        print(f"{item_names[random_numbers[i]]}는 오늘 상승했을까요? 하락했을까요?")

        while True:
            try:
                if(players[i]['name']==username):
                    answer=input('1.상승 2.하락 :')
                    if not (answer=='1' or answer =='2'):
                        raise ValueError
                else:
                    answer=random.choice(['1', '2'])
                    if answer=='1':
                        print('상승한다!📈')
                    else:
                        print('하락한다!⬇️')
                if((answer=='1' and item_change[random_numbers[i]]=='상승') or (answer=='2' and item_change[random_numbers[i]]=='하락')):
                    print("정답입니다! 촉이 좋은 개미시군요!!😎")
                    print(f"{item_names[random_numbers[i]]}는 오늘 {item_change_value[random_numbers[i]]} {item_change[random_numbers[i]]}했어\n")
                    break
                else:
                    print("당신은 주식하면 큰일나겠네요!😮")
                    print(f"{item_names[random_numbers[i]]}는 오늘 {item_change_value[random_numbers[i]]} {item_change[random_numbers[i]]}했어")
                    print(f"{players[i]['name']} 한잔해~🍻\n")
                    fail_player.append(players[i]['name'])
                    break
            except ValueError:
                print("1과 2만 입력해주세요!")
        time.sleep(1)
    return fail_player

메인함수는 요기에 올리지 않았지만,

main에서 import해서 실행시키면 다음과 같이 나옵니다!!