[STEP 1 ]우선 공공 api에 회원가입 후 선거 공약 정보를 활용 신청한다. 

그다음 스크롤을 내리면 필수적으로 얻어야 하는 정보들을 볼 수 있다.

추가로 얻어야 하는 params 정보는 선거ID, 선거 종류 코드 후보자 ID

왜 필수 데이터를 어디서 받아와야 하는지 항목 설명에 적지 않았지?

 

[STEP : 2] 중앙선거 관리위원회 코드정보 데이터를 받아온다.

 

 

[STEP : 3]api를 통해 내용을 읽어오는 코드를 확인한다.

 

나는 dotenv를 통해서 .env에 인증키를 넣고 load_dotenv()로 읽어오는 방식을 사용해서 데이터를 숨겨서 가져왔다.

params에 들어가는 데이터는 decoding된 암호키를 읽어와야 request를 받을 수 있다.

 

이를 통해서 json 키를 읽어올 수 있다.

import requests
from dotenv import load_dotenv
import os

def api_test(url,params):
response = requests.get(url, params=params)

if response.status_code == 200:
print(response.content)
else:
print(f"Error Code :{response.status_code}")

if __name__ == "__main__":
 
load_dotenv()
serviceKey = os.getenv("GONGGONG_API_KEY")
 
# 공공데이터 국회의원 선거공약정보
pledge_params ={'serviceKey' : serviceKey, 'resultType' : 'json', 'pageNo' : '1', 'numOfRows' : '10', 'sgId' : '20231011', 'sgTypecode' : '4', 'cnddtId' : '1000000000' }
 
# 공공데이터 국회의원 선거공약정보확인을 위한 코드 정보
govcode_params = {'serviceKey' : serviceKey, 'resultType' : 'json'}
 
api_test(govcode_url,params=govcode_params)


 

이걸 통해 print를 확인하면 

 

b'{"response":{"header":{"resultCode":"INFO-00","resultMsg":"NORMAL SERVICE"},"body":{"items":{"item":[{"num":"1","sgId":"19920324","sgName":"\xec\xa0\x9c14\xeb\x8c\x80 \xea\xb5\xad\xed\x9a\x8c\xec\x9d\x98\xec\x9b\x90\xec\x84\xa0\xea\xb1\xb0","sgTypecode":"0","sgVotedate":"19920324"},{"num":"2","sgId":"19920324","sgName":"\xea\xb5\xad\xed\x9a\x8c\xec\x9d\x98\xec\x9b\x90\xec\x84\xa0\xea\xb1\xb0","sgTypecode":"2","sgVotedate":"19920324"},{"num":"3","sgId":"19921218","sgName":"\xec\xa0\x9c14\xeb\x8c\x80 \xeb\x8c\x80\xed\x86\xb5\xeb\xa0\xb9\xec\x84\xa0\xea\xb1\xb0","sgTypecode":"0","sgVotedate":"19921218"},{"num":"4","sgId":"19921218","sgName":"\xeb\x8c\x80\xed\x86\xb5\xeb\xa0\xb9\xec\x84\xa0\xea\xb1\xb0","sgTypecode":"1","sgVotedate":"19921218"},{"num":"5","sgId":"19960411","sgName":"\xec\xa0\x9c15\xeb\x8c\x80 \xea\xb5\xad\xed\x9a\x8c\xec\x9d\x98\xec\x9b\x90\xec\x84\xa0\xea\xb1\xb0","sgTypecode":"0","sgVotedate":"19960411"},{"num":"6","sgId":"19960411","sgName":"\xea\xb5\xad\xed\x9a\x8c\xec\x9d\x98\xec\x9b\x90\xec\x84\xa0\xea\xb1\xb0","sgTypecode":"2","sgVotedate":"19960411"},{"num":"7","sgId":"19971218","sgName":"\xec\xa0\x9c15\xeb\x8c\x80 \xeb\x8c\x80\xed\x86\xb5\xeb\xa0\xb9\xec\x84\xa0\xea\xb1\xb0","sgTypecode":"0","sgVotedate":"19971218"},{"num":"8","sgId":"19971218","sgName":"\xeb\x8c\x80\xed\x86\xb5\xeb\xa0\xb9\xec\x84\xa0\xea\xb1\xb0","sgTypecode":"1","sgVotedate":"19971218"},{"num":"9","sgId":"20000413","sgName":"\xec\xa0\x9c16\xeb\x8c\x80 \xea\xb5\xad\xed\x9a\x8c\xec\x9d\x98\xec\x9b\x90\xec\x84\xa0\xea\xb1\xb0","sgTypecode":"0","sgVotedate":"20000413"},{"num":"10","sgId":"20000413","sgName":"\xea\xb5\xad\xed\x9a\x8c\xec\x9d\x98\xec\x9b\x90\xec\x84\xa0\xea\xb1\xb0","sgTypecode":"2","sgVotedate":"20000413"}]},"numOfRows":10,"pageNo":1,"totalCount":179}}}'

 

위와 같은 읽을 수 없는 b로 시작하는 바이너리 코드를 만날 수 있다. 이를 UTF-8로 디코딩 하거나 JSON으로 파싱하면 확인할 수 있다.

[STEP : 4] request한 데이터를 json 형태의 양식으로 확인하게 하는 코드를 작성한다.

import requests
from dotenv import load_dotenv
import json
import os

def api_test(url,params):
response = requests.get(url, params=params)

if response.status_code == 200:
print(json.loads(response.content))
else:
print(f"Error Code :{response.status_code}")

if __name__ == "__main__":
 
load_dotenv()
serviceKey = os.getenv("GONGGONG_API_KEY")
 
# 공공데이터 국회의원 선거공약정보
pledge_params ={'serviceKey' : serviceKey, 'resultType' : 'json', 'pageNo' : '1', 'numOfRows' : '10', 'sgId' : '20231011', 'sgTypecode' : '4', 'cnddtId' : '1000000000' }
 
# 공공데이터 국회의원 선거공약정보확인을 위한 코드 정보
govcode_params = {'serviceKey' : serviceKey, 'resultType' : 'json'}
 
api_test(govcode_url,params=govcode_params)

 

{'response': {'header': {'resultCode': 'INFO-00', 'resultMsg': 'NORMAL SERVICE'}, 'body': {'items': {'item': [{'num': '1', 'sgId': '19920324', 'sgName': '제14대 국회의원선거', 'sgTypecode': '0', 'sgVotedate': '19920324'}, {'num': '2', 'sgId': '19920324', 'sgName': '국회의원선거', 'sgTypecode': '2', 'sgVotedate': '19920324'}, {'num': '3', 'sgId': '19921218', 'sgName': '제14대 대통령선거', 'sgTypecode': '0', 'sgVotedate': '19921218'}, {'num': '4', 'sgId': '19921218', 'sgName': '대통령선거', 'sgTypecode': '1', 'sgVotedate': '19921218'}, {'num': '5', 'sgId': '19960411', 'sgName': '제15대 국회의원선거', 'sgTypecode': '0', 'sgVotedate': '19960411'}, {'num': '6', 'sgId': '19960411', 'sgName': '국회의원선거', 'sgTypecode': '2', 'sgVotedate': '19960411'}, {'num': '7', 'sgId': '19971218', 'sgName': '제15대 대통령선거', 'sgTypecode': '0', 'sgVotedate': '19971218'}, {'num': '8', 'sgId': '19971218', 'sgName': '대통령선거', 'sgTypecode': '1', 'sgVotedate': '19971218'}, {'num': '9', 'sgId': '20000413', 'sgName': '제16대 국회의원선거', 'sgTypecode': '0', 'sgVotedate': '20000413'}, {'num': '10', 'sgId': '20000413', 'sgName': '국회의원선거', 'sgTypecode': '2', 'sgVotedate': '20000413'}]}, 'numOfRows': 10, 'pageNo': 1, 'totalCount': 179}}}

 

원하는 결과가 나왔다.

 

이제 이 코드를 확인해서 데이터를 전처리 하고 당선인 정보를 확인한 뒤 선거 공약 정보를 추가할 수 있게 되었다.

 


결론 

공공 api를 request 하기 위해서는 params의 값을 추가해줘야 한다.

 

그 때 공공키는 디코딩된 암호를 추가해야 하고 받은 request는 바이너리 형태로 오기 때문에 json.load를 하거나 utf-8로 디코딩 해야 되는데 json 형식으로 저장하기 위해 json.load로 데이터를 저장하면 된다.

 

추가로 json으로 저장하는 코드를 작성하고 데이터를 확인해서 다른 api에 어떤 param으로 들어가야 하는지 추가 작업을 하면 될 거 같다.

+ Recent posts