본문 바로가기
Python

웹스크래핑 예제(1) - 파이썬으로 네이버 금융 인기 종목 엑셀 저장하기 (가장 직접적이고 명확함)

by 헬로제이콥 2025. 5. 19.

 

파이썬으로 네이버 금융 인기 종목 엑셀 저장하기 (가장 직접적이고 명확함)

import requests
from bs4 import BeautifulSoup

from openpyxl import Workbook

url = 'https://finance.naver.com/'
print(f"정보를 가져올 웹 페이지: {url}")

response = requests.get(url)
response.raise_for_status()
html = response.text
soup = BeautifulSoup(html, 'html.parser')
tbody = soup.select_one('#container > div.aside > div.group_aside > div.aside_area.aside_popular > table > tbody')
trs = tbody.select('tr')
datas = []
for tr in trs:
  name = tr.select_one('th > a').get_text()
  current_price = tr.select_one('td').get_text() 
  change_direction = tr['class'][0]
  change_price = tr.select_one('td > span').get_text()
  datas.append([name, current_price, change_direction, change_price])

print("종목 정보 추출 완료.")

# 5. 엑셀 파일로 저장 준비
write_wb = Workbook() # 새로운 엑셀 워크북(파일) 생성
# write_ws = write_wb.create_sheet('결과') # 새 시트 생성 (기본 시트 사용 시 이 줄은 생략 가능)
write_ws = write_wb.active # 기본 시트 사용


for data in datas:
    write_ws.append(data)


write_wb.save(r'네이버_인기종목1.xlsx')

 

# 필요한 라이브러리를 가져옵니다.
import requests # 웹 페이지의 HTML 내용을 가져오기 위한 라이브러리
from bs4 import BeautifulSoup # HTML 내용을 파싱(분석)하여 필요한 데이터를 추출하기 위한 라이브러리
from openpyxl import Workbook # 엑셀 파일을 만들고 데이터를 쓰기 위한 라이브러리
# import os # 파일 경로 관련 작업을 위해 필요할 수 있지만, 이 코드에서는 직접 사용되지 않습니다.

# 1. 정보를 가져올 웹 페이지(URL)를 설정합니다.
url = 'https://finance.naver.com/'
print(f"정보를 가져올 웹 페이지: {url}") # 어떤 페이지에 접속할지 출력하여 확인합니다.

# 2. 설정된 URL로 웹 접속 요청을 보내고 응답을 받습니다.
response = requests.get(url)

# 3. 웹 접속 요청이 성공했는지 확인합니다. (상태 코드 200번대 외에는 오류 발생)
# raise_for_status()는 HTTP 오류 발생 시 예외를 발생시켜 프로그램이 멈추게 합니다.
response.raise_for_status()

# 4. 웹 접속으로 받은 응답에서 HTML 내용을 텍스트로 가져옵니다.
html = response.text

# 5. 가져온 HTML 텍스트를 BeautifulSoup 객체로 파싱합니다.
# 'html.parser'는 파이썬 표준 라이브러리에 포함된 HTML 파서입니다.
soup = BeautifulSoup(html, 'html.parser')

# 6. BeautifulSoup를 사용하여 원하는 데이터가 있는 HTML 요소를 찾습니다.
# select_one()은 CSS 선택자로 지정된 첫 번째 요소를 찾습니다.
# 이 선택자는 네이버 금융 메인 페이지의 인기 종목 테이블 본문(tbody)을 가리킵니다.
# 주의: 웹사이트 구조가 변경되면 이 선택자는 더 이상 작동하지 않을 수 있습니다.
tbody = soup.select_one('#container > div.aside > div.group_aside > div.aside_area.aside_popular > table > tbody')

# 7. 찾은 tbody 요소 안에서 모든 'tr'(테이블 행) 요소들을 찾습니다.
# 각 tr 요소는 하나의 종목 정보를 담고 있습니다.
trs = tbody.select('tr')

# 8. 추출한 종목 정보들을 저장할 빈 리스트를 생성합니다.
datas = []

# 9. 찾은 각 종목 행(tr)에 대해 반복하면서 필요한 데이터를 추출합니다.
for tr in trs: # 각 tr 요소를 순회합니다.
    # 각 종목 행 안에서 종목 이름, 현재가, 등락 정보 등을 찾습니다.
    # select_one()으로 특정 요소를 찾고, get_text()로 요소 안의 텍스트만 가져옵니다.
    # 만약 해당 요소가 없으면 get_text() 호출 시 오류가 발생할 수 있습니다. (원래 코드의 잠재적 오류)
    name_element = tr.select_one('th > a') # 종목 이름 (th 태그 안의 a 태그)
    current_price_element = tr.select_one('td') # 현재가 (보통 첫 번째 td 태그)
    change_price_element = tr.select_one('td > span') # 대비 가격 또는 등락률 (td 태그 안의 span 태그)

    # 요소가 존재하는지 확인하고 텍스트를 가져옵니다. 없으면 'N/A' 등으로 처리하여 오류 방지 가능 (원래 코드는 오류 발생 가능)
    # 이 코드에서는 원래 코드대로 오류 처리가 없이 바로 get_text()를 사용합니다.
    name = name_element.get_text() # 종목 이름 텍스트 가져오기
    current_price = current_price_element.get_text() # 현재가 텍스트 가져오기

    # 등락 구분 정보는 tr 태그의 'class' 속성에 있습니다. (예: 'up', 'down', 'no_ch')
    # tr['class']는 클래스 이름들의 리스트를 반환하고, [0]으로 첫 번째 클래스 이름을 가져옵니다.
    change_direction = tr['class'][0]

    change_price = change_price_element.get_text() # 대비 가격 또는 등락률 텍스트 가져오기

    # 추출한 데이터를 리스트 형태로 만들고, datas 리스트에 추가합니다.
    datas.append([name, current_price, change_direction, change_price])

# 10. 모든 종목 정보 추출이 완료되었음을 출력합니다.
print("종목 정보 추출 완료.")

# 11. 추출한 데이터를 저장할 새로운 엑셀 워크북(파일)을 생성합니다.
write_wb = Workbook()

# 12. 워크북에 '결과'라는 이름의 새로운 워크시트(Sheet)를 생성합니다.
# 또는 write_ws = write_wb.active 를 사용하여 기본 생성된 시트를 사용할 수도 있습니다.
write_ws = write_wb.create_sheet('결과')

# (선택 사항) 엑셀 파일의 첫 행에 데이터의 제목(헤더)을 추가하면 좋습니다.
# write_ws.append(['종목명', '현재가', '등락구분', '대비'])

# 13. 추출된 데이터 리스트(datas)에 대해 반복하면서 각 종목 데이터를 엑셀 시트에 추가합니다.
for data in datas: # datas 리스트의 각 항목(종목 데이터 리스트 [name, ...])에 대해 반복
    write_ws.append(data) # 엑셀 시트에 새로운 행으로 데이터를 추가합니다.

# 14. 작성된 엑셀 워크북을 지정된 경로와 파일 이름으로 저장합니다.
# r'' 접두사는 경로 문자열 안에 역슬래시(\)가 특수 문자로 해석되지 않도록 합니다 (Windows 경로에 유용).
# 이 부분을 원하는 실제 파일 경로와 이름으로 변경해야 합니다.
write_wb.save(r'네이버_인기종목1.xlsx') # 현재 파이썬 스크립트 파일이 실행되는 폴더에 저장됩니다.

# (선택 사항) 저장이 완료되었음을 알리는 메시지를 추가합니다.
# print(f"엑셀 파일 '네이버_인기종목1.xlsx' 저장이 완료되었습니다.")