호돌찌의 AI 연구소

 

# Load Library
> library(tidyverse)
> library(httr)
> library(rvest)
> library(jsonlite)

 

공공데이터 포털에서 발급받은 인증키를 복사한 다음 R 환경변수에 추가

# usethis::edit_r_environ()
## DATAGOKR_TOKEN = '자신의 인증키를 여기에 붙여넣기'
## 이제 '.Renviron' 파일을 저장한 다음 RStudio Restart Session

 

myKey에 R 환경변수를 지정

> myKey <- Sys.getenv('DATAGOKR_TOKEN')

 

활용가이드의 응답메시지 예제에서 요청 URI를 다음과 같이 분해하고 요청 URL 중 공통부분을 main에 할당

> main <- 'http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/'

# 오퍼레이션 네임을 별도로 할당 - 시군구별 실시간 평균 정보 조회 
> oper <- 'getCtprvnMesureSidoLIst'

 

 

HTTP 요청을 실행

활용가이드의 예시대로 실행하기! 인증키에 '%'가 있으면 더블인코딩이 발생하므로 I() 함수를 씌워주는 것 잊지 말기!

> res <- GET(url = str_c(main, oper), 
+            query = list(sidoName = '서울', 
+                         searchCondition = 'DAILY', 
+                         pageNo = 1,
+                         numOfRows = 600, # 600개 정도 뽑아보자 
+                         serviceKey = I(x = myKey)))
> # 응답 결과 확인
> print(x = res)
Response [http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getCtprvnMesureSidoLIst?sidoName=%EC%84%9C%EC%9A%B8&searchCondition=DAILY&pageNo=1&numOfRows=600&serviceKey=FHvHURIzcO%2FkrQmL4F5mHOB5a03BfiM6HSIhLKzpTpRWOrd6%2FrHVE%2BGh%2FMnqgHeapaV7UWPHcdZYRQ0iryS07g%3D%3D]
  Date: 2019-10-12 16:45
  Status: 200
  Content-Type: text/xml;charset=utf-8
  Size: 194 kB
<?xml version="1.0" encoding="UTF-8"?>




<response>
	<header>
		<resultCode>00</resultCode>
		<resultMsg>NORMAL SERVICE.</resultMsg>
	</header>

# 응답 바디를 텍스트로 출력합니다. 
> res %>% content(as = 'text') %>% cat()

													
													<item>
																	    <dataTime>2019-10-12 05:00</dataTime>
																	    <cityName>동대문구</cityName>
																	    <so2Value>-</so2Value>
																	    <coValue>-</coValue>
																	    <o3Value>-</o3Value>
																	    <no2Value>-</no2Value>
																	    <pm10Value>-</pm10Value>
																	    <pm25Value>-</pm25Value>
																	</item>
# (후략)

 

xml_nodes() 이용해서 몇개 잘 나오는지 확인해 보기

> # body의 items 하위 노드를 모두 지정합니다. 
> res %>% read_xml() %>% xml_node(css = 'items') -> items
> # 측정일시 
> items %>% xml_nodes(css = 'dataTime') %>% xml_text()
  [1] "2019-10-13 01:00" "2019-10-13 01:00" "2019-10-13 01:00" "2019-10-13 01:00"
  [5] "2019-10-13 01:00" "2019-10-13 01:00" "2019-10-13 01:00" "2019-10-13 01:00" (후략)

 

지금 까지 작업한 내용을 데이프레임으로 생성

> dfXml <- data.frame(
+   측정일시 = items %>% xml_nodes(css = 'dataTime') %>% xml_text(),
+   시군구 = items %>% xml_nodes(css = 'cityName') %>% xml_text(), 
+   아황산가스평균농도 = items %>% xml_nodes(css = 'so2Value') %>% xml_text(), 
+   일산화탄소평균농도 = items %>% xml_nodes(css = 'coValue') %>% xml_text(), 
+   오존평균농도 = items %>% xml_nodes(css = 'o3Value') %>% xml_text(), 
+   이산화질소평균농도 = items %>% xml_nodes(css = 'no2Value') %>% xml_text(), 
+   PM10 = items %>% xml_nodes(css = 'pm10Value') %>% xml_text(), 
+   PM25 = items %>% xml_nodes(css = 'pm25Value') %>% xml_text()
+   )
>

 

잘 들어갔는지 확인하기 위해 데이터프레임 출력

> dfXml %>% arrange(측정일시) %>% head()
          측정일시 시군구 아황산가스평균농도 일산화탄소평균농도 오존평균농도 이산화질소평균농도 PM10 PM25
1 2019-10-12 02:00 강남구              0.003                0.4        0.031              0.021   29   14
2 2019-10-12 02:00 강동구              0.002                0.4        0.027              0.019   29   18
3 2019-10-12 02:00 강북구              0.002                0.6        0.043              0.006   31   18
4 2019-10-12 02:00 강서구              0.004                0.4        0.033              0.012   27   17
5 2019-10-12 02:00 관악구              0.003                0.4        0.011              0.014    -    -
6 2019-10-12 02:00 광진구              0.002                0.5        0.036              0.011   24   15


> dfXml %>% arrange(측정일시) %>% tail()
            측정일시   시군구 아황산가스평균농도 일산화탄소평균농도 오존평균농도 이산화질소평균농도 PM10 PM25
595 2019-10-13 01:00 영등포구              0.002                0.2        0.034              0.011   16    8
596 2019-10-13 01:00   용산구              0.002                0.3        0.029              0.012   13    7
597 2019-10-13 01:00   은평구                  -                0.3        0.029              0.013   19    8
598 2019-10-13 01:00   종로구              0.003                0.4        0.024              0.012   18    6
599 2019-10-13 01:00     중구              0.003                0.3        0.026              0.017   15    7
600 2019-10-13 01:00   중랑구                  -                  -            -                  -    -    -

 

 

 

profile

호돌찌의 AI 연구소

@hotorch's AI Labs

포스팅이 도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!