본문 바로가기

개발/Python

Python: requests와 BeautifulSoup으로 네이버 증권에서 주가 가져오기

파이썬으로 웹에서 정보를 가져오고 싶을 때 가장 많이 쓰는 두 가지 라이브러리가 있습니다.
바로 requests(웹 요청 라이브러리)와 BeautifulSoup(HTML 파싱 라이브러리)인데요,
이번 글에서는 이 둘을 활용해서 네이버 증권에서 원하는 종목의 주가를 가져오는 방법을 예제로 정리했습니다.


1. 필요한 라이브러리 준비

먼저 아래처럼 필요한 패키지를 설치해야 합니다.
(아나콘다 환경이라면 기본 설치되어 있을 수 있어요.)

pip install requests
pip install beautifulsoup4

2. 종목별 주가 크롤링 실습

자, 이제 실제로 네이버 금융에서 특정 주식의 현재가를 가져와보겠습니다.

import requests

ticker = '000660'  # SK하이닉스 종목코드

url = f'https://finance.naver.com/item/main.naver?code={ticker}'
print(url)  # 실제로 접속할 URL을 확인

res = requests.get(url=url)  # 해당 주소로 GET 요청을 보냄

print(res.status_code)              # 응답 코드(200이면 정상)
print(res.headers['content-type'])  # 응답의 콘텐츠 타입
print(len(res.text))                # 받아온 HTML의 길이

3. BeautifulSoup으로 HTML 파싱

이제 받아온 HTML에서 원하는 정보를 뽑아내야 합니다.
여기서 BeautifulSoup이 큰 역할을 해줍니다!

from bs4 import BeautifulSoup as BTS

soup = BTS(markup=res.text, features='html.parser')

# 원하는 가격이 있는 위치를 CSS 선택자로 지정
items = soup.select('#rate_info_krx > div > p.no_today > em > span')
print(len(items))       # 몇 개가 선택됐는지 확인
print(items[0].text)    # 첫 번째 요소의 텍스트(주가)
  • select()는 CSS 선택자를 이용해 원하는 태그를 쉽게 골라낼 수 있습니다.
  • 네이버 증권은 구조가 자주 바뀌기 때문에, 개발자 도구(F12)로 정확한 경로를 확인하는 게 중요합니다.

4. 함수로 만들어 재사용하기

여러 종목에 반복적으로 쓰고 싶다면 아래처럼 함수로 만들어두면 아주 편리하겠죠?

def stock_price(ticker):
    url = f'https://finance.naver.com/item/main.naver?code={ticker}'
    res = requests.get(url=url)
    soup = BTS(markup=res.text, features='html.parser')
    items = soup.select('#rate_info_krx > div > p.no_today > em > span')
    return items[0].text

# 삼성전자(005930) 주가 가져오기
print(stock_price(ticker='005930'))

5. 정리

  • requests로 웹에서 HTML을 받아오고, BeautifulSoup으로 원하는 정보를 깔끔하게 추출할 수 있습니다.
  • 네이버 증권처럼 구조가 복잡한 사이트도 CSS 선택자를 잘 활용하면 필요한 데이터를 쉽게 가져올 수 있습니다.