데이터 크롤링(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
위의 코드로 url을 준비하고 라이브러리를 사용하여 호출한다.
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
위의 코드는 먼저 Pagination영역을 가져와서 마지막 페이지를 알아내는 코드다.
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

이렇게 이번주에는 일별 시세, 일별시세로 그래프 그리기, 재무제표 등 서비스기획초안작성의 기업을 선택했을 때의 페이지를 구성해 보았다.









댓글

이 블로그의 인기 게시물

SQL(9)(performance tuning queries, pivoting data)

데이터 크롤링(3주차)

SQL(8)(writing subqueries, window functions)