오늘은 심심해서 웹 크롤링을 통해 파이썬 파일 하나로 주가를 한번에 보려고 한다.
먼저 사전에 필요한 것은 터미널을 통해 설치해둔다.
1) requests 설치
- Python의 http request 라이브러리
> pip install requests
2) BeautifulSoup4 설치
- html을 Python이 이해하는 객체 구조로 Parsing하는 라이브러리
> pip install beautifulsoup4
카카오, 마이크로소프트, 애플의 주가를 확인해봐야겠다.
네이버에 들어가서 해당 기업들을 검색한다.
내가 필요한 건 딱 이 부분이다.
크롬에서 F12를 눌러 개발자모드 창을 띄운다.
그리고 개발자모드 창의 왼쪽 상단 엘리먼트 선택자를 클릭해 필요한 부분으로 커서를 옮긴다.
대충 저 노란 부분에 내가 원하는 것이 다 담겨있다는 걸 알 수 있다.
참고로 전일대비 상승하면 "up", 보합(변동없음)하면 "eq", 하락하면 "dw"이 "spt_con" 뒤에 붙는다.
그래서 "spt_con"만 찾아내도록 한다.
다시 VSCode로 돌아와서 코드를 짜보자.
import requests
from bs4 import BeautifulSoup
먼저 BeautifulSoup를 불러와서 requests를 import 해주고 BeautifulSoup를 불러온다.
#공통되는 네이버 검색창 url
url = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query="
kakao = "카카오"
microsoft = "마이크로소프트"
apple = "애플"
stock = [kakao, microsoft, apple]
필요한 변수들을 선언한다.
kakao, microsoft, apple은 출력하기 편하게 리스트에 담아뒀다.
일단 BeautifulSoup이 어떻게 받아오는지 확인하기 위해 카카오를 넣고 테스트해봤다.
코드는 이렇게 짰다.
import requests
from bs4 import BeautifulSoup
url = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query="
kakao = "카카오"
microsoft = "마이크로소프트"
apple = "애플"
stock = [kakao, microsoft, apple]
# HTTP get request
html = requests.get(url+kakao)
# HTML 소스를 Python 객체로 변환하기
soup = BeautifulSoup(html.content, "html.parser")
print(soup)
결과는 이렇게 어마어마하고 무시무시한 친구가 나왔다.
그래서 내가 원하는 부분만 찾아내기로 한다.
stock_today = soup.find("span",{"class":"spt_con"})
stock_today라는 변수를 만들고 spt_con 클래스의 span 태그를 찾아 담도록 했다.
그리고 이걸 for문을 통해 리스트 내부의 검색어들을 돌리며 결과를 출력하도록 한다.
import requests
from bs4 import BeautifulSoup
# 공통되는 네이버 검색창 url
url = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query="
kakao = "카카오"
microsoft = "마이크로소프트"
apple = "애플"
stock = [kakao, microsoft, apple]
for s in stock:
html = requests.get(url+s)
soup = BeautifulSoup(html.content, "html.parser")
stock_today = soup.find("span",{"class":"spt_con"}) # 주가 정보가 담기는 부분
print(s+stock_today.text)
최종 코드는 이렇다.
결과는 이렇다.
단위를 원(₩)으로 맞춰주고 싶어 단순 참고용으로 현재 환율도 가져와서 곱해줬다.
환율 가져오는 김에 현재시간도 가져왔다.
카카오만 한국주식이길래 삼성전자도 추가해줬다.
그래서 최종_진짜최종 결과는 이렇다.
import datetime
import requests
from bs4 import BeautifulSoup
# 공통되는 네이버 검색창 url
url = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query="
kakao = "카카오"
samsung = "삼성전자"
microsoft = "마이크로소프트"
apple = "애플"
rate = "환율"
korea_stock = [kakao, samsung]
us_stock = [microsoft, apple]
stock = [korea_stock, us_stock]
# 정보 담아오는 함수
def bs(search):
html = requests.get(url+search)
soup = BeautifulSoup(html.content, "html.parser")
searched = soup.find("span",{"class":"spt_con"}).text
return searched
# "지수" 기준으로 금액만 추출해서 천의자리 쉼표 제거하는 함수
def money(searched):
return searched.split("지수")[1].split(" ")[0]
# 천의자리 쉼표 넣고 float 형으로 변환하는 함수
def toFloat(money):
return round(float(money.replace(",","")),2)
# 달러일 경우 원화로 변환하는 함수
def exchange(dollar):
return str(format(round(dollar * toFloat(dollar_today),2),","))
# 달러일 경우 등락 금액 추출 함수
def fluctuation(s_text):
s_fluc_list = (s_text.split("전일대비 ")[1]).split(" ")
s_fluc = float(s_fluc_list[1])
s_fluc_ex = str(exchange(s_fluc))
s_fluc_str = s_fluc_list[0] + " " + s_fluc_ex
if s_fluc_list[0] == "상승":
return s_fluc_str + " " + s_fluc_list[2].replace("(","(+")
elif s_fluc_list[0] == "하락":
return s_fluc_str + " " + s_fluc_list[2].replace("(","(-").replace("--","-")
else:
return s_fluc_str + " " + s_fluc_list[2]
dollar_today = money(bs(rate)) # 환율 정보가 담기는 부분
now = datetime.datetime.now() # 현재시간
print(now)
print("현재 환율: "+dollar_today)
print()
print("(단위: 원)")
for list in stock:
for s in list:
s_text = bs(s)
if s in us_stock: # 미국 주식일 경우
print(s+" 지수 "+exchange(toFloat(money(s_text)))+" 전일대비 "+fluctuation(s_text))
else: # 한국 주식일 경우
print(s+s_text.replace(" "," ")) # 그대로 출력
"""
출력 결과:
2021-10-28 14:22:34.991517
현재 환율: 1,170.50
(단위: 원)
카카오 지수 126,000 전일대비 하락 2,500 (-1.95%)
삼성전자 지수 71,800 전일대비 상승 1,700 (+2.43%)
마이크로소프트 지수 378,270.49 전일대비 상승 15,286.73 (+4.21%)
애플 지수 174,228.92 전일대비 하락 -550.13 (-0.31%)
"""