본문 바로가기

Python/Crawler

네이버 블로그를 크롤링하여 단어 빈도 분석하기

처음 이 생각을 한 계기는 깔리고 깔린 바이럴 마케팅을 피해 검색해보고 싶어서였다. 우리 동네 맛집이라고 검색하면 내가 뻔히 가본 곳인데도 (맛집이 아닌데도) 상위 목록에 맛집이라고 도배가 되어 있는 것을 흔하게 볼 수 있다. 그런 결과가 검색 품질을 떨어뜨리고 정보에 선택에 있어서 나쁜 영향을 미친다는 것을 어지간한 사람이면 다 알것이다. 그래서 단어 빈도를 알아내, 너무 많은 단어는 제외하여 서치할 수 있도록 도움을 주는 방식을 생각해보았다.

1. 블로그 크롤링하기

블로그 크롤링은 어렵지 않다. 물론 검색 단어의 블로그 검색 결과(포스팅) 전체를 크롤링하는 것은 쉬운 일이 아니다. 하지만 나는 검색단어 주변에 있는 글자만 검색하면 됐고 이는 미리보기 식으로 제공하는 내용 3줄로도 충분하다.
이유는 블로거들의 대부분이 핵심 단어 근처에 원하는 정보를 심어놓기 때문이다. 그렇다면 나도 원하는 정보만큼만 걸러주면된다.

킹크랩의 검색 결과를 얻고 싶다면 dd의 blog_passgae만 몽땅 크롤링하게 하면 된다. 또한 1개월 이내의 정보만 검색하게 하였다. 1년 전 자료는 그렇게 썩 필요가 없기 때문이다.

필요한 url은 이렇게 표현된다.

url = 'https://search.naver.com/search.naver?where=post&query='
temp_url = url + parse.quote(k) + '&sm=tab_opt&date_option=4&start=' + str(num)

k = keyword
date_option = 검색 할 데이터의 기간(정해져 있음)
num = 검색 결과의 몇 번째를 보여줄 것인지

한 페이지에 10개씩 나타나고 1부터 시작하므로
11121 식으로 넘어가게 하면 된다.

크롤링 코드는 다음과 같다

def searchOnePage(url):
    req = urllib.request.Request(url)
    sourcecode = urllib.request.urlopen(url).read()
    soup = BeautifulSoup(sourcecode, "html.parser")

    for n in soup.find_all('dd','sh_blog_passage'):
        blog_list.append(n.get_text())

    return blog_list

url만 포문으로 잘 돌려서 전달해주면 크롤링이 잘 된다.
결과는 다음과 같다.

2. 크롤링한 데이터 전처리하기

나타난 결과를 단어단위로 쪼개기 이전에 해주어야 할 일이 있다. 바로 특수문자를 제거해주는 것이다. 이는 re를 이용해 손쉽게 할 수 있다.

 import re

 for n in list :
    n = re.sub('[\{\}\[\]\/?.,;:|\)*~`!^\-_+<>@\#$%&\\\=\(\'\"]','',n)

list 안에 검색 결과 한 건 한 건이 배열로 들어가 있으므로 배열마다 검색해주어서 삭제해주면된다.

잘 삭제된 것을 알 수 있다.

이후 konlpy를 이용해 토큰화해준다. 이 라이브러리를 만든 분들은 평생 한 달에 한 번씩 로또 1등이 되어야 한다.

from konlpy.tag import Okt
okt = Okt()
okt.nouns(n)
okt.morphs(n)


토큰화를 할 때 어떻게 나눠줄지 생각하고 진행한다. 나는 두 가지 다 해보았다.

그리고 keyword를 stop word를 사용해서 제거해준다. 우리는 검색한 단어를 또 볼 필요가 없다.

stop_words = [keyword, '이', '에', '을', '가', '도', '와', '1', '저', '다', '를', '들', '은', '과', '그'] 
# 추가 가능하며 주어일 땐 keyword만
n = [each_word for each_word in temp if each_word not in stop_words]

이렇게 되면 다 끝났다. 라이브러리에서 알아서 빈도수를 찾아주기 때문이다. 적절히 그래프로 표현해주기만 하면 된다.

(토큰화 한 자료).plot(50)

3. 결과 살펴보기

비교적 내가 맛잘알인 우리 동네 돈까스를 검색해보았다. 일단 nouns 결과이다. 한 달 동안 구래동 돈까스는 102번의 언급이 있었다.

그래프로 살펴본다.

지명을 거른다고 거르는데도 구래동구래 를 다르게 인식하기 때문에 걸러지지 않은 것을 확인할 수 있다. 그리고 돈까스로 검색해서 돈가스도 나타난다. 이 외에도 필요 없어 보이는 항목은 stop word에 추가해준다.

뭔진 모르겠지만 하늘아래 분당도 아니고 하늘아래 천당도 아닌 천당이 빈도 1위이다. 실제로 검색해보니 호천당이라는 돈까스 집이 있다.

나중에 한 번 가보기로 하고 morphs 로 살펴본다.

결과가 조금 달라지지만 언급도는 비슷하다. 이마트가 왜 잡히는지 궁금해서 검색해보았다.

아무래도 구래동의 심볼(?)이다 보니 지명으로 같이 언급된 것 같다.

우리동네의 경우 작아서 존재하는 돈까스집 대부분이 나타나는 것 같은데 아마 큰 동네를 검색해보면 좀 더 유의미한 결과가 나오지 않을까 싶다. 앞으로 이 데이터를 어떻게 사용할 수 있을지 생각해봐야겠다.