[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