[Python] 나도코딩 웹 스크래핑편 - (10) 시가총액

Updated:

유튜브 나도코딩 웹 스크래핑 무료 강의를 통해 학습한 내용을 정리해서 올리고 있습니다.

실습과정에서 필요에 따라 일부 강의 내용의 누락 및 추가, 수정사항이 있습니다.

퀴즈의 경우, 유튜브 풀이와 상이할 수 있습니다.


네이버 주식 시가총액

이번엔 네이버에서 제공하는 시가총액 정보를 스크래핑 할 것이다.

홈페이지는 각 페이지별로 50개 종목에 대한 여러가지 정보가 있다.

이를 시가총액 1위부터 200위까지 정보를 가져와보자.

import numpy as np
import pandas as pd
import requests
from bs4 import BeautifulSoup

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36"}

def naver_stock(number):
    
    url = f"https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page={number}"
    res = requests.get(url, headers = headers)
    res.raise_for_status()

    soup = BeautifulSoup(res.text, "lxml")
    
    # 모든 행 지정: tr 태그
    data_rows = soup.find("table", attrs={"class":"type_2"}).find("tbody").find_all("tr")
    
    stock_info = []
    
    for row in data_rows:
        # 행별 모든 td 태그
        col = row.find_all("td")

        # 특정 행(tr)은 단순히 줄 구분으로 td 태그가 1개만 존재하였음
        if len(col) <=1:
            continue
            
        data = [i.get_text().strip() for i in col] # strip 불필요한 문자열 제거 - 지정하지 않는 경우 공백 제거
        stock_info.append(data)
        # print(data)
    
    stock_info_df = pd.DataFrame(data = stock_info).iloc[:,:-1]
    stock_info_df.columns = title
    
    return stock_info_df


# 컬럼 제목 지정
title ="N	종목명	현재가	전일비	등락률	액면가	시가총액	상장주식수	외국인비율	거래량	PER	ROE".split("\t")

stock_final = pd.DataFrame()
for page in range(1,5):
     stock_final = pd.concat( [stock_final, naver_stock(page)], axis=0)
        
stock_final
N 종목명 현재가 전일비 등락률 액면가 시가총액 상장주식수 외국인비율 거래량 PER ROE
0 1 삼성전자 81,100 800 -0.98% 100 4,841,494 5,969,783 53.80 14,859,989 19.47 9.99
1 2 SK하이닉스 122,500 5,000 -3.92% 5,000 891,803 728,002 49.47 5,979,296 17.50 9.53
2 3 삼성전자우 74,200 0 0.00% 100 610,582 822,887 76.51 831,713 17.82 N/A
3 4 NAVER 358,500 4,000 -1.10% 100 588,884 164,263 56.57 360,125 3.65 15.22
4 5 카카오 129,000 500 +0.39% 100 572,576 443,857 33.28 1,925,921 187.77 2.70
... ... ... ... ... ... ... ... ... ... ... ... ...
45 196 아시아나항공 17,200 0 0.00% 5,000 12,799 74,412 20.77 0 -19.07 -43.83
46 197 영풍 688,000 4,000 -0.58% 5,000 12,673 1,842 4.70 1,950 9.26 4.03
47 198 하나투어 90,100 3,200 +3.68% 500 12,559 13,939 7.61 498,401 -6.88 -108.93
48 199 다우기술 27,600 300 -1.08% 500 12,383 44,867 22.32 146,629 3.27 18.85
49 200 보령제약 23,150 650 -2.73% 500 12,066 52,120 6.08 269,641 31.89 8.62

200 rows × 12 columns

  • 원하는 정보는 각 행마다 입력되어 있었고 각 행은 tr 태그이며 행의 각 정보는 td 태그로 구성되어 있다.

  • 특정 행은 단순히 줄 구분으로서 해당 tr태그 밑에 td 태그는 1개만 존재하여서 그를 제거하는 함수로 구성했다.

  • naver_stock()은 특정 페이지의 모든 종목 정보(즉, 50개)를 stock_info_df로 저장한다.

  • 총 4개의 페이지로 정보를 얻은 후 데이터 프레임 형태로 합쳐서 출력하였다.

Leave a comment