[개발이야기] 표준국어대사전 API 사용해서 크롤링하기

"블루펭귄 개발 과정"

Posted by 이즈 on October 31, 2019

블루펭귄 개발 과정

주식회사 와들의 첫 iOS 앱인 블루펭귄을 개발하는 과정을 담은 글이다.

표준국어대사전 api 사용해서 크롤링하기

개발을 하다 사전을 만들 일이 생긴다면, 꼭 표준국어대사전 크롤링이 선행돼야 한다.
이번 시간에는 표준국어대사전을 크롤링 해보겠다.

오픈 api가 새로 생겼어요!

https://stdict.korean.go.kr/openapi/openApiInfo.do
짜쟌! 오픈 api가 새로 생기며 크롤링하기 너무 편해졌다.
그럼 한번 따라가보자.


1. 홈페이지에서 키 발급을 받는다

위의 링크에 들어가서, 오픈 API 사용 신청 버튼을 누른다.
회원가입을 하고, 키를 발급받는다.

키를 발급받은 사진

앞으로 나오는 예시에서는 키를 0123456789로 대체하겠다.

2. 파이썬으로 크롤링을 시작해보자

먼저, 크롤링을 하기 위한 라이브러리를 설치해야한다.
urlopen과, BeautifulSoup을 사용하자.
처음 사용한다면 pip이나 easy-install 등을 이용해 먼저 컴퓨터에 설치하자

1
2
from urllib.request import urlopen   
from bs4 import BeautifulSoup
3. 크롤링으로 원하는 단어를 뽑아내자

표준국어대사전을 크롤링하는 방법은 크게 두가지 방법이 있을 것이다.
1) 원하는 단어 검색해서 크롤링하기
2) 모든 단어 중 원하는 조건의 단어만 크롤링하기
차례차례 살펴보자

3-1. 원하는 단어 검색해서 크롤링하기

나무를 검색하고 싶을 때는 다음과 같이 넣는다

1
2
page = urlopen("https://stdict.korean.go.kr/api/search.do?key=0123456789&q=나무")  
#key값은 따로 변경하세요
3-2. 모든 단어 중 원하는 조건의 단어만 크롤링하기

각 단어마다 고유한 번호가 있고 가나다순을 따른다. (맨 뒤로 가면 속담 등이 나옴)
또한 단어는 약 50만개 정도 존재한다.
100번째 단어를 찾고 싶을 때는 다음과 같이 넣는다

1
2
page = urlopen("https://stdict.korean.go.kr/api/view.do?key=0123456789&method=TARGET_CODE&q=100")  
#key값은 따로 변경하세요

그 중 2번에 집중해서 살펴보겠다. 2번을 끝낸다면 1번은 더 쉽다.
모든 단어 중, 나는 ‘word’, ‘conjugation’, ‘abbreviation’에 있는 단어 명들만 뽑았다.

1
2
3
4
5
6
7
8
9
10
11
for i in range(1, 550000):
    print(i)
    page = urlopen("https://stdict.korean.go.kr/api/view.do?key=0123456789&method=TARGET_CODE&q="+str(i)) #key값은 따로 변경하세요
    document = page.read()
    page.close()

    soup = BeautifulSoup(document, 'html.parser')

    questions_list = soup.find_all("word")
    questions_list2 = soup.find_all("conjugation")
    questions_list3 = soup.find_all("abbreviation")
4. 뽑아낸 단어를 저장하자

나는 텍스트 파일에 단어를 저장하였다.
텍스트 파일을 열고, 단어를 저장하고, 텍스트 파일을 닫는 형태로 진행된다.
그러나 3번 과정에서 뽑은 단어에는, 발음 기호가 포함돼있어 이를 빼주는 과정도 필요하다

파일을 여는 코드

1
f = open('kr.txt', 'a')

단어를 저장하는 코드

1
2
3
4
5
6
def write(before):
    if before is not None:        
        before = before.replace("-","")
        before = before.replace("^","")
        after = before.replace(":","")
        f.write(after+'\n')

파일을 닫는 코드

1
f.close()
5. 완성된 코드

이 코드를 합치면 다음과 같다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from urllib.request import urlopen
from bs4 import BeautifulSoup

f = open('kr.txt', 'a')

def write(before):
    if before is not None:        
        before = before.replace("-","")
        before = before.replace("^","")
        after = before.replace(":","")
        f.write(after+'\n')

for i in range(1, 550000):
    page = urlopen("https://stdict.korean.go.kr/api/view.do?key=0123456789&method=TARGET_CODE&q="+str(i)) #key값은 따로 변경하세요
    document = page.read()
    page.close()

    soup = BeautifulSoup(document, 'html.parser')

    questions_list = soup.find_all("word")
    questions_list2 = soup.find_all("conjugation")
    questions_list3 = soup.find_all("abbreviation")

    for question in questions_list:
        write(question.get_text())
        
    for question in questions_list2:
        write(question.get_text())
        
    for question in questions_list3:
        write(question.get_text())

f.close()
6. 참고

참고로 50만번의 크롤링을 직렬로 하려면 너무 많은 시간이 든다.
나는 10만 단위로 kr1, kr2, kr3, kr4, kr5 파일에 나누어 저장했다.
이렇게 한다면 크롤링하는데 드는 시간을 1/5로 줄일 수 있다.


많은 사람에게 도움이 되길 바라며, 이렇게 첫 게시글을 마무리하겠다.