BeautifulSoup은 파이썬 라이브러리로, HTML 및 XML 파일을 파싱하고 구문 분석하는 데 사용된다. 간단한 구문으로 웹 페이지의 특정 요소를 쉽게 추출할 수 있다.
실습 목표: 네이버 증권 페이지에서 TOP 종목 리스트와 그 현재가를 크롤링하기!
from bs4 import BeautifulSoup
import requests
url = 'https://finance.naver.com/'
requests
라이브러리를 사용하여 네이버 증권 페이지 가져오기response = requests.get(url)
response.encoding = 'euc-kr' # 한글 인코딩 설정
html = response.text
soup = BeautifulSoup(html, 'html.parser')
soup 를 확인해보면 다음과 같이 파싱이 잘 된 것을 확인할 수 있다.
결과:
fn + f12 를 눌러 개발자 도구에 들어간다.
오른쪽 상단의 insperctor 기능을 눌러 html 을 찾고싶은 요소를 선택한다.
그러면 선택한 html 요소를 찾을 수 있다.
# 원하는 html 요소 찾기
top_items = soup.find('tbody', id='_topItems1')
<tr>
태그를 찾고<a>
태그의 text 만을 추출해 종목명을 추출하고,<td>
태그의 text 만을 추출해 현재가를 추출한다.# 종목명과 현재가를 추출하여 리스트에 저장
stock_list = []
rows = top_items.find_all('tr')
for row in rows:
# 종목명 추출
stock_name = row.find('a').row.find('a').get_text(strip=True)
# 현재가 추출
current_price = row.find_all('td')[0].get_text(strip=True)
stock_list.append((stock_name, current_price))
# 결과 출력
for idx, (name, price) in enumerate(stock_list, start=1):
print(f"{idx}. 종목명: {name} | 현재가: {price}")
.get_text(strip=True)
→ 앞뒤의 공백 문자 제거row.find_all('td')[0]
→ [0] 으로 첫번째 요소를 선택한 이유는 <td>
태그를 검색하면 현재가, 전일대비, 등락률 이렇게 총 세개가 나오는데 그 중 우리가 원하는 건 첫번째 현재가이기 때문이다.def get_top_stocks(url='https://finance.naver.com/'):
"""
네이버 증권 페이지에서 TOP 종목 리스트를 추출하는 함수
Parameters:
url (str): 네이버 증권 페이지 URL
Returns:
list: 종목명과 현재가가 포함된 리스트
"""
# requests 라이브러리를 사용하여 네이버 증권 페이지 가져오기
response = requests.get(url)
response.encoding = 'euc-kr' # 한글 인코딩 설정
html = response.text
# BeautifulSoup으로 파싱
soup = BeautifulSoup(html, 'html.parser')
# 원하는 html 요소 찾기
top_items = soup.find('tbody', id='_topItems1')
# 종목명과 현재가를 추출하여 리스트에 저장
stock_list = []
if top_items:
rows = top_items.find_all('tr')
for row in rows:
# 종목명 추출
stock_name = row.find('a').get_text(strip=True)
# 현재가 추출
current_price = row.find_all('td')[0].get_text(strip=True)
stock_list.append((stock_name, current_price))
return stock_list
# 함수 호출 및 결과 출력
top_stocks = get_top_stocks()
for idx, (name, price) in enumerate(top_stocks, start=1):
print(f"{idx}. 종목명: {name} | 현재가: {price}")