코딩걸음마

종목별 테마 크롤링 코드(with Naver 금융) 본문

나만의 프로그램

종목별 테마 크롤링 코드(with Naver 금융)

코딩걸음마 2022. 6. 19. 21:46
728x90

네이버 금융에서는 테마별 종목을 관리한다.

 

https://finance.naver.com/sise/theme.naver

 

테마별 시세 : 네이버 금융

관심종목의 실시간 주가를 가장 빠르게 확인하는 곳

finance.naver.com

 

 

테마별 수익률을 제공해주기도 하고,

테마별 포트폴리오 수익률

테마 내 종목별 시세를 알려주기도 한다.

테마별 종목 시세표

이 리스트를 분석에 활용하기 위해 

테마별 종목 리스트를 크롤링 해보기로 했다.

 

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


#크롤링 차단 막기
seed = np.random.randint(100)
np.random.seed(seed)
r = np.random.randint(5)/10
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}

thema_name_list = []
i=1
j=1
while i < 600:
    global data_base
    search_url = f'https://finance.naver.com/sise/sise_group_detail.naver?type=theme&no={i}'
    resp = requests.get(search_url)
    soup = BeautifulSoup(resp.text, 'html.parser')
    s = soup.select_one
    time.sleep(r)
    try:
        thema_name = re.sub(r"/", "_", s('head > title').text.split(':')[0])
        print(thema_name)
        i+=1
        j=1
        data_base = ["종목명", "테마 사유"]
    except :
        print(f"pass{i}/600")
        i+=1
        continue
    while j<100:

        try:
            stock_name = re.sub("&","*",re.sub(r"\n\n", "", re.sub(r"\t", "",s(f'#contentarea > div:nth-child(5) > table > tbody > tr:nth-child({j}) > td:nth-child(2) > div > div > strong').text)).split('\n')[0]).upper()
            stock_detail = re.sub(r"\n\n", "", re.sub(r"\t", "",s(f'#contentarea > div:nth-child(5) > table > tbody > tr:nth-child({j}) > td:nth-child(2) > div > div > p').text))
            j+=1
            data = np.array([stock_name, stock_detail])
            data_base = np.vstack([data_base, data])
            print(f"......종목탐색중 {j}")
        except:
            print("종목탐색 완료")
            df = pd.DataFrame(data_base)
            thema_name_list.append(thema_name)
            df.to_csv(f'{thema_name}')
            print(f"■■■■■■■■  저장완료 진행도 {i}/600_")
            break

arr = np.array(thema_name_list)
df =pd.DataFrame(arr)
df.to_csv('thema_name_list')
print(thema_name_list)

사용 시 유의할점 

"&"가 들어간 종목에 대해서는 왠지 모르지만 에러가 자꾸 발생한다.

그래서 "&"를 " * " 로 치환되어 저장된다.

 

테마는 하나의 csv파일로 저장되며,

 

인덱스/ 종목명/ 테마사유를 가져온다.

728x90
Comments