※ 아래 내용이 많은데.... 뭔가 해보려고 엎치락 뒷치락 하면서 작성한 내용이라 그렇다.

   비슷한 고민을, 공부를 해보시려는 분이면 조금 도움이 되지 않을까 해서 공개한다.



주말에 뭘할까 고민하다가 블로그를 뒤져봤는데... 뭔가 귀찮았다.

그래서 이걸 어떻게 하면 편하게 할 수 있을까 고민하다가... ^^


[ 목표 ]

1. 네이버 블로그에서 특정 키워드(동탄)를 검색해서

   맛집 포스팅인지 부동산 포스팅인지 구분하고

   동일한 식당이면 묶어서

   홍보 포스팅이면 제외시켜서

   GitHub 페이지로 결과를 보여주도록 하고 싶다.


2. 불량 포스팅이면 작성자를 기록해서

   다음부터는 해당 블로거 글은 무조건 걸러버리는 기능도 필요


3. 처리한 결과는 별도 로깅도 하고 레포팅도 한다.



[ 개발 환경 ]

    - GitHub에 repository를 생성해서 소스코드 관리

        . https://github.com/

    - Virtualbox를 이용해서 Ubuntu 18.04 LTS Server 설치

        . https://www.whatwant.com/entry/Ubuntu-Server-18042-LTS-64bit-Bionic-Beaver-Installation

    - Python

        . 일단 2.7 버전의 Python으로 해보고자 한다. "$ sudo apt-get install python"



[ 진행 #1 - Python module 설치 ]

    - 추가로 설치해야하는 Python module들을 설치하자

$$ sudo apt-get install python-beautifulsoup python-requests



[ 진행 #2 - Naver API 사용 준비 ]

    - Naver 블로그 검색을 API를 통해 해보고자 한다.

        . https://www.whatwant.com/entry/Naver-API-사용-준비하기

    - 기본적인 활용은 아래 링크에서 확인할 수 있다.

        . https://developers.naver.com/docs/search/blog/



[ 진행 #3 - 기본 코드 작성하기 ]

    - 이제 준비는 모두 끝났다. 뭔가 동작하도록 해보자!!!


#!/usr/bin/env python

# -*- coding: utf8 -*-


import urllib2

import requests



naver_client_id = "XXXX"

naver_client_secret = "XXXX"


search_blog_keyword = "동탄"

query = urllib2.quote(search_blog_keyword)


display = 10


start = 1


sort = "date"


url = "https://openapi.naver.com/v1/search/blog.json?query=%s&display=%s&start=%s&sort=%s" % (query, display, start, sort)



request = urllib2.Request(url)

request.add_header("X-Naver-Client-Id", naver_client_id)

request.add_header("X-Naver-Client-Secret", naver_client_secret)



response = urllib2.urlopen(request)

rescode = response.getcode()



if( rescode == 200 ):

    response_body = response.read().decode('utf-8')


    print response_body


exit()


    - 위와 같이 작성 후 실행하면, 뭔가 값을 가져온 것을 확인할 수 있을 것이다. 뭔가 다 된 것만 같은 착각이~~~ 든다.

    - 정말로 뭔가 가져온다~ ^^



[ 진행 #4 - NLP 사용하기 (KoNLPy) ]

    - 한국어 분석을 해보기 위해 알아보니, 가장 유명한 NLP 모듈이 KoNLPy 인 것 같다.

        . Reference: http://konlpy.org/ko/latest/


    - 필요한 패키지 미리 설치하기

        . 공식 홈피에는 openjdk-7-jdk로 되어있고, python3-dev도 기재되어 있지만,

          Ubuntu 18.04 환경에서 현재 openjdk-7-jdk는 사라졌고, 필자는 python2.7 환경에서만 사용할 것이기에 아래와 같이...


$ sudo apt-get install g++ openjdk-8-jdk python-dev


    - KoNLPy 설치하기


$ sudo apt-get install python-pip

$ sudo -H pip install konlpy


    - 샘플 코드는 다음과 같다.

    - 과거 Twitter가 이름을 Okt로 바꿨단다.


from konlpy.tag import Okt

from konlpy.utils import pprint



...

        blog_content = ... (위의 블로그 긁어오기 응용)

        okt = Okt()

        pprint( okt.nouns( blog_content ) )



[ 진행 #5 - 단어 카운트하기 ]

    - 블로그 본문 얻기 → 형태소 분석해서 noun 얻기 → 각 단어가 몇개인지 갯수를 얻어야겠다!!!!

    - 예전에는 for 구문 돌려서 하나씩 갯수를 더해가면서 분석을 했는데, 좀 더 편한 방법을 찾아봤다.


from collections import Counter


...


    ... (블로그 본문 얻기)


        okt = Okt()

        nouns = okt.nouns( blog_content )


        tags = Counter( nouns )


        pprint( tags )


    - Counter() 함수 하나로 해결?!



[ 진행 #6 - 한글 폰트 설치하기 ]

    - 단어 구하고 몇 개씩인지 카운트까지 했으면, 당연히 wordcloud 한 번 해봐야할 것 같아서 ... 미리 필요한 한글 폰트부터 설치해봤다.


$ sudo apt-get install fonts-nanum fonts-nanum-coding fonts-nanum-extra


    - 설치된 폰트를 확인해보자.


$ ll /usr/share/fonts/truetype/nanum/



[ 진행 #7 - wordcloud 설치하기 ]

    - 최근 Python을 통해서 이러한 분석작업을 하는 것이 엄청 유행을 하고 있는데,

      ML과 함께 하는 것이 유행하면서 Jupyter Notebook 환경에서 작업한 코드들이 대부분이다보니 필자가 원하는 내용을 찾기가 쉽지 않았다.

    - 뭐, 결국은 필자의 지식과 노력과 실력이 부족한 탓이겠지 ㅠㅠ


$ sudo -H pip install wordcloud

$ sudo -H pip install matplotlib

$ sudo apt-get install python-tk



[ 진행 #8 - wordcloud 만들어보기 ]

    - 앞에서 형태소 분석한 단어가 각 몇 개씩인지까지 분석했으니... 그걸 가지고 WordCloud를 만들어보자.


from wordcloud import WordCloud


... (블라블라)


        ... (블로그 본문 읽어와서)

        ... (KoNLPy 이용해서 형태소 쪼개고)

        tags = (Count 이용해서 단어별로 갯수 카운트하고)


        font_path = '/usr/share/fonts/truetype/nanum/NanumMyeongjoBold.ttf'

        wc = WordCloud(font_path=font_path, background_color='white', width=800, height=600)


        cloud = wc.generate_from_frequencies( tags )

        cloud.to_file( "wordcloud.png" )


    - 그러면 아래와 같은 그림이 만들어진다. (폰트는 바꿔서 만들었다 ^^)




[ 진행 #9 - GitHub Pages Theme 고르기 ]

    - 이미지 파일까지 만들었는데... 이걸 어떻게 보여줄까 고민하다가 생각한 GitHub Pages ...

    - 기본으로 주어진 테마 중에는 마음에 드는 것이 없어서 다른 테마들은 없을까 찾아보았다.

        . https://jekyllthemes.io/github-pages-themes



    - 유료도 있지만, 무료도 있으니 잘 찾아보길... ^^



[ 진행 #10 - GitHub Pages Theme 가져오기 ]

    - 필자가 고른 Theme는 "flexible-jekyll"

        . Repo: https://github.com/artemsheludko/flexible-jekyll

    - 해당 Theme를 다룰 다양할 방법이 있지만, 필자가 택한 방법은 "/docs" 디렉토리에 넣어서 사용하기!


    ① 내가 사용하는 Repo를 다운로드 받은 뒤, 내 Repo 디렉토리로 이동하자

    ② 위 Theme를 clone 받은 뒤, .git 디렉토리를 지우자.


$ git clone https://github.com/artemsheludko/flexible-jekyll.git ./docs

$ rm -rf ./docs/.git


    ③ 그렇게 하고 push 하자. /docs 디렉토리가 있어야 뒤에서 할 settings 설정을 진행할 수 있다.


    ④ GitHub에서 Pages 기능을 활성화 시키자. 해당 Repository의 settings 메뉴에서 GitHub Pages 항목을 살펴보자.



    ⑤ Source 선택 時 /docs folder로 골라주면 된다. (/docs 디렉토리가 있어야 해당 옵션을 선택할 수 있다)



[ 진행 #11 - GitHub Pages Theme 설정하기 ]

    - 간단한 config를 설정해야 한다.



    - 입맛에 맞게 수정한 후 commit 반영하자.



[ 진행 #12 - GitHub Pages Post 반영하기 ]

    - 검색 결과를 얻어와서 분석하고, 이미지까지 만든 것을 post로 만들어 보자.

    - 아래 코드는 필자가 테스트로 작성했던 것을 샘플로 기재한 것이다.


... (앞에서 작업한 것들)


    for content in CONTENTS:

        post_filepath = "docs/_posts/%s-%s.markdown" % ( datetime.now().strftime("%Y-%m-%d"), content['id'] )


        temps = [ "---", "layout: post" ]

        temps.append( "title: %s" % content['title'] )

        temps.append( "date: %s" % content['postdate'] )

        temps.append( "description: %s" % content['description'] )

        temps.append( "img: %s" % content['img'] )

        temps.append( "fig-caption: # Add figcaption (optional)" )

        temps.append( "tags: [ %s ]" % ','.join(content['nouns']) )

        temps.append( "---" )

        temps.append( "[%s](%s)" % (content['title'], content['link']) )


        with open( post_filepath, 'w') as outfile:

            outfile.write( "\n".join( temps ) )



여기까지 진행해서 얻게된 결과는 다음 이미지와 같다.




아직도 해볼만한 것이 엄청 많지만,

힘들어서 여기까지만 작성한 내용으로 한 번 선 긋고자 한다. 헥헥 ...



반응형

+ Recent posts