[웹 스크랩핑] 네이버증권 업종별 정보 수집

연습 1 - requests.get() 방식 활용해서 수집하기
Jan 26, 2023
[웹 스크랩핑] 네이버증권 업종별 정보 수집

[네이버 증권]에서 국내증시 업종별 정보 수집하기

  • 업종별 시세에는 거래량, 시가, 고가, 저가, … 다양한 정보가 포함되어 있다.
    • 웹으로 접속했을 때는 한번에 모든 변수가 선택되지 않는다.
    • ⇒ 정보를 한번에 수집할 수 없음.
  • requests.get()을 활용해서 페이지에서 조회할 수 있는 모든 데이터를 한번에 수집한다.
 
 

1. 라이브러리 로드

import time import pandas as pd import numpy as np import requests from bs4 import BeautifulSoup as bs from tqdm import tqdm

2. 업종 정보 가져오기 : get_subjects

# 1. 네이버 증권 페이지에서 업종 정보 가져오기 def get_subjects (): """ 1. url > request 요청 > pd.read_html로 테이블 읽어오기 2. 멀티인덱스 제거, 결측치 제거 3. bs로 업종번호 수집 > df["업종번호"] 컬럼 생성해서 추가 """ url = f"https://finance.naver.com/sise/sise_group.naver?type=upjong" response = requests.get(url) df = pd.read_html(url, encoding='cp949')[0] df.columns = df.columns.droplevel(0) df = df.dropna() soup = bs(response.text) a_list = soup.select('table.type_1 a') a_list_no = [a['href'].split('=')[-1] for a in a_list] df['업종번호'] = a_list_no return df

3. 네이버 증권 업종 > 종목별 정보 조회할 떄 조회항목 관련 변수 선언

# 2. 네이버 증권 업종 > 종목별 정보 조회할 떄 조회항목 관련 변수 선언 options = { '거래량' : 'quant', '시가' : 'open_val', '고가' : 'high_val', '저가' : 'low_val', '매수호가' : 'ask_buy', '매도호가' : 'ask_sell', '매수총잔량' : 'buy_total', '매도총잔량' : 'sell_total', '거래대금' : 'amount', '전일거래량' : 'prev_quant', '외국인비율' : 'frgn_rate', '시가총액' : 'market_sum', '자산총계' : 'property_total', '부채총계' : 'debt_total', '매출액' : 'sales', '매출액증가율' : 'sales_increasing_rate', '영억입익' : 'operating_profit', '영업이익증가율' : 'operating_profit_increasing_rate', '당기순이익' : 'net_income', '주당순이익' : 'eps', '보통주배당금' : 'dividend', '유보율' : 'reserve_ratio', '상장주식수' : 'listed_stock_cnt', 'PER' : 'per', 'ROE' : 'roe', 'ROA' : 'roa', 'PBR' : 'pbr', } field_ids = "&fieldIds=".join (option for option in options.values()) field_ids

4. 종목별 정보 가져오기 : get_content

# 3. 종목별 정보 가져오기 # 그냥 바로 pd.read_html 할 때는 headers 가 없어서 안나옴. > requests.get(url, header)로 가져와서 pd.read_html에 전달 def get_content(content_no): """ content_no 를 받으면 해당 업종 내용 수집 """ temp_url = f"https://finance.naver.com/sise/field_submit.naver?menu=upjong&returnUrl=http%3A%2F%2Ffinance.naver.com%" temp_url = f"{temp_url}2Fsise%2Fsise_group_detail.naver%3Ftype%3Dupjong%26no%3D{content_no}&fieldIds=" content_url = f"{temp_url}{field_ids}" headers = {"user-agent": "Mozilla/5.0"} response = requests.get(content_url, headers=headers) df_content = pd.read_html(response.text)[-1].iloc[1:-2].drop(["토론실"], axis=1) time.sleep(0.05) return df_content
notion image
notion image

5. ["업종번호"]컬럼에 get_content() 적용

tqdm.pandas() # 4. get_subjects()로 가져온 df 데이터프레임의 ["업종번호"]컬럼에 get_content() 적용 df_detail = df["업종번호"].progress_map(get_content)
notion image

6. 업종별 데이터프레임과 종목별 데이터프레임 합치기

# 5. 업종별 데이터프레임과 종목별 데이터프레임 합치기 # 1) df_subject 중 포함할 컬럼 선택 df_subject = get_subjects() df_subject = df_subject[["업종명", "전일대비", "업종번호"]] # 2) tb_list = [] for i in range(len(df_detail)) : temp_tb = df_detail.iloc[i] temp_tb[["업종명", "전일대비"]] = df_subject[["업종명", "전일대비"]].iloc[i] tb_list.append(temp_tb) df = pd.concat(tb_list, ignore_index=True) # 3) 멀티인덱스로 만들기 (업종별로 묶어서 보기 편하게) idx_list = df.columns.to_list()[-2:] idx_list.append("종목명") df_groups = df.groupby(idx_list) df_multi_idx = df_groups.first() df_multi_idx
notion image

7. 파일 저장하고 확인

# 6. 파일 저장하고 불러오기 # 위에서 만든 멀티인덱스 설정이 사라짐. csv파일에도 마찬가지. today_date = time.strftime('%Y-%m-%d') file_name = f"naver_finance_upjong_{today_date}" df_multi_idx.to_csv(f"{file_name}.csv") df = pd.read_csv(file_name) df
notion image
 
저장된 데이터 확인
저장된 데이터 확인
 
Share article
RSSPowered by inblog