막대 그래프
로 시각화
했다면 이번에는 빈도 수가 높은 태그 이름을 모아 word cloud
로 시각화
할 것이다. 스크래핑 과정은 거의 동일하다.주제 태그
를 추출해야 한다.주제들이 각각 몇 번이나 세어 그래프로 시각화
해 주어야 한다.검사
를 눌러 위치를 확인해 준다.class name
이 question-tags
인 ul
태그 내부에 li
태그 안에 우리가 추출하여야 할 태그명
이 존재한다는 것을 알 수 있다.class name
이 question-tags
인 ul
태그를 모두 찾은 후 li
태그 요소흫 모두 찾고 그 안에 있는 값의 context
를 구하면 된다.스크래핑
을 하기 위한 라이브러리를 호출해 준다.정적인 페이지
이기 때문에 requests
라이브러리를 사용해 응답을 받고 Beautiful Soup
라이브러리를 사용해 HTML
파싱을 해 준다.word cloud
를 좀 더 꽉 차게 만들기 위해 이번에는 30 페이지까지 추출해 준다.태그 이름
문자열을 저장해 주기 위한 리스트(list)
를 만들어 태그 이름
을 append
해 준다. (dictionary
를 사용하지 않는 이유는 어차피 형태소를 분석해 주는 라이브러리를 통해 명사인 값만 추출해 주어야 하기 때문이다.)user_agent = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"}
from bs4 import BeautifulSoup
import requests
questions = []
for i in range(1, 30):
res = requests.get("https://qna.programmers.co.kr/?page={}".format(i), user_agent) #페이지네이션 적용
soup = BeautifulSoup(res.text, "html.parser")
ul_tags = soup.find_all("ul", "question-tags")
for ul in ul_tags:
li_tags = ul.find_all("li")
for li in li_tags:
questions.append(li.text.strip()) #빈칸이 이상할 정도로 많다. strip()으로 처리
time.sleep(0.5)
word cloud
로 만들기 위해서는 문장에서 명사를 추출하는 형태소 분석 라이브러리 konlpy
을 호출해야 한다.collections
라이브러리의 Counter
도 호출해 주어야 한다.Hannanum
의 객체를 생성해 주고 2의 과정에서 만들어진 questions
의 경우 리스트
이기 때문에 for문
을 돌며 리스트의 원소인 문자열
이 명사인지 아닌지를 .nouns()
함수를 통해 확인해 주어야 한다.Counter
로 변환해 주어야 텍스트 구름으로 시각화가 가능하다.# 횟수를 기반으로 딕셔너리 생성
from collections import Counter
# 문장에서 명사를 추출하는 형태소 분석 라이브러리
from konlpy.tag import Hannanum
words = []
hannanum = Hannanum()
#문장이 아니라 지금은 리스트이기 때문에 for문을 돌면서 각각의 형태소를 분석해야 한다.
for question in questions:
nouns = hannanum.nouns(question) #한 번 반복할 때 나오는 명사들
words += nouns #word에 누적해서 쌓아 둔다.
# counter를 이용해 각 단어의 개수를 세줍니다.
counter = Counter(words)
counter
word cloud
로 만들어 주기 위해서는 wordcloud
라이브러리를 호출해 주어야 한다.word cloud
는 이미지 형식이기 때문에 이를 표출해 줄 matplotlib.pyplot
라이브러리도 호출해 준다.wordcloud
객체를 만들어서 폰트 위치(한글을 지원하는 폰트로)
, height
, width
등을 설정해 준다..generate_from_frequencies(counter)
을 호출해 준다. (counter와 같이 key를 보여 줘야 하는 단어, value를 빈도 수로 가지는 구조의 변수를 word cloud
로 변환해 주는 함수이다.)# 시각화에 쓰이는 라이브러리
import matplotlib.pyplot as plt
from wordcloud import WordCloud
wordcloud = WordCloud(
font_path = "/Users/Samsung/AppData/Local/Microsoft/Windows/Fonts/BMEULJIROTTF.ttf",
height = 1000,
width=1000
)
img = wordcloud.generate_from_frequencies(counter)
plt.imshow(img)
결과 값