본문 바로가기
데이터분석

[데이터 분석] 오픈 API를 통한 데이터 수집 : 행정안전부_소방서위치조회서비스

by CodingKwon 2021. 6. 30.

[오픈 API를 통한 데이터 수집]

서울시 지역구 별 소방서 개수 구하기

소방서 위치 조회서비스 이용하기

https://www.data.go.kr/dataset/15000933/openapi.do

(1) 필요 라이브러리 불러오기

from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
import pandas as pd

(2) open_api 요청 테스트

serviceKey = '일반 인증키(Encoding)'
url = 'http://openapi.safekorea.go.kr/openapi/service/firestation/item?'
api_url = url + 'serviceKey=' + serviceKey + '&firestation_addr_cd=3011000000'
api_url

(3) 가져온 XML 데이터 파싱

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
request = Request(api_url, headers=headers)
response = urlopen(request)
html = response.read()
soup = BeautifulSoup(html, 'html.parser')
addr = soup.select('addrNm')
name = soup.select('facilityName')
fax = soup.select('fax')
lat = soup.select('latitude')
long = soup.select('longitude')
tel = soup.select('tel')
data_t = []

for i in range(len(addr)):
    temp = []
    temp.append(addr[i].text)
    temp.append(name[i].text)
    temp.append(fax[i].text)
    temp.append(lat[i].text)
    temp.append(long[i].text)
    temp.append(tel[i].text)
    data_t.append(temp)

col = ['주소', '이름', '팩스', '위도', '경도', '전화번호']
data = pd.DataFrame(data_t, columns=col)
data.to_csv('sobang.csv', index=False)
print('성공')
성공

(4) 서울시 지역구 법정코드 불러오기

codelist = pd.read_csv('codelist.csv', encoding='euckr')
codelist['법정동 코드']

첫번째에 있는 법정동 코드 가져오기(서울시 종로구)

url = 'http://openapi.safekorea.go.kr/openapi/service/firestation/item?'
api_url_b = url + 'serviceKey=' + serviceKey + '&firestation_addr_cd=' + str(codelist['법정동 코드'][1])
api_url_b

반복문을 활용해 한번에 API 요청하기

data_b = []

for i in range(len(codelist['법정동 코드'])):
    url = 'http://openapi.safekorea.go.kr/openapi/service/firestation/item?'
    api_url_b = url + 'serviceKey=' + serviceKey + '&firestation_addr_cd=' + str(codelist['법정동 코드'][i])

    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
    request = Request(api_url_b, headers=headers)
    response = urlopen(request)
    html = response.read()
    soup = BeautifulSoup(html, 'html.parser')

    addr = soup.select('addrNm')
    name = soup.select('facilityName')
    fax = soup.select('fax')
    lat = soup.select('latitude')
    long = soup.select('longitude')
    tel = soup.select('tel')

    for j in range(len(addr)):
        temp = []
        temp.append(addr[j].text)
        temp.append(name[j].text)
        temp.append(fax[j].text)
        temp.append(lat[j].text)
        temp.append(long[j].text)
        temp.append(tel[j].text)
        data_b.append(temp)

col = ['주소', '이름', '팩스', '위도', '경도', '전화번호']
data = pd.DataFrame(data_b, columns=col)
data.to_csv('sobang_b.csv', index=False)
print('성공')
성공

댓글