열린국회정보
국회를 열다, 정보를 나누다.
open.assembly.go.kr


국회의원 본 회의록을 API를 통해서 가져오려고 합니다.
그럼 API를 어떻게 가져오는 지 인자를 확인합니다.
기본인자와 요청인자의 타입 안에 형식과 필수 여부가 있는데 필수라고 적힌 데이터를 가져와야 합니다.
근데, 대수와 회의날짜는 어디에 있는 걸까요?
다른 api에서 찾아오면 됩니다.
열린국회정보
국회를 열다, 정보를 나누다.
open.assembly.go.kr

열린 국회는 본회의 일정이라는 명시적인 이름으로 데이터를 제공합니다.
여기서 회의날짜를 가져오면 될 거 같습니다.

여기도 마찬가지로 대수가 나왔는데,
대수는 국회의원 대수고 예시에 맞춰서 '100022'면 22대 국회의원을 가져옵니다.
어디 나와있는 건 아닌데, 직관적으로 값을 넣어야 할 때도 있는 거 같습니다.
[STEP 1] 회의록 일정 가져오기
그럼 일정부터 json으로 저장하겠습니다.
import requests
from dotenv import load_dotenv
import json
import os
# 나중에 airflow에 추가되야 하는 코드
load_dotenv()
key = os.getenv("OPEN_GOVERMETN_API_KEY")
url = "https://open.assembly.go.kr/portal/openapi/nekcaiymatialqlxr"
params = {
"KEY" : key,
"Type" : 'json',
"pIndex" : '1',
"pSize" : "100",
"UNIT_CD" : "100022",
}
# 요청 받기
response = requests.get(url=url, params=params)
# json으로 저장 받기
file_path = 'congress_meeting/congress_schedule.json'
with open(file_path, 'w') as f:
json.dump(response.json(), f)
print(response.json())
[STEP 2] 본회의 기록 가져오기
이제 json을 저장했으니 다시 본 회의 회의록을 구하러 가봅시다~
받아온 json 안에서 국회 일정 리스트로 필수인자들을 가져오고
반복문을 통해서 다시 회의록이 담긴 json을 가져오면 됩니다~
import requests
from dotenv import load_dotenv
import os
import json
# 추후 dag로 변경될 필요 있음
load_dotenv()
key = os.getenv("OPEN_GOVERMETN_API_KEY")
def get_conf_dates():
# 국회 일정 리스트 가져오기
conf_date_list = []
with open("congress_meeting/congress_schedule.json" ,'r') as file:
schedule_file = json.load(file)
data_count = schedule_file['nekcaiymatialqlxr'][0]['head'][0]['list_total_count'] # 국회 일정 개수
for i in range(data_count):
conf_date_list.append(schedule_file['nekcaiymatialqlxr'][1]['row'][i]['MEETTING_DATE'])
return conf_date_list
def get_responses():
# 국회 회의록 가져오기
url = "https://open.assembly.go.kr/portal/openapi/nzbyfwhwaoanttzje"
conf_date_list = get_conf_dates()
for conf_date in conf_date_list:
print(f"데이터를 저장중입니다.{conf_date}")
params = {
"KEY" : key,
"Type" : 'json',
"pIndex" : '1',
"pSize" : "100",
"DAE_NUM" : "22",
"CONF_DATE" : conf_date
}
response = requests.get(url=url, params=params)
if response.status_code == 200:
with open (f"congress_meeting/meetings/{conf_date}.json",'w') as f:
json.dump(response.json(), f)
else:
print(response.text)
response.raise_for_status()
if __name__ == "__main__":
get_responses()
디렉토리를 하나 만들어서 json 파일들을 따르륵 저장해줍니다.
[STEP 3] pdfplumber로 URL에서 pdf 글자로 추출
이후에는 안에 pdf 파일들을 가져와서 pdfplumber를 사용해 글자만 가져옵니다.
pdf를 저장하지 않고 일단은 메모리를 통해 내용을 추출해옵니다.
import requests
import pdfplumber
import io
# PDF 다운로드 URL
url = "http://likms.assembly.go.kr/record/mhs-10-040-0040.do?conferNum=054706&fileId=0000124454&deviceGubun=P&imsiYn=P"
# HTTP 요청하여 PDF 다운로드
response = requests.get(url)
response.raise_for_status() # 오류 발생 시 예외 처리
# PDF 내용을 메모리에서 직접 읽기
with pdfplumber.open(io.BytesIO(response.content)) as pdf: # 반면, io.BytesIO를 사용하면 메모리에서 직접 처리할 수 있어 더 효율적입니다.
for page in pdf.pages:
print(page.extract_text()) # 페이지별 텍스트 출력
# 이후에는 이 내용을 어떻게 저장할지 데이터베이스로 만들어야 함
이렇게 하면 저장된 데이터에 pdf를 읽어올 수 있고 이를 반복문으로 json 파일에서 읽게 해오면 됩니다.
[STEP 4] URL에서 PDF 추출 후 데이터베이스에 적재
근데 어떻게 해야 데이터를 효율적으로 저장할 수 있을 지 고민이 됩니다.
1. full text
2. csv or json
3. elastic search
가장 사용해보고 싶은 방식은 elastich search로 가져오고 싶습니다.
왜냐하면 국회의원 별로 어떤 발언을 했는 지 요약을 하기 위함입니다.
elastic search에 역색인을 통해서 국회의원 발언을 검색해서 국회의원 별 발언을 정리해보고 싶습니다.
그래서 데이터베이스를 어떤 모양으로 만들어야 할지가 관건입니다.
국회의원만 있으면 데이터가 처리되는지 국회의 진행방식과 pdf를 눈으로 확인하고 데이터를 어떻게 저장할지 결정해야 할 거 같습니다.
'Personal Project > 국회의원 분석 프로젝트' 카테고리의 다른 글
| python 프로젝트에서 상위 디렉토리 모듈 절대 참조 (0) | 2025.02.10 |
|---|---|
| 국회의원 회의록 정규식으로 구분하기, docker를 이용해 elastic search로 설치, 저장하기, 오류 해결하기 (0) | 2025.02.02 |
| 국회의원 공약 가져오기 api 에러 - "resultMsg": "데이터 정보가 없습니다. 입력 파라미터값을 확인해주시기 바랍니다." (0) | 2025.01.25 |
| 공공 api 읽어온 후 json 파일 csv로 전환한 후 저장하기 - python (0) | 2025.01.22 |
| 공공 api로 국회의원 코드 읽어오기 - python (0) | 2025.01.20 |