K-디지털트레이닝(빅데이터) 33일차

유현민·2021년 9월 13일
0

오늘은 워드클라우드로 형태소분석 밑 구글플레이 댓글 크롤링을 했다.

  1. 패키지 불러오기
import os
import sys
import urllib.request
import json
import re
  1. 네이버 api 만들어 놓은거 불러오기
client_id = "ZfhA97N3n2D26_pj344P"
client_secret = "WjSgWdzg65"

keyword = input('블로그 검색어를 입력해주세요')

encText = urllib.parse.quote(keyword)

tlist = []
llist = []
dlist = []


#1000페이지 검색하기위해서 만들어준다.
for pagenum in range(1,1000,100):
    #만약 에러가 발생하면 저장이 안되기때문에 에러난건 제외하고 저장하기 위해서 
    try:
    
        #문서에 들어가보면 요청변수가 여러개있음 그걸 이용해서 하면된다. 예를 들면 display는 검색결과출력건수를 지정하는데 최대 100이다.
        # sort는 정렬옵션인데 sim을 넣으면 유사도순이고 dateㄴ는 날싸순이다.
        url = "https://openapi.naver.com/v1/search/blog?query=" + encText +"&display=100&sort=sim&start="+str(pagenum)# json 결과   블로그 1~100  101~200
        # 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()
            jtemp = response_body.decode('utf-8')
            jdata = json.loads(jtemp)

            jdata['items']
                
                
            #여기도 문서에 적혀있다. 출력결과가 어떤 변수로 저장되는지 그거 참고해서하면된다.
            #https://developers.naver.com/docs/serviceapi/search/blog/blog.md#%EB%B8%94%EB%A1%9C%EA%B7%B8
            #모르겠으면 여기 들어가서 쭉 내려보자...
            for temp in jdata['items']:  
                hangul = re.compile('[^ ㄱ-ㅎ|가-힣]+')
                tdata = temp['title']
                ldata = temp['link']
                ddata = hangul.sub(r'',temp['description'])

                tlist.append(tdata)
                llist.append(ldata)
                dlist.append(ddata)

        else:
            print("Error Code:" + rescode)
            
    except:
        print('Error')
        
        

result = []
for temp in range(len(tlist)):
    temp1 = []
    temp1.append(tlist[temp])
    temp1.append(llist[temp])
    temp1.append(dlist[temp])
    
    result.append(temp1)
    
print(result)

f = open('{0} - 네이버API 블로그검색.csv'.format(keyword) , 'w', encoding='utf-8')
f.write('제목'+',' + '링크' + ',' + '내용' + '\n')
for temp in result:    
        f.write(temp[0] + ',' + temp[1] + ',' + temp[2] +'\n')
f.close()
  1. 워드클라우드 및 형태소 분석을 위해 패키지 불러오기
import os
import sys
import urllib.request
import json
import re
import konlpy
from konlpy.tag import Okt
from collections import Counter
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image


import konlpy.tag
  1. 태그를 나눠주는 함수를 만들어준다.
def get_tags(text, ntags=50): #태그를 나눈다. 태그란? 각 글자를 의미
    #기본값을 50으로 설정해준다. ntags는 단어수를 의미한다.
    spliter = Okt() #Open Korean Text -> 한국어 분석기
    nouns = spliter.nouns(text) # 명사로 나눈다
    count = Counter(nouns) #명사의 갯수를 센다.
    return dict(count.most_common(ntags)) # 딕셔너리형태로 갯수를 반환해준다.
  1. 특수기호와 영어 제거하기 위해 함수를 만들어준다.

Okt는 한글만 가능하기 때문에 이렇게 해줘야한다.

def clean_str(s):
    hangul = re.compile('[^ㄱ-ㅎ|가-힣]+')
    s = hangul.sub(r' ',s)# 띄어쓰기를 넣어줘야 띄어쓰기가 되서 나온다.
    
    cp = re.compile("["
                     u"\U00010000-\U0010FFFF"
                     "]+", flags=re.UNICODE) #이건 영어 제거였나 그럼
    s = cp.sub(r' ',s)
    return s.strip() #쓸데없는거 지우고 리턴해준다.
  1. 워드클라우드함수를 만들어준다.
def Wordcloud(data , savename , maskname=''):
    #워드클라우드는 폰트가 중요하다. 왜냐하면 보여지는게 중요하기때문
    if maskname == '': #마스크이름(사진)이 없으면 그냥 글자만 나오게하고
        wc = WordCloud( font_path='font/BMEULJIROTTF.ttf' , background_color='white', max_font_size=60, colormap='copper')
    else:
        maskimg = np.array(Image.open(maskname)) #마스크(사진)이 있으면 불러오고 그에 맞게 만들어준다.
        wc = WordCloud(font_path='font/BMEULJIROTTF.ttf' , background_color='white', mask=maskimg, max_font_size=60, colormap='copper')
        
    #여기서부터는 시각화 부분이라 몰라도되고 그냥 가져다 쓰자
    wc.generate_from_frequencies(data)
    plt.figure(figsize=(20,10))
    plt.imshow(wc)
    plt.tight_layout(pad=0)
    plt.axis('off')
    plt.show()
    wc.to_file(savename + ".png")

textdata = ''
  1. 이어쓰기를 해서 하나의 데이터로 만들어준다.
#크롤링해서 나온 데이터를 하나로 합쳐주는 역할,,, 이어쓰기? 라고 보면될듯
for temp in result:
    print(temp[2])
    if '커피' in temp[2]:
        continue
    else:
        textdata = textdata + ' ' + temp[2] 

    
tresult = get_tags(textdata)
  1. 크롤링 해서 결과를 본다.
tresult = get_tags(textdata,ntags=200)
Wordcloud(tresult,'커피블로그')
#위에서 정의해준 함수를 보면 된다.... 커피블로그는 사진이 만들어지는 이름

구글플레이 댓글 크롤링

  1. 패키지 불러오기
from selenium import webdriver
import time
from bs4 import BeautifulSoup
import pandas as pd
import re
import konlpy
from konlpy.tag import Okt
from collections import Counter
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
  1. 앞에서 했던 함수를 그대로 쓴다.
def get_tags(text, ntags=50):
    spliter = Okt()
    nouns = spliter.nouns(text)
    count = Counter(nouns)
    return dict(count.most_common(ntags))

def Wordcloud(data , savename , maskname=''):
    
    if maskname == '':
        wc = WordCloud( font_path='./font/BMEULJIROTTF.ttf' , background_color='white', max_font_size=60, colormap='spring')
    else:
        maskimg = np.array(Image.open(maskname))
        wc = WordCloud(font_path='./font/BMEULJIROTTF.ttf' , background_color='white', mask=maskimg, max_font_size=60, colormap='spring')
        
    wc.generate_from_frequencies(data)
    plt.figure(figsize=(20,10))
    plt.imshow(wc)
    plt.tight_layout(pad=0)
    plt.axis('off')
    plt.show()
    wc.to_file(savename + ".png")
  1. 구글플레이 함수를 만들어준다.
#처음에 함수를 불러올 때 url을 넣어준다.
def get_googleplay(url,filename):
   
    driver = webdriver.Chrome('chromedriver.exe')
    driver.implicitly_wait(1)
    driver.get(url)
    driver.maximize_window()
    time.sleep(3)

댓글이 많아서 한 화면에 안담기기 때문에 스크롤을 지정한 만큼 내려서 크롤링하게 만든다.

    for i in range(0,10):
        sheight = (driver.execute_script("return document.body.scrollHeight"))     #스크롤바의 시작지점
        driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")    #스크롤바를 화면 밑으로 내림
        time.sleep(2)
        lastheight = (driver.execute_script("return document.body.scrollHeight"))  #현재 스크롤바 위치 저장

        
        if sheight == lastheight:
            try:
                driver.find_element_by_class_name('CwaK9').click()
                time.sleep(2)
            except:
                print('더보기 없음')
#여기까지는 같고 밑에서부터 조금 다름
  1. 여기는 똑같다.
    #driver.page_source를 하면 현재 열려있는 페이지의 html 주소를 받아온다.
    html = driver.page_source    
    #슬라이싱해서 soup에 담아놓기
    soup = BeautifulSoup(html,'lxml')
    #구글플레이 댓글에서 찾아보면 bN97Pc 이게 댓글임
    result = soup.find_all('span',{'jsname':'bN97Pc'})
    
    #전체 데이터를 담을 준비
    replydata = []
    #하나씩 꺼내서 특수문자랑 영어 날리고 다시 담는다.
    for temp in result:
        hangul = re.compile('[^ ㄱ-ㅎ|가-힣]+')
        rtext = hangul.sub(r' ',temp.text)
        replydata.append(rtext)
    
    #데이터프레임으로 만들어준다.
    rdata = pd.DataFrame(replydata)
    rdata.to_csv(filename+ ' 구글플레이 댓글.csv')
    
    #이어쓰기 할 준비
    rtext = ''
    #이어쓰기 시작
    for temp in replydata:
        rtext = rtext + temp

    #태그를 100개로 달아준다.
    resulttext = get_tags(rtext,100)
    #워드클라우드 실행
    Wordcloud(resulttext, filename+' 구글플레이 워드클라우드.png')
  1. 당근마켓을 크롤링해본다.
get_googleplay('https://play.google.com/store/apps/details?id=com.towneers.www&showAllReviews=true','당근마켓')

profile
smilegate megaport infra

0개의 댓글