주제 : 웹크롤링을 이용한 술게임 만들기
피로그래밍 2주차 팀 과제로 주어진 주제인데,
뭘할지 계속 고민을 하다가
검색량을 단순 비교해서 무슨 키워드가 더 검색량이 많은지 선택하는 '더 많이 더 적게' 사이트에서 아이디어를 얻어
네이버 페이 증권 사이트에서 TOP 종목 중 랜덤으로 가져와서 이날 이 주식이 상승했는지, 하락했는지 단순 선택하는 술게임을 만들 것입니다.
beautifulsoup 설치 및 임포트
#!pip install BeautifulSoup4
#!pip install requests
import requests
from bs4 import BeautifulSoup as bs
우선 웹 크롤링은 beautifulsoup를 이용했기에, 다음과 같이 설치 및 임포트를 해옵니다.
헤더 추가
네이버의 경우 무분별한 크롤링이 막혀있기에, 크롤링이 아니라 우리가 직접 들어가는 것이다!를 코드에 표현해줘야 크롤링을 할 수 있습니다.
header = {"User-Agent" : "본인 user agent 복붙"} #네이버 페이지 입장용 헤더
해당 사이트에 들어가서, 본인 컴퓨터의 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의 명령어는 아래의 홈페이지에서 확인할 수 있다.
게임 코드 구현
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해서 실행시키면 다음과 같이 나옵니다!!
'코딩 > Python' 카테고리의 다른 글
[KT AICE] 데이터 전처리 - 결측치처리 (0) | 2024.08.29 |
---|---|
[KT AICE] Pandas 기초 - Dataframe 병합하기 (0) | 2024.08.22 |
[KT AICE] Pandas 활용 - Dataframe 변형하기 (0) | 2024.08.18 |
[KT AICE] Pandas 기초 - Dataframe 살펴보기 (0) | 2024.08.14 |
[Python] turtle모듈을 활용한 mbti검사 및 그래프 (0) | 2023.08.24 |