반응형

어딜가도 테마별 주식이 엑셀로 쉽게 볼수 있는 곳이 없었다.

그래서 하기로 했다.

일단, 네이버 금융의 테마별 시세를 들어간다.

(네이버 금융 -> 국내 증시 -> 주요시세정보 -> 테마)

 

테마별 시세 : 네이버 금융

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

finance.naver.com

 

테마명이 나오며, 테마 링크를 클릭하면 해당 종목들이 나온다. (모든 종목을 한번에 보고싶었다)

+ 테마 검색도 없다.

그래서 BeautifulSoup 라이브러리를 통해 만들었다.

Soup를 통한 select를 할 때,  Copy - Copy Selector를 통해서 태그를 가져오면 된다.

 

<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import sys
sys.path.append('C:\\Users\\user\\Anaconda3\\libs')
import requests
from io import BytesIO
import pandas as pd
import seaborn as sns
from tqdm import tqdm
 
from bs4 import BeautifulSoup
import datetime
import re
from postLib import  PostgresDataClass
 
# from html_table_parser import parser_functions as parser
 
#%%
 
end = datetime.datetime.now()
start = end - datetime.timedelta(days=10)
headers = {'User-Agent''Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36'"Upgrade-Insecure-Requests""1","DNT""1","Accept""text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language""en-US,en;q=0.5","Accept-Encoding""gzip, deflate"}
pd.set_option('display.float_format'None)
df = pd.DataFrame()
 
#%%
for pagenum in range(1,8):
    url = "https://finance.naver.com/sise/theme.nhn?field=name&ordering=asc&page={pagenum}".format(pagenum=pagenum)
    resp = requests.get(url, headers = headers)
    soup = BeautifulSoup(resp.content, "html.parser")
 
 
    thema_num = 0
    while thema_num < 50:
        try : 
            thema_num += 1
            board_date = soup.select("#contentarea_left > table.type_1.theme > tr:nth-child("+str(thema_num)+") > td.col_type1 > a")[0]
 
    
            linkUrl = 'https://finance.naver.com' + board_date['href']
 
            linkResp = requests.get(linkUrl, headers = headers)
            linkSoup = BeautifulSoup(linkResp.content, "html.parser")
            thema = board_date.text
        except Exception as e:
            continue
        link_num = 0
        while link_num < 100 :
            try : 
                link_num += 1
    
                link_board_date = linkSoup.select("#contentarea > div:nth-child(5) > table > tbody > tr:nth-child("+str(link_num)+") > td.name > div > a")[0].text
                print(thema, link_board_date)
                df = df.append({'thema' : thema, 'stock' : link_board_date}, ignore_index =True)                
 
                
            except : 
                continue
     
df1 = df.groupby(['stock'])['thema'].apply(lambda x: ','.join(x)).reset_index()
 
df.to_excel('C:\\Users\\user\\thema.xlsx')
df1.to_excel('C:\\Users\\user\\thema2.xlsx')
 
tuples = [tuple(x) for x in df.values.tolist()]
 
post = PostgresDataClass('localhost','stock','postgres','postgres')
post.insert_list(tuples, 'stock.thema_stock')
cs

 

<데이터> 예제 (네이버)

 

반응형

'투자 > 개발' 카테고리의 다른 글

위불과 같은 RSI 계산하기 (엑셀, 파이썬)  (0) 2021.09.25
Google Sheets를 이용한 자동 메일  (0) 2021.09.06

+ Recent posts