데이터 크롤링(4주차)
서비스기획초안작성에서 했던 2번째 기업을 선택했을 때의 페이지를 삼성전자로 구현해볼 것이다. 먼저 구현하기에 앞서 네이버 금융에서 삼성전자 페이지를 들어가 필요한 데이터를 크롤링해올 것이다.
1 2 3 4 5 6 | import requests from bs4 import BeautifulSoup import traceback import pandas as pd import datetime import plotly.express as px | cs |
1 2 | code = '005930' code | cs |
1 2 3 4 | url = 'http://finance.naver.com/item/sise_day.nhn?code={code}'.format(code=code) res = requests.get(url) res.encoding = 'utf-8' res.status_code | cs |
1 | soap = BeautifulSoup(res.text, 'lxml') | cs |
1 2 3 4 5 6 | el_table_navi = soap.find("table", class_="Nnavi") el_td_last = el_table_navi.find("td", class_="pgRR") pg_last = el_td_last.a.get('href').rsplit('&')[1] pg_last = pg_last.split('=')[1] pg_last = int(pg_last) pg_last | cs |
1 2 3 4 5 6 7 8 9 10 11 | def parse_page(code, page): try: url = 'http://finance.naver.com/item/sise_day.nhn?code={code}&page={page}'.format(code=code, page=page) res = requests.get(url) _soap = BeautifulSoup(res.text, 'lxml') _df = pd.read_html(str(_soap.find("table")), header=0)[0] _df = _df.dropna() return _df except Exception as e: traceback.print_exc() return None | cs |
위의 함수는 종목과 페이지 번호를 입력받아서 일별 주가를 DataFrame으로 반환하는 함수다.
1 | parse_page(code, 1) | cs |
함수를 한번 작동해보면 다음과 같이 나타난다.
1 2 | str_datefrom = datetime.datetime.strftime(datetime.datetime(year=2018, month=1, day=1), '%Y.%m.%d') str_dateto = datetime.datetime.strftime(datetime.datetime.today(), '%Y.%m.%d') | cs |
위의 코드는 기준일자를 시작과 끝을 만들어 가져올 수 있도록 기준일자를 정의한다.
1 2 3 4 5 6 7 8 9 10 | df = None for page in range(1, pg_last+1): _df = parse_page(code, page) _df_filtered = _df[_df['날짜'] > str_datefrom] if df is None: df = _df_filtered else: df = pd.concat([df, _df_filtered]) if len(_df) > len(_df_filtered): break | cs |
다음과 같이 df를 만들면 아래와 같은 결과가 나타난다.
1 | df.head() | cs |
1 | df.tail() | cs |
이제 삼성전자의 일별 시세 데이터를 가져왔으니 이 데이터로 plotly패키지로 그래프를 그릴것이다.
그 전에 앞서 날짜를 datetime형식으로 바꾸어 준다.
1 2 | df['날짜'] = pd.to_datetime(df['날짜']) df | cs |
다음과 같이 날짜의 형식이 바뀌었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | fig = px.line(df, x='날짜', y='종가') fig.update_xaxes( rangeslider_visible=True, rangeselector=dict( buttons=list([ dict(count=1, label="1m", step="month", stepmode="backward"), dict(count=6, label="6m", step="month", stepmode="backward"), dict(count=1, label="1y", step="year", stepmode="backward"), dict(step="all") ]) ) ) fig.show() | cs |
위의 코드를 입력하면 아래와 같이 한달, 6달, 1년, 전체 등 원하는 단위로 그래프를 볼 수 있다.
그러나 어떤 날의 기점으로 값이 너무 달라졌다. 이 정보를 확인해보니 2018년 5월 4일 기준으로 값이 달라지는 것을 확인하였다. 그래서 2018년 5월 5일을 기준으로 다시 그려보았다.
그 다음으로 삼성전자의 재무제표를 크롤링해 보았다.
1 2 3 4 5 | code = '005930' url = 'http://finance.naver.com/item/main.nhn?code={code}'.format(code=code) tables = pd.read_html(url, encoding='euc-kr') df2 = tables[3] df2 | cs |
이렇게 이번주에는 일별 시세, 일별시세로 그래프 그리기, 재무제표 등 서비스기획초안작성의 기업을 선택했을 때의 페이지를 구성해 보았다.


댓글
댓글 쓰기