반응형
오늘은 '서울열린데이터광장'에서 데이터를 가져와 가공하는 연습을 하겠습니다.
서울열린데이터광장?
- 서울열린데이터광장은 서울시 시정활동 과정에서 수집된 다양한 데이터를 공유하는 곳입니다.
- 누구나 무료로 데이터를 이용하고, 재사용할 수 있습니다. 데이터에 대한 라이선스 정보도 함께 게시하고 있습니다.
- 데이터 수집 및 가공하는 실습을 진행하기 너무나도 좋은 우리나라입니다. ㅎㅎㅎ
데이터 수집 전 필수로 할 일! 인증키 발급
- API로 데이터를 가져오기 위해서는 인증키가 꼭 있어야 합니다.
- 우선 우리가 실습할 데이터를 검색하겠습니다. 거기서 인증키를 발급받을 수 있어요!
- '서울시 공동주택 아파트 정보'를 검색합니다.
- 스크롤을 조금 내리다보면 Open API 항목이 보입니다. 클릭!
- 오른쪽 위에 '인증키 신청'을 누릅니다.
- 약관 동의 후, 필요 내용을 입력하고 '인증키 신청'을 누르면 바로 인증키를 부여받을 수 있습니다.
샘플데이터 가져오기(확인하기)
- 작업 파일에서 가상 환경에 접속한 후, jupyter lab을 실행시켰습니다.
- 다음과 같이 샘플 url이 정상적으로 작동하는 지 확인합니다. (인증키)자리에는 자신의 인증키를 입력합니다.
- 저는 Json 형태로 데이터를 수집할 것이기 때문에 xml을 json으로 바꾸겠습니다.
import requests
url= "http://openapi.seoul.go.kr:8088/(인증키)/Json/OpenAptInfo/1/5/"
req = requests.get(url)
print(req)
>>>
<Response [200]>
- [200]으로 응답하였으므로 우리는 데이터 수집을 잘 할 수 있습니다!!
- json 타입의 데이터를 불러옵니다.
json_df = req.json()
json_df
JSON 타입의 데이터를 데이터프레임으로 바꾸기
- pandas를 import한 후 다음과 같이 데이터프레임 타입으로 데이터의 타입을 바꿉니다. 그래야 우리가 가공하기 쉽겠죠?
import pandas as pd
apt = json_df['OpenAptInfo']['row']
data_1 = pd.DataFrame(apt)
print(data_1)
- 하지만 위의 url은 샘플url이어서 데이터가 5개밖에 되지 않습니다.
- 이제 명세서 다운로드 받아서 확인합니다. 명세서는 이 데이터에 대한 정보가 담겨있어서 데이터 가공할 때 꼭 참고해야 합니다.
- 그리고 데이터 요청은 한번에 최대 1000건을 넘길 수 없다고 합니다. 그렇다면 우리는 조건문을 사용하여 모든 데이터를 가져오도록 하겠습니다.
- url의 마지막 주소는 1/1000, 1001/2000, 2001/3000 이런 식으로 반복되어야 합니다. 그러면 다음과 같이 샘플을 만들어볼 수 있습니다.
import requests
import json
import pandas as pd
SERVICE_KEY = '(인증키)'
data = None
for j in range(1, 3):
url = f'http://openapi.seoul.go.kr:8088/{SERVICE_KEY}/Json/OpenAptInfo/{1+(j-1)*1000}/{j*1000}/'
print(url)
- 두 개의 url이 출력되었다면 이제 확장시켜보겠습니다.
진짜 데이터 가져오기!
- 다음과 같이 확인됩니다.
import requests
import json
import pandas as pd
SERVICE_KEY = '(인증키)'
data = None
for j in range(1, 4):
url = f'http://openapi.seoul.go.kr:8088/{SERVICE_KEY}/Json/OpenAptInfo/{1+(j-1)*1000}/{j*1000}/'
# print(url)
req = requests.get(url)
content = req.json()
con = content['OpenAptInfo']['row']
result = pd.DataFrame(con)
data = pd.concat([data, result])
data = data.reset_index(drop=True)
data.info()
데이터 가공하기
- 이제 맘대로 데이터를 가공하면 됩니다! 저도 제 맘대로 해보겠습니다.
- 우선 혹시 모를 일을 대비하여 복사본으로 하겠습니다.
data_apt = data.copy()
특정 column 삭제하기 (df.drop(labels = , axis= )
- 저는 삭제할 column을 drop_columns로 따로 표기하였습니다. 이렇게 하면 추가적으로 삭제할 열이 생기거나 할 때 유용합니다.(확장성!)
drop_columns = ['USE_RQSTDT', 'Y_CODE', 'X_CODE', 'EMPLYMINSRNC_MANAGE_NO', 'ATCH_FILE_ID', 'CN_APT', 'FXNUM', 'TELNO', 'APT_CODE', 'SN',
'HMPG', 'API_INSERT_DATE', 'API_UPDATE_DATE', 'ADRES_CITY', 'KAPTADDR', 'ADRES_RMNDR', 'ADRES_DORO', 'ADRES_DORO_RMNDR', 'USE_TY',
'HSHLD_ELCTY_CNTRCT_MTH', 'GNRL_MANAGECT_MANAGE_STLE', 'GUBUN', 'HSHLDR_TY', 'DOROJUSO']
data_apt_1 = data_apt.drop(labels = drop_columns, axis=1)
data_apt_1.head(2)
특정 column의 value값을 기준으로 데이터 재배열하기(df.sort_values(by=))
- ADRES_GU 컬럼은 서울의 각 구를 나타냅니다. 이것을 기준으로 데이터를 정리할 수 있습니다.
data_apt_2 = data_apt_1.sort_values(by='ADRES_GU').reset_index()
data_apt_2
column이름 바꾸기
col_list = ['아파트명', '단지분류', '시군구', '읍면동', '복도유형', '난방방식', '전체동수', '전체세대수', '시공사', '시행사',
'사용검사일~사용승인일', '연면적', '주거전용면적', '관리비부과면적', '세대현황(60m^2이하)', '세대현황(85m^2이하)', '세대현황(135m^2이하)',
'세대현황(135m^2초과)', '경비비관리형태', '청소비관리형태', '건축면적', '주차대수', '단지승인일', '관리비업로드']
data_apt_2.columns = col_list
data_apt_2
작업하면서 pandas와 더 친해져야함을 느끼네요. 다음 시간에도 함께 해요!
감사합니다!
'Python > Crawling' 카테고리의 다른 글
[Crawling]_Selenium 설치 확인하기 (0) | 2023.08.10 |
---|---|
[Crawling]_API를 이용하여 웹에서 정보 가져오기 (0) | 2023.08.07 |
[Crawling]_뉴스 타이틀만 가져올 수 있을까? (0) | 2023.08.06 |
[BeautifulSoup]_'아름다운 스프' 아니고 data를 가져오는 것? - find() (0) | 2023.08.06 |
[Crawling]_웹 페이지의 데이터를 가지고 올 수 있을까? (0) | 2023.08.04 |