ITStudy/Python

[Python] urllib로 웹 데이터 핸들링 with DART

Todays Goal 2021. 1. 31. 23:56
728x90
반응형

오늘은 파이썬 라이브러리 중 웹 데이터를 핸들링 할 수 있는 urllib에 대해서 알아보고자 합니다.

urllib 중 urllib.request 모듈과 urllib.parse 모듈을 사용하여 간단하게 웹 페이지에 데이터를 요청하고 저장해보도록 하겠습니다.

오늘 사용할 예는 금융감독원에서 운영하고 있는 전자공시시스템(DART; Data Analysis, Retrieval and Transfer System)의 RSS를 통해 사용해 보도록 하겠습니다.

 

1. RSS 

  RSS는 Rich Site Summary의 줄임말로 사이트에 직접 방문할 필요없이 RSS 리더를 활용하여 최신 정보를 활용할 수 있도록 해주는 콘텐츠입니다.

  DART에서는 RSS 리더를 통해 최근공시 혹은 회사별 공시를 확인 할 수 있도록 정보를 제공하고 있습니다. 

  오늘 할 예제는 RSS 리더를 만드는 게 아니라 단순히 해당 웹 페이지를 보는 것만을 해보도록하겠습니다.

DART RSS (출처: http://dart.fss.or.kr/)

 

2. urllib.request

  urllib.request는 웹을 열어서 데이터를 읽어오는 역할을 하는 모듈입니다.

#ln 1: urllib.request 모듈 import 
import urllib.request

#ln 2: DART 최근공시
url = "http://dart.fss.or.kr/api/todayRSS.xml"
#ln 3: DART 최근공시 url을 엽니다.
url_open = urllib.request.urlopen(url)
#ln 4: url이 정상적으로 오픈되었는지 HTTP 상태코드 출력. 성공 시 200
print(url_open.status)     
#ln 5: DART 최근공시를 데이터를 data에 할당합니다.
data = url_open.read()    
#ln 6: data의 정보를 사람이 식별할 수 있도록 decode 해줍니다.
text=data.decode(“utf-8”)     

ln 3 > print(url_open)을 실행할 시  할당된 정보를 확인하면 http로 시작되는 정보를 확인 할 수 있습니다.

<http.client.HTTPResponse object at 0x0000023F92e71550>

 

ln 5 > print(data)을 실행할 시 아래와 같은 식별이 불가능한 내용이 출력되는 것을 볼 수 있습니다.

     텍스트의 시작이 'b'로 시작되는 걸 확인할 수 있고 이는 바이너리 파일이라는 것을 의미하고 이를 식별하기 위해서는 decode를 통해 사람이 식별할 수 있도록 변경해 주는 과정이 필요합니다.

b'\r\n\r\n \r\n\r\n http://dart.fss.or.kr\r\n \xeb\x8f\x99 \xed\x9a\x8c\xec\x82\xac\xeb\x8a\x94 \xec\xa1\xb4\xec\x9e\xac\xed\x95\x98\xec\xa7\x80 \xec\x95\x8a\xeb\x8a\x94 \xed\x9a\x8c\xec\x82\xac\xec\x9e\x85\xeb\x8b\x88\xeb\x8b\xa4.\r\n ko\r\n DART\r\n Sun, 31 Jan 2021 14:04:54 GMT\r\n DART\r\n 2021-01-31T14:04:54Z\r\n ko\r\n DART\r\n \r\n\r\n\r\n'

 

  ln 6 > print(text)을 실행할 시 아래와 같은 결과를 확인 할수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>DART : 최근공시</title>
    <link>purl.org/dc/elements/1.1/"dart.fss.or.kr</link>
    <description>DART 전자공시 시스템 - 최근 공시 정보를 제공합니다.</description>
    <language>ko</language>
    <copyright>DART</copyright>
    <pubDate>Sun, 31 Jan 2021 14:14:19 GMT</pubDate>
    <dc:creator>DART</dc:creator>
    <dc:date>2021-01-31T14:14:19Z</dc:date>
    <dc:language>ko</dc:language> 
     <dc:rights>DART</dc:rights>
  </channel>
</rss>

 

3. urllib.parse

  urllib.parse는 URL과 그 파라미터를 다루는데 활용할 수 있습니다.

#ln 1: URL을 인코딩하기 위해 모듈을 불러옵니다.
import urllib.request
import urllib.parse

#ln 2:urllib.parse 활용
url = 'dart.fss.or/kr/api/companyRSS.xml'      # DART 회사별 공시
value = { 'crpCd':'00126380' }     # GET방식으로 불러올 회사의 코드를 딕셔너리 형태로 삽입; "삼성전자: 00126380"
params = urllib.parse.urlencode(value)     # HTML 파라미터 형식으로 인코딩 해줍니다.
url_open = url + "?" + params     # url에 파라미터를 붙여이고 변수에 할당합니다.
#ln 3: urlparse는 URL의 6개 구성요소를 반환해줍니다.
urllib.parse.urlparse(url_open)

#ln 4: # DART 최근공시를 데이터를 data에 할당합니다.
data = urllib.request.urlopen(url_open).read()     
#ln 5: data의 정보를 사람이 식별할 수 있도록 decode 해줍니다.
text=data.decode(“utf-8”)     

 

  ln 3 > urllib.parse.urlparse(url_open)의 출력결과는 아래와 같습니다.

    GET방식의 쿼리 파라미터가 나타나는 것을 볼 수 있습니다. 해당 부분에 들어갈 정보가 변경될 시 다른 회사의 공시를 확인 할 수 있습니다.

ParseResult(scheme='http', netloc='dart.fss.or', 'path='/kr/api/companyRSS.xml', params='', query='crpCd=00126380', fragment='')

 

이어서 BeautifulSoup를 포함하여 웹 데이터를 분석하는 방법이 궁금하신 분은 아래의 링크를 이용해 주시기 바랍니다.

BeautifulSoup로 웹 데이터 분석 with DART

 

이상 웹 핸들링을 위한 urllib 라이브러리를 간략하게 알아봤습니다.

728x90
반응형