https://open.assembly.go.kr/portal/data/service/selectServicePage.do?infId=OO1X9P001017YF13038&infSeq=1&isInfsPop=Y

 

열린국회정보

국회를 열다, 정보를 나누다.

open.assembly.go.kr

 

여기부터 필수인자를 어디서 구해오는지 알아야 한다.

국회의원 본 회의록을 API를 통해서 가져오려고 합니다.

그럼 API를 어떻게 가져오는 지 인자를 확인합니다.

 

기본인자와 요청인자의 타입 안에 형식과 필수 여부가 있는데 필수라고 적힌 데이터를 가져와야 합니다.

근데, 대수와 회의날짜는 어디에 있는 걸까요?

 

다른 api에서 찾아오면 됩니다.

 

https://open.assembly.go.kr/portal/data/service/selectServicePage.do?infId=ORDPSW001070QH19059&infSeq=1&isInfsPop=Y

 

열린국회정보

국회를 열다, 정보를 나누다.

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를 눈으로 확인하고 데이터를 어떻게 저장할지 결정해야 할 거 같습니다.

+ Recent posts