본문 바로가기
나만의 파이썬

[네이버] 금융 코스닥 파이썬 크롤링 연습.

by 초보코딩러 2021. 6. 4.

유튜브에서 개발자와 데이터 분석에 대한 영상을 보다. 배달의 민족 개발자 분 중 기억하기보단 기록하자 라는

말이 이제 한달 좀 안 되게 파이썬을 배운 나 자신도 인상 깊을 정도로 이거다!라는 생각이 들게 해 줬다. 코딩을 처음 배우고 공부하는 사람들에게도 정말 어떠한 팁 보다 좋은 공부 방향성과 길을 잃지 않는 법을 배우는게 돌아가지 않는 방법이지 않을까 싶었다. 그래서 오늘 처음으로 기억하고 싶은 코드들을 남겨보려고 한다.

 

네이버 코스닥 일별시세 중  날짜와 체결가를 가져와 라인 그래프로 적용시키는 연습을 했다. 

1. HTML형식의 네이버.

 

import requests
from bs4 import BeautifulSoup
import pandas as pd
from matplotlib import pyplot as plt

2. requests 보내기.

base_url = 'https://finance.naver.com/sise/sise_index_day.nhn'
params ={'code':'KOSDAQ'}    
headers ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'}
resp = requests.get(base_url,params=params,headers=headers)
soup = BeautifulSoup(resp.text)
kosdac_list = soup.select('table.type_1 tr')

 

기본적인 크롤링 BeautifulSoup으로 가져와 Select으로 범위를 좁혀 줬다. 전에 삼성 일별 시세를 크롤링해본 경험이 있어 똑같은 방법으로 크롤링하면 되겠다 생각했다.

 

3. 필요하지 않은 정보까지 result_list 변수에 append 돼서 초보자인 나는 당황할 수 밖에 없었다.

[{None},
 {None},
 {'date': <td class="date">2021.06.03</td>,
  'price': <td class="number_1">991.00</td>},
 {'date': <td class="date">2021.06.02</td>,
  'price': <td class="number_1">981.10</td>},
 {'date': <td class="date">2021.06.01</td>,
  'price': <td class="number_1">984.59</td>},
 {None},
 {None},
 {None},
 {None},
 {'date': <td class="date">2021.05.31</td>,
  'price': <td class="number_1">981.78</td>},
 {'date': <td class="date">2021.05.28</td>,
  'price': <td class="number_1">977.46</td>},
 {'date': <td class="date">2021.05.27</td>,
  'price': <td class="number_1">974.08</td>},
 {None},
 {None}]

데이터 프레임 형식으로 만들기엔 result_list 변수에 들어가 있는None 요소들을 하나하나 빼주기엔 

페이지 수가 많을 수록 비효율 적이기도 했고 너무 첫 단추를 잘 못 끼운 느낌이 들었다.

 

4. 다른 동기분들 코드를 보고.

for i in range(len(elements)):
    try:
        date = elements[i].select_one('.date').text
        price = elements[i].select_one('td:nth-of-type(2)').text   # 2번째 <td>에서 추출
    except AttributeError:   # Attribute에러가 뜨면 밑에 코드 실행안함
        continue
    if i % 8 == 0:   # 8의 배수번째 데이터에 중복이 섞여있으므로 밑에 코드 실행안함
        continue
    result.append({
        'date': date,
        'price': re.sub('[\[\]]', '' , str(price))   # 정규표현식으로 특수문자 제거
    })

result_list index로 접근해서 필요한 데이터를 골라오는 코드를 보고 아 이렇게도 가능 하구나 생각하고

처음에 내가 생각했던 코드에 if문을 이용해서 None을 뺄 수 없을까 고민을 정말 많이 했다. 

5. 혼자 생각했던 방향.

result_list = []
for item in kosdac_list:
    date = item.find('td',class_='date')
    if date == None:
        continue
        
    price = item.find('td',class_='number_1')
    if price == None:
        continue
    
    result_list.append({
        'date': date.text,
        'price': price.text
    })
    Kd = pd.DataFrame(result_list)
    
    Kd['price']=Kd['price'].apply(lambda x:float(x))
    plt.plot(Kd['date'],Kd['price'])
    

거기서 찾은 continue로 코드 건너뛰기라는 방법이 있어 if 문에 date, price 값이 None일 때 코드를 건너뛰어 다시 for문을 돌려 내가 원하는 date와 price만 찾을 수 있었다. 크롤링은 정답이 없고 자기 스타일을 만드는 게 중요하다고 강사님에게 듣고 나서 남의 코드를 온전히 내 것으로 만드는 것도 중요하지만 처음 생각했던 방향으로 코드를 만들 수 없을까 고민하는 시간이 파이썬 코드를 구글링 하면서 더 배울 수 있는 방향이 많다는 걸 느끼게 됐다.

[{'date': '2021.06.03', 'price': '990.19'},
 {'date': '2021.06.02', 'price': '981.10'},
 {'date': '2021.06.01', 'price': '984.59'},
 {'date': '2021.05.31', 'price': '981.78'},
 {'date': '2021.05.28', 'price': '977.46'},
 {'date': '2021.05.27', 'price': '974.08'}]

<result_list> continue 후 None 값이 제거 됐다.

 

6. DataFrame으로 바꾸고 apply(lambda x:float(x))로 object 형태였던 price를 실수로 바꾼 후 

plt.plot(date, price)로 라인 그래프를 적용시켰다.

 

 

 

댓글