파이썬 requests 모듈은 웹 서버에 요청을 보내고 응답 객체를 받는데 사용한다. 응답 객체 중에서 HTML 소스 코드를 얻는 방법을 알아본다. 

 

import requests

url = "https://www.wikipedia.org/"
resp = requests.get(url)

html = resp.text
print(html[:1000])

1. requests 모듈을 불러온다.

 

2. 위키피디아 웹 주소를 변수에 저장한다. 

 

3. 웹 서버에 GET 요청을 보내고, 서버가 응답한 객체를 변수에 저장한다.

 

4. text 속성에 HTML 소스코드가 들어 있다. 

 

5. 문자열로 저장되어 있는 HTML 소스코드를 출력한다. 앞에서 1000개의 글자를 지정하여 일부 소스코드만 확인한다. 


<실행 결과 > HTML 소스코드 확인

<!DOCTYPE html>
<html lang="mul" class="no-js">
<head>
<meta charset="utf-8">
<title>Wikipedia</title>
<meta name="description" content="Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation.">
<![if gt IE 7]>
<script>
document.documentElement.className = document.documentElement.className.replace( /(^|\s)no-js(\s|$)/, "$1js-enabled$2" );
</script>
<![endif]>
<!--[if lt IE 7]><meta http-equiv="imagetoolbar" content="no"><![endif]-->
<meta name="viewport" content="initial-scale=1,user-scalable=yes">
<link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png">
<link rel="shortcut icon" href="/static/favicon/wikipedia.ico">
<link rel="license" href="//creativecommons.org/licenses/by-sa/3.0/">
<style>
.sprite{background-image:url(portal/wikipedia.org/assets/img/sprite-3f2e1b8f.png);background-image:linear-gradient(transparent,transparent),url(portal/wikipedia.org/assets/img/sprite-3f2e1b8f.svg);background

 

1. 8/3(토) - CGV 서면

   - 영화시작: 16:05

   - 무대인사: 17:55(종영시)

   - 상영관: IMAX관

   - 참석자: 이상근 감독, 조정석,  윤아 외

 

2. 8/3(토) - CGV 서면

   - 영화시작: 16:15

   - 무대인사: 18:05(종영시)

   - 상영관: 9

   - 참석자: 이상근 감독, 조정석,  윤아 외

 

3. 8/3(토) - CGV 센텀

   - 영화시작: 17:55

   - 무대인사: 19:45(종영시)

   - 상영관: 6

   - 참석자: 이상근 감독, 조정석,  윤아 외

 

4. 8/3(토) - CGV 센텀

   - 영화시작: 18:05

   - 무대인사: 19:55(종영시)

   - 상영관: 8

   - 참석자: 이상근 감독, 조정석,  윤아 외

 

5. 8/4(일) - CGV 대구아카데미

   - 영화시작: 14:30

   - 무대인사: 14:30(시작시)

   - 상영관: 3

   - 참석자: 이상근 감독, 조정석,  윤아 외

 

6. 8/4(일) - CGV 대구아카데미

   - 영화시작: 14:40

   - 무대인사: 14:40(시작시)

   - 상영관: 7

   - 참석자: 이상근 감독, 조정석,  윤아 외

 

7. 8/4(일) - CGV 대구한일

   - 영화시작: 15:20

   - 무대인사: 15:20(시작시)

   - 상영관: 1

   - 참석자: 이상근 감독, 조정석,  윤아 외

 

8. 8/4(일) - CGV 대구한일

   - 영화시작: 15:30

   - 무대인사: 15:30(시작시)

   - 상영관: 2

   - 참석자: 이상근 감독, 조정석,  윤아 외

 

9. 8/4(일) - CGV 대구

   - 영화시작: 15:15

   - 무대인사: 17:05(종영시)

   - 상영관: IMAX관

   - 참석자: 이상근 감독, 조정석,  윤아 외

 

10. 8/4(일) - CGV 대구

   - 영화시작: 15:25

   - 무대인사: 17:15(종영시)

   - 상영관: 9

   - 참석자: 이상근 감독, 조정석,  윤아 외

 

 

1. 클립보드에서 읽어 오기

 

   * pd.read_clipboard( ) : 클립보드에 있는 내용을 read_table( )에 전달. 웹 또는 다른 파일에 있는 텍스트를 선택하여 클립보드에 저장한 상태에서, 클립보드에서 바로 파이썬에서 다룰 수 있는 데이터로 가져올 수 있게 하는 기능.


   - DataFrame을 만들고, 내용을 확인한다.  

 

>>> df = pd.DataFrame([[1, 2], [3, 5], [5, 9]], columns=['A', 'B'])
>>> df
    A B
0  1 4
1  2 5
2  3 6

 

   -  위 텍스트 부분을 마우스로 전부 선택해서 Ctrl+C를 눌러서 클립보드에 저장한다. 

 

판다스 클립보드 활용

 

      -  pd.read_clipboard( )를 이용하여, 클립보드의 데이터를 clip_df 변수에 저장한다. 

 

>>> clip_df = pd.read_clipboard( )
>>> clip_df
   A  B0  1  21  3  52  5  9
 

 

 

2. 클립보드로 보내기

 

   * pd.to_clipboard( ) -데이터프레임을 텍스트로 변환하여 클립보드에 저장. 클립보드에 저장된 데이터(텍스트로 저장)를 붙여넣기(Ctrl+V)를 통해서 워드프로세스서나 다른 파일로 바로 옮길 수 있다. 

 

pd.to_clipboard( )  클립보드로 보내기

 

 

초보의, 초보에 의한, 초보를 위한 파이썬 코딩!

 

복잡한 코딩은 피하겠습니다. 간단하게 따라하면서 바로 업무에 적용할 수 있는 알고리즘을 찾아서 소개하겠습니다. 포기하지 마시고 직접 따라하시다보면 파이썬 언어도 자연스럽게 이해가 될 수 있도록 말이죠.

 

 

 

오늘은 상장기업 재무제표(제무정보) 수집 업무 자동화를 해보겠습니다.

 

 

Step 1: 데이터를 수집할 소스를 정한다.

 

이번 예제에서는 KISLINE(http://media.kisline.com/highlight/mainHighlight.nice?nav=1&paper_stock=005930) 사이트에서 삼성전자(005930)의 재무정보를 가져와 보겠습니다. url 마지막 부분에 "paper_stock=005930"에서 숫자 6자리가 주식종목코드입니다. 이 부분을 바꿔주면 원하는 상장회사의 재무정보가 있는 KISLINE 웹페이지를 호출할 수 있습니다.

 

 

Step 2: 데이터 수집을 위한 코드를 작성한다.

 

코드는 아주 간단하죠?^^ pandas 라이브러리와 dataframe을 설명하고 이해하려면 상당히 많은 시간이 필요하지만, 직장인들이 업무에 적용할 때는 엑셀의 내장함수를 사용하 듯 그냥 따라하는 것도 괜찮다고 생각합니다. 일단 업무에 적용하고, 세세한 작동원리와 이론에 대해서는 차근차근 보충해 나가는 방법을 권장합니다. 이런 게 실사구시의 정신 아닐까요? ^^

 

import pandas as pd

 

#html 객체의 표(table)를 pandas dataframe으로 가져온다
url = 'http://media.kisline.com/highlight/mainHighlight.nice?nav=1&paper_stock=005930'
tables = pd.read_html(url)

 

#엑셀로 저장하기
df = tables[4]    #개별IFRS 연간 재무제표
df.to_excel('output.xlsx')

 

 

 

Step 3: 데이터를 원하는 형태로 정리한다. 

 

저장된 엑셀 파일을 열어서 확인해 보면, 불필요한 셀들이 있는데요. 이런 부분을 제거해서 필요한 부분만 남기는 것을 데이터 클린징이라고 부릅니다. 이 부분도 자동화할 수 있지만, 난이도가 꽤 있는 작업이라서 오늘은 다루지 않겠습니다.

 

저는 아래와 같이 불필요한 셀을 삭제해서 정리하였습니다. 각자 필요한 양식으로 만들어서 사용하시면 되겠습니다.

 

 

 

 

 

 

네이버 등 포털 사이트에서 제공하는 주식시세(주가정보) 데이터를 가져와서, 그래프로 간략하게 그려보는 예제를 만들어 봅니다. 처음에는 코드 한줄 한줄 전부 이해하는 것보다는 예제 코드를 최대한 타이핑해보면서 실행 결과를 확인해 보면서 흥미를 갖는 것이 중요합니다.

 

지난 포스팅에서 설명드린 pandas.read_html 함수를 사용해서 네이버 주식 시세 테이블을 dataframe으로 가져옵니다. 아래 그림처럼 주식시세가 웹페이지 여러 페이지에 걸쳐 있기 때문에, 페이지를 한장씩 넘어가면서 pandas.read_html 함수를 사용하여 표를 여러 번 나누어서 읽어야 합니다.

 

 

 

 

 

우선, 필요한 패키지(pandas, datetime)를 불러온다. 네임스페이스를 사용하여 pd, dt 등 약칭으로 부른다

 

 
 import pandas as pd 
# 데이터프레임을 다루는 패키지

 import datetime as dt  # 시간을 다루는 패키지

 import matplotlib.pyplot as plt  # 그래프 시각화 패키지
 from matplotlib import style 

 

 

 

이제 본격적으로 웹 스크래핑을 처리하는 함수(function)을 정의합니다. url 주소에 들어 있는 종목코드(6자리)와 주식시세 페이지 번호(page)를 유의해서 살펴보시기 바랍니다.

 

 

 
 def read_stock_price_page(stock_code, page_num):
    '''
    네이버 주식시세 페이지에 접속하여 table을 dataframe으로 가져와서 정리
    '''
    target_url = ('http://finance.naver.com/item/sise_day.nhn?code='+ stock_code + '&page=' + str(page_num))
    data = pd.read_html(target_url)
    data = data[0]
    data.columns = ['날짜', '당일종가', '전일종가', '시가', '고가', '저가', '거래량']
    price_data = data.dropna(axis=0, how='any')
    price_data = price_data.drop(price_data.index[0])
    price_data = price_data.reset_index(drop=True)
    price_data['날짜'] = pd.to_datetime(price_data['날짜'], format='%Y/%m/%d')
    return price_data

 

 

 

오늘부터 과거로 소급해서 일정한 기간 동안의 주가 정보만을 가져오는 기능을 추가해 봅니다. days_limit이라는 변수를 함수 인자로 받아서, datetime 시간 클래스를 활용하여 기간을 계산합니다. 앞서 정의한 read_stock_price_page( ) 함수를 사용하여 매 페이지의 주가 정보를 가져 옵니다.

 

 

 
 def stock_price_pages_to_df(code, days_limit=30):
    '''
    오늘부터 days_limit 일수 만큼 이전 날짜 주가를 가져온다.
    '''
   
    df_list_price = []
    page = 1
    while True:
        try:   
            data = read_stock_price_page(code, page)
            time_limit = dt.datetime.now() - data['날짜'][0] 
            if time_limit.days > days_limit: break  
            df_list_price.append(data)                    
            page = page + 1
   
        except: break
    df_price = pd.concat(df_list_price)
    df_price = df_price.reset_index(drop=True)

    return df_price

 

 

 

앞서 정의한 stock_price_pages_to_df( )함수에 종목코드와 기간(날짜)을 인자로 입력해서 dataframe 형태로 정리된 데이터를 return값으로 전달받습니다.

 

 

 
 # 함수를 실행하여 KH바텍(060720)의 과거 30일 주가정보를 가져온다.    
 stock_code = '060720'
 days_limit = 30
 df = stock_price_pages_to_df(stock_code, days_limit)

 

 

 

df 변수에 할당된 데이터프레임을 아래와 같이 잘 정리가 되었습니다.

 

 

날짜

당일종가

전일종가

시가

고가

저가

거래량

0

2018-07-02 0:00:00

10100

600

10850

10900

10000

137977

1

2018-06-29 0:00:00

10700

300

10550

10900

9990

170253

2

2018-06-28 0:00:00

10400

500

10900

10950

10150

155769

3

2018-06-27 0:00:00

10900

100

10800

11050

10500

133548

4

2018-06-26 0:00:00

10800

350

10900

11000

10700

63039

5

2018-06-25 0:00:00

11150

150

11400

11450

11000

55519

6

2018-06-22 0:00:00

11300

100

11250

11450

10750

134805

7

2018-06-21 0:00:00

11200

350

11350

11750

11200

133002

8

2018-06-20 0:00:00

11550

250

11200

11600

10900

308596

9

2018-06-19 0:00:00

11300

700

11850

11950

11300

180656

10

2018-06-18 0:00:00

12000

1400

13400

13400

12000

309787

11

2018-06-15 0:00:00

13400

50

13600

13600

12900

201376

12

2018-06-14 0:00:00

13450

250

13200

13700

13150

347451

13

2018-06-12 0:00:00

13200

1250

12200

13300

12050

558148

14

2018-06-11 0:00:00

11950

0

12000

12250

11950

62293

15

2018-06-08 0:00:00

11950

0

11950

12200

11800

59258

16

2018-06-07 0:00:00

11950

200

12200

12300

11900

49088

17

2018-06-05 0:00:00

12150

250

11800

12250

11800

42485

18

2018-06-04 0:00:00

11900

0

11900

12200

11700

25171

19

2018-06-01 0:00:00

11900

100

11800

12100

11750

32062

 

 

 

 

matplotlib 패키지를 사용하면, 그래프를 쉽게 그릴 수 있습니다. ggplot 스타일을 지정하고, 날짜를 x축으로 하고 당일종가 그래프를 그리게 됩니다.

 

 

 
 # 주식 시세(당일종가) 그래프를 그린다.
 style.use('ggplot')   #그래프 스타일 지정
 plt.plot(df.날짜, df.당일종가.astype(int))  
 plt.show()

 

  

 

필요한 패키지(pandas, datetime)를 불러온다. 네임스페이스 pd, dt, plt등 약칭으로 간단하게 부른다.

ggplot 스타일로 그래프가 그려집니다. KH바텍은 6월 한 달 동안 주가가 급등 후에 급락하는 패턴을 보이네요.

 

+ Recent posts