본문 바로가기

IT/파이썬 Python

파이썬으로 웹 데이터 가져오기 (Space X 예제)

오늘은 파이썬의 다양한 활용법 중 API를 통한 웹 데이터 가져오기를 설명해 보겠습니다.

코드는 아래와 같습니다.

import json
import requests
from urllib.parse import urljoin

class SpaceXData(object):

    def __init__(self, host='https://api.spacexdata.com', version='v3'):
        """
        Instantiate a new API client.
        Args:
            host (str): Hostname of the factomd instance.
            version (str): API version to use. This should remain 'v2'.

        """
        self.version = version
        self.host = host

        # Initialize the session.
        self.session = requests.Session()

    # Convenience method for building request URLs.
    @property
    def url(self):
        return urljoin(self.host, self.version)

    def handle_error_response(self, resp):
        print(resp)
        raise RuntimeError("Response code not 200 go check code")

    # Perform an API request.
    def _request(self, path, params=None):
        fullpath = self.url + '/' + path
        resp = self.session.request('GET', fullpath, params=params)

        # If something goes wrong, we'll pass the response
        # off to the error-handling code
        if resp.status_code >= 400:
            self.handle_error_response(resp)

        # Otherwise return the result dictionary.
        return resp.json()

    # API methods
    def get_launches(self, **kwargs):
        return self._request('launches/'.format(kwargs.get('path', '')), kwargs)


    def get_payloads(self, flight_number):
        """ Fetch Payloads """
        flight = self.get_launches(path='upcoming', flight_number=flight_number)[0]
        payloads = flight.get('rocket').get('second_stage').get('payloads')
        return payloads
    
    # return brief version of flight info (not used)
    def get_launches_brief(self):
        flights = self.get_launches()
        flight_info_items=['details','flight_number','is_tentative','launch_date_local','launch_date_unix','launch_date_utc','launch_site']
        launches_brief=[]
        for flight in flights:
            launch_brief={}
            for item in flight_info_items:
                launch_brief.update({item:flight.get(item)})
            launches_brief.append(launch_brief)
        return launches_brief 

위 예제는 일론 머스크의 유명한 우주기업 스페이스 엑스의 발사정보를 웹 API를 통해 가져오는 파이썬 클래스 입니다. 

먼저 클래스 컨스트럭터 부분 (def __init__ ) 에서는 웹 API 주소 정보를 define하고 있으며

이 클래스에서 가장 중요한 부분은 _request 메소드 부분입니다. 파이썬의 request 모듈 (https://requests.readthedocs.io/en/master/) 을 사용하여 API주소에 GET요청을 보내고 받은 결과를 resp 변수로 리턴하게 되어 있습니다.

get_launches_brief 메소드는 제가 추가한 부분인데, 지정된 항목 (flight_info_items 리스트) 에 포함된 항목만을 리턴할 수 있게 만들어 보았습니다.