본문 바로가기

카테고리 없음

파이썬으로 허접 데이터마이닝 - 블로그 리서치용...

프롤로그

이 글을 쓰기까지 얼마나 긴 길을 돌아왔던가...네이버 본문까지 크롤링하는 법 알려주는 포스팅 발견해서 좋아하다가 블라킹 당하고 ㅜ 이 코드를 찾기까지도 우여곡절이 너무 많았는데...베끼는 주제에 말이 많다고 생각하겠지만 으...나같은 코알못에겐 베끼는 것도 너무 어렵더이다. 그래서 하다하다 안되서 허접코드로 좀이라도 블로그로 인사이트 얻을 때 내 노고를 덜 수 있는 것들로 이만 파이썬 공부를 잠정 중단하기로 했다. -_-; 다른 돌파구를 찾을 때까지...

섹션은 3가지로 나눠봤다.

  1. 네이버 API 활용해 키워드 기반으로 블로그 목록 가져오기 (제목, 글주소, 요약, 블로거명, 블로거주소, 게시일)
  2. 내 손으로-_-; 추출한 글 주소들을 코드 돌리면 자동으로 익스플로러에 띄우기
  3. 내 손으로-_-;;;;; 긁은 글을 저장한 txt파일로 워드 클라우드 만들기

 

네이버 API로 블로그 목록 가져오기

일단 코드를 확인하면, 네이버 API사이트에서 제공하는 코드랑 (https://developers.naver.com/docs/search/blog/) 별반 차이가 없다는 것을 알게 될것이다 음하하 ^^ 하지만 베이스 코드엔 한 장에 나오는 블로그 목록만 보여주는 것 같아서 100장까지의 기록을 프린트 할 수 있도록 수정한 것과, 출력할때 "}{][" 이런 보기에 안좋은 문자까지 프린트가 되어 이걸 다 제거한 부분까지 해서 두 군데를 만졌다...(깃허브의 고수들을 통해)

아, 코드를 실행하기 위해서는 우선 네이버 오픈 API 이용 신청을 해서 client id와 client secret을 얻어야한다. 이것저것 넣으라고 하는데...일단 "만드려는" 앱이나 웹사이트 주소와 각종 요구하는 정보를 입력하면 바로 발급이 되니까...지레 겁먹지 않아도 될 것 같다.

# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다.
# 네이버 검색 Open API 예제 - 블로그 검색

import urllib.request
client_id = "YOUR_CLIENT_ID" #네이버 개발자 아이디 입력
client_secret = "YOUR_CLIENT_SECRET" #네이버 개발자 시크릿 입력

start = '&start=1' #1페이지부터 시작. 수정가능.
display = '&display=100' #100개 검색. 수정가능.
encText = urllib.parse.quote("검색어 입력") #원하는 검색어 입력
url = "https://openapi.naver.com/v1/search/blog?query=" + encText + start + display # json 결과
#url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # xml 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    #response_body = response.read()
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)


#여기서부터 이상한 문자 삭제하는 코드
f = open('raw데이터 파일 주소', 'w', encoding='utf-8')
f.write(response_body.decode('utf-8'))
f.close()

fin = open("raw데이터 파일 주소", "rt", encoding='utf-8')
fout = open("문자 삭제한 파일 주소", "wt", encoding='utf-8')

for line in fin:
    fout.write(line.replace('</b>','').replace('<b>', '').replace('}]}', '').replace('},','').replace('{','').replace('\/','/')) #문자를 다른 문자로 대체할 수 있는 코드..난 '' 사이에 아무것도 안넣음으로써 삭제하는데 사용중

fin.close()
fout.close()

 

코드 실행하고 저장한 파일 확인하면 아래와 같은 정보를 확인할 수 있다. 참고로 내 키워드는 "갤럭시 Z플립"이였다. 요새 핫한 폰같아서 ㅎㅎㅎ

 

웹주소를 자동으로 익스플로러에 띄우기

사실 자동으로 본문까지 가져와도 어짜피 노가다가 필요한 것 같다. 키워드를 아무리 정교하게 짜도 추출되는 결과가 내가 원하는 방향이 아닐수도 있기 때문...라며 정신승리하며 이제 저장한 파일의 제목, 요약을 보면서 정말 내가 원하는 블로그의 글귀인지 확인한다. 대충 1/10은 버린 것 같다. Z플립에 대한 고객의 목소리를 얻고 싶었는데, 케이스 회사, 폰 회사에서 올린 광고 글이 은근 많다 ㅋㅋ. 이 작업을 마친 뒤, 내가 더 보고 싶은 블로그의 주소들을 긁어 모아, 이 코드에 삽입하면 된다. (이것 또한 깃허브의 고수들을 통해 알게된...)

import webbrowser
urls = ['https://blog.naver.com/neces2?Redirect=Log&logNo=221811368824',
        'https://blog.naver.com/jjang986?Redirect=Log&logNo=221820919581',
        'https://blog.naver.com/soary81?Redirect=Log&logNo=221815165059',
        'https://blog.naver.com/dornot?Redirect=Log&logNo=221819664652',
        'https://blog.naver.com/63misschoi?Redirect=Log&logNo=221839572368',
        'https://blog.naver.com/seagreen0314?Redirect=Log&logNo=221843363517',
        'https://blog.naver.com/gyrodrop18?Redirect=Log&logNo=221826413760',
        'https://blog.naver.com/bastianchoi?Redirect=Log&logNo=221816948781',
        'https://blog.naver.com/sanghyo1026?Redirect=Log&logNo=221820242553',
        'https://blog.naver.com/lkc0722?Redirect=Log&logNo=221806388158',
        'https://blog.naver.com/supapa13?Redirect=Log&logNo=221814747975',
        'https://blog.naver.com/aiwositai?Redirect=Log&logNo=221832431560',
        'https://blog.naver.com/need97?Redirect=Log&logNo=221842146550',
        'https://blog.naver.com/seagreen0314?Redirect=Log&logNo=221813588579',
        'https://blog.naver.com/dicagallery?Redirect=Log&logNo=221824807764',
        'https://blog.naver.com/ymgoon7?Redirect=Log&logNo=221835844384',
        'https://blog.naver.com/curbins?Redirect=Log&logNo=221828864141',
        'https://blog.naver.com/sosoweb?Redirect=Log&logNo=221828006475',
        '웹주소',] #[ ] 브라켓 안에 주소 입력

for url in urls:
    webbrowser.open_new_tab(url)

이 코드를 실행하는 순간 익스플로러가 켜지면서 코드에 입력한 주소들이 탭에 막 뜬다. 나는 한 40개까지 열었는데 ㅋㅋㅋㅋ...컴터가 사양이 낮으면 조심하면서 쓰자...메모리 많이 잡아먹는 것 같다. 이제 열려있는 블로그들의 내용을 새 텍스트 파일로 가져오면 된다. 그런데 복사금지 기능 때문에 이게 얼마나 쓸데 없는 짓인지....알게 되었다. 먼가 복사금지 파일도 가져오는 방법 아는 분 있으면 댓으로 남겨줘요 글을...ㅜ 여기서 또 데이터 반 이상을 날려보내야했다.

 

텍스트 파일로 워드 클라우드 만들기

워드 클라우드는 R로도 했었지만, 파이썬으로도 가능하다. 하지만, 내가 아직 방법을 못 찾은것인지...파이썬으로 만든 클라우드가 더 못생긴 것 같다. ㅋㅋ 지금 그게 문제겠소냐만은...

한국어이기 때문에 한국어 처리가 가능한 konlpy와 sonlpy를 깔고 데이터 정제하려고 별 생쇼를 다하다가 내 컴퓨터가 삐꾸인지 코드 실행할 때마다 -0 에러가 떠서 포기하고. 단순하게 matplot과 wordcloud과 또 단어를 대체하는 코드를 가지고 일단 간단하게 클라우드를 만들어봤다. 나 혼자 볼라고 ㅋㅋ ^^ 

import matplotlib.pyplot as plt
from wordcloud import WordCloud


font_path = 'c:\\windows\\fonts\\NanumGothic.ttf' #폰트설정

wordcloud = WordCloud(
    max_words=200, #최대 수용 단어 갯수
    background_color='white', #배경색상
    font_path=font_path,
    width = 800, #넓이
    height = 800, #길이
    collocations=False,
    )



text=open('복사한 글 txt문서파일', 'rt', encoding='UTF8').read() #파일명, 주소 입력


text = text.replace("URL", "") #대체하고 싶은 단어 입력
wordcloud = wordcloud.generate(text)


fig = plt.figure(figsize=(6,6)) #워드클라우드 사이즈 설정 6,6이 숫자덜 수정 가능
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
fig.savefig('D:/wordcloud_without_axisoff.png')

 

나는 갤럭시 Z플립 키워드를 가지고 블로그 글을 긁어서 저장한 파일로 워드클라우드를 만들어봤는데, 결과물은 아래와 같다.

역시 톰브라운으로 광고를 잇빠이 때린 덕분에 Z플립하면 톰브라운이 바로 연상이 되나보다. 접히는 부분에서 모토로라 예전 플립폰이 많이 연상되는 것 같고. 셀카, 사진 찍는 얘기는 글로 돌아가서 확인해보니까 사람들이 손바닥을 인식해 자동으로 사진 찍히는 부분을 신기하게 생각하는 사람들이 많아서 클라우드에 좀 크게 보이는 것 같다. 좀 의아한 부분이 z플립 꾸미는게 요새 인스타나 유투브에 유행처럼 돌고 있는데 음..네이버 블로그는 아직인가? 워드 클라우드를 통해서는 별로 그런 뉘앙스가 캐치되지는 않는다. 아님 데이터가 워냑에 적어서 그럴수도 있고, 생각보다 크게 사람들이 언급을 안하는 걸수도 있을 것 같다.

 

글을 마치며

하..여기서 누워서 데이터 모으는 아니 파이썬을 통해 스마트하게 블로그 리서치하려는 나의 노력을 중단하며, 에이 뭐야...하면서 실망하며 돌아가는 사람들에게 내가 드릴 얘기는... 이건 주인장의 일기장이다...라고 생각하며 시간 잘 떼웠군 라며 긍정적인 시선으로 바라봐줬으면 좋겠다. 언젠가 마음이 동하면 재데로 파이썬을 배울 기회가 있기를...이제 이만 일하러 가봐야겠다. 모두 코로나 조심하고 주말까지 존버하기를!