법령 API 불러오기 크롤링 코드

데이터에 대한 모든 것·2022년 4월 18일
0

법령 리스트 조회 Code

import pandas as pd
import xml.etree.ElementTree as ET
from urllib.request import urlopen
from tqdm import trange

# xml url 불러오기
url = "http://www.law.go.kr/DRF/lawSearch.do?OC=ngho1202&target=law&type=XML"
# urlopen을 활용하여 url 불러오기
response = urlopen(url).read()
# ET.fromstring을 통해 전체 불러오기
xtree = ET.fromstring(response)
# 전체 법령 개수 불러오기
totalCnt = int(xtree.find('totalCnt').text)

page = 1
rows = []

for i in trange(int(totalCnt / 20)):

    for node in xtree:
        try:
            법령일련번호 = node.find('법령일련번호').text
            현행연혁코드 = node.find('현행연혁코드').text
            법령명한글 = node.find('법령명한글').text
            법령약칭명 = node.find('법령약칭명').text
            법령ID = node.find('법령ID').text
            공포일자 = node.find('공포일자').text
            공포번호 = node.find('공포번호').text
            제개정구분명 = node.find('제개정구분명').text
            소관부처코드 = node.find('소관부처코드').text
            소관부처명 = node.find('소관부처명').text
            법령구분명 = node.find('법령구분명').text
            소관부처명 = node.find('소관부처명').text
            시행일자 = node.find('시행일자').text
            자법타법여부 = node.find('자법타법여부').text
            법령상세링크 = node.find('법령상세링크').text

            rows.append({'법령일련번호': 법령일련번호,
                        '현행연혁코드': 현행연혁코드,
                        '법령명한글': 법령명한글,
                        '법령약칭명': 법령약칭명,
                        '법령ID': 법령ID,
                        '공포일자': 공포일자,
                        '공포번호': 공포번호,
                        '제개정구분명': 제개정구분명,
                        '소관부처코드': 소관부처코드,
                        '소관부처명': 소관부처명,
                        '소관부처코드': 소관부처코드,
                        '법령구분명': 법령구분명,
                        '시행일자': 시행일자,
                        '자법타법여부': 자법타법여부,
                        '법령상세링크': 법령상세링크})
            
            print(rows)
        except Exception as e:
            continue
            
    page += 1
    url = "http://www.law.go.kr/DRF/lawSearch.do?OC=ngho1202&target=law&type=XML&page={}".format(page)
    response = urlopen(url).read()
    xtree = ET.fromstring(response)
    
cases = pd.DataFrame(rows)
cases.to_csv('./cases.csv', index=False)

법령 조문 조회 Code

import pandas as pd
import xml.etree.ElementTree as ET
from urllib.request import urlopen
from tqdm import trange
import re

#앞서 본문 리스르 뽑아온 csv파일을 불러오는 단계
law_list = pd.read_csv("C:\\Users\\user\\Desktop\\2022-1학기\\졸업작품\\APICrawling\\law_list.csv", encoding="cp949")

#조문단위에서 뽑아올 XML요소 정리
contents = ['조문번호','조문가지번호','조문여부','조문제목','조문시행일자',
            '조문이동이전','조문이동이후','조문변경여부','조문제개정유형',
            '조문내용','조문참고자료','항']

sub_dict = {}
rows = []

def remove_tag(content):
    cleaned_text = re.sub('<.*?>', '', content)
    return cleaned_text

for i in trange(len(law_list)):
    #각 법령에 접근하기 위해 URL을 지정해주는 부분
    url = "https://www.law.go.kr"
    link = law_list.loc[i]['법령상세링크'].replace('HTML', 'XML')
    url += link
    response = urlopen(url).read()
    xtree = ET.fromstring(response)
    
    #print(url)
    #print(xtree[1][0].attrib['조문키'])
    
    # 각 법령에 접근 후 조문 읽어오기
    # len(xtree[1]) 은 조문단위의 수 만큼 접근
    for n in range(len(xtree[1])):
        sub_dict['조문키'] = xtree[1][n].attrib["조문키"]
        # contents는 조문단위의 구성 XML 요소들
        for content in contents:
            dict_key = content
            try:
                dict_value = xtree[1][n].find(content).text
                # sub_row.append({f'{dict_key}':f'{dict_value}'})
                
                # content_tmp = xtree[1][n].find(content).text
                # 내용이 존재하지 않는 경우 None 타입이 반환되기 때문에 이를 처리해줌
                '''
                if dict_value is None:
                    dict_value = '내용없음'
                else:
                    dict_value = remove_tag(dict_value)
                '''    
                # rows.append({"{}:{}".format(content, content_tmp)})
            except:
                continue
            sub_dict[dict_key] = dict_value
        rows.append(sub_dict)    
        sub_dict = {}
    
    #파일이름을 법령명으로 하기 위한 부분
    file_name = law_list.loc[i]['법령명한글']
    path_format = './법령별/{0}.csv'.format(file_name)
    
    each_law_content = pd.DataFrame(rows)
    each_law_content.to_csv(path_format, index=False)
    
    rows = []
profile
좋은 서비스는 좋은 데이터로부터 나온다 :)

0개의 댓글