Loading...

Python / / 2022. 5. 2. 12:19

파이썬 6강. 데이터 수집 - 공공 데이터

반응형

 

API 데이터를 다운받을 때는 requests 라이브러리 설치가 필요하다.

python -m pip install requests

 

requests에서 get, post, update, delete를 모두 지원하고,

get 메서드에 url 주소만 넣어주면 데이터를 바로 받을 수 있다.

# 데이터 다운로드
# python -m pip install requests 라이브러리 다운로드
# Scripts 폴더 환경변수 잡으면 pip부터 할 수 있음

import requests

response = requests.get("http://apis.data.go.kr/1360000/TourStnInfoService/getCityTourClmIdx?serviceKey=dSHJNipMJz%2BPWTt9UN2qgExW7ql36lF%2BXp81YL%2FD42muatm7QP9jYJQSfIPMJ79C6NLitgJqd%2FGhRmY6U6YWwg%3D%3D&pageNo=1&numOfRows=10&dataType=JSON&CURRENT_DATE=2018123110&DAY=3&CITY_AREA_ID=5013000000")

# print(response)  # 헤더에 있는 status 상태코드
# print(type(response))  # 클래스 타입

# dict 검색 : response["키값"]
# class 검색 : response.객체연결
# print(response.text)  # 데이터를 문자열 그대로 읽음(통신 데이터)
# print(type(response.text))  # str 타입
# print(response.json())
# print(type(response.json()))  # dict 타입

datas = response.json()["response"]["body"]["items"]["item"]

for data in datas:
    print(data["doName"])

 

response를 text로 받으면 통신을 통해 문자열로 들어오는 데이터를 그대로 읽을 수 있고,

json( )으로 받으면 dict 타입으로 들어오게 된다.

 

API가 제공해주는 모든데이터를 클래스로 받을 필요는 없지만

한 건 한 건 item 데이터에 대한 클래스를 만들어두면 . 을 사용하여

접근이 가능하기 때문에 실수를 줄일 수 있다.

 

기능별로 파일을 분리해보면 다음과 같다.

 

실제 데이터를 담아서 클래스로 파싱 하기 weather.py ▼

class Weather:
    def __init__(self, tm, totalCityName, doName, cityName, cityAreaId, kmaTci, TCI_GRADE):
        self.tm = tm
        self.totalCityName = totalCityName
        self.doName = doName
        self.cityName = cityName
        self.cityAreaId = cityAreaId
        self.kmaTci = kmaTci
        self.TCI_GRADE = TCI_GRADE

    # 원래 타입 변환 라이브러리가 다 있음!!
    @staticmethod
    def dict_to_entity(data):
        weather = Weather(
            data["tm"],
            data["totalCityName"],
            data["doName"],
            data["cityName"],
            data["cityAreaId"],
            data["kmaTci"],
            data["TCI_GRADE"])

        return weather

 

url을 입력받아 필요한 데이터만 리턴해주기 http_provider.py ▼

# repository (X) provider(O)
# DAO가 아니고 access data는 provider!!

import requests as api

def get(url):
    response = api.get(url)
    if response.status_code == 200:
        # 파싱 시작(공공데이터에서만 사용할 수 있는 무적 코드!!)
        datas = response.json()["response"]["body"]["items"]["item"]
        return datas

 

호출하기 httpex02.py ▼

import http_provider as hp
from weather import Weather

datas = hp.get("http://apis.data.go.kr/1360000/TourStnInfoService/getCityTourClmIdx?serviceKey=dSHJNipMJz%2BPWTt9UN2qgExW7ql36lF%2BXp81YL%2FD42muatm7QP9jYJQSfIPMJ79C6NLitgJqd%2FGhRmY6U6YWwg%3D%3D&pageNo=1&numOfRows=10&dataType=JSON&CURRENT_DATE=2018123110&DAY=3&CITY_AREA_ID=5013000000")
# print(datas)  # 컬렉션

weathers = []

# 클래스로 파싱
for data in datas:
    weather = Weather.dict_to_entity(data)
    weathers.append(weather)

print(weathers[0].tm)

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형