본문 바로가기
Python

내 티스토리는 무슨 키워드로 많이 유입될까??? 워드클라우드 다시 맛보기

by 돈민찌 2022. 2. 11.
반응형

오랜만입니다!

지난번에 스파르타코딩클럽 프로모션 강의로 워드클라우드 만드는 거 글 올렸었는데요.

카카오톡 대화내역으로 "우리들이 버릇처럼 쓰는 말을 알아보자"라는 느낌이었는데,

좀 더 실용적인 사용방법도 있지 않을까? 해서 준비해 보았습니다.

우선 준비물은 여러분의 티스토리 블로그와 파이썬 3.x 버전입니다. (사실 별 상관은 없습니다.)

사용하게 되는 라이브러리들은 다음과 같습니다.

import requests
import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from collections import Counter
requests==2.27.1
pandas~=1.3.5
matplotlib~=3.5.1
wordcloud~=1.8.1

아래에 있는 내용으로 requirements.txt 만들어 pip install -r requirements.txt 하셔도 되구욥.

위에 있는 코드를 먼저 작성하신 다음에 설치되어 있지 않은 라이브러리에 빨간 줄이 뜨면 설치하기 눌러주셔도(파이참 기준) 됩니다.

하나하나 패키지 관리에서 설치해 보셔도 되구요! 

저야 예시를 보여드리기 위해 버전이 특정되어 있는데 안정적인 버전이라면 어떤 것이든 사용방법이 크게 다르지는 않을 겁니다. 참고로 collections는 내장 모듈이라 없는 것이예요

일단 블로그 관리 페이지에 한번 들어가볼까요?

처음 블로그를 만들어 1년간 열심히 글을 썼던 고양이사료 블로그입니다. 매일매일 많은 분들이 검색을 통해서 들어와주시고 계시네요! 좀 더 본격적으로 키워드 트렌드에 맞춰 쓰는 분들이 보시기엔 너무 적은 숫자일 수도 있겠네요 ㅎㅎㅎ

이 화면에서 그대로 F11 키를 눌러 개발자 도구로 들어가봅시다. Ctrl + Shift + C 키를 눌러도 좋아요!

네트워크 탭을 클릭해 주세요!

여기서 Fetch / XHR 을 눌러주세요. 조금 복잡하죠? 어려운건 금방 끝납니다. 그리고 페이지를 새로고침해주세요!

요 키워드라는 json 파일이 우리의 타겟입니다! 요 놈을 한번 들여다 볼거예요. 클릭해주세요.

앞뒤 자르고 간단하게 설명해 보자면, 우리가 블로그 관리 페이지 홈에 접속하면, 블로그에 접속하는 사용자들이 어떤 키워드로 검색해오는지! 바로 서버에 확인 요청을 보냅니다 그게 keyword.json 이라는 답으로 돌아와서 우리 눈에 보이게 되는 거구요! 그래서 저기 보이는 URL을 브라우저에 입력하면! 우리가 원하는 답을 받을 수 있게 됩니다!!

그런데 저 주소는 기존 블로그의 주소를 그대로 쓰고 있어요. 누구나 여기에 접속해 답을 빼갈 수 있다면, 제가 경쟁 블로그(그런거 없지만)는 어떤 키워드가 인기인지 확인도 해보고 그럴 수 있겠다 그쵸? 그래서 우리는 저기에 요청을 보낼때 우리가 가지고 있는 로그인 정보를 쿠키상자에 담아 함께 보냅니다. 쿠키 얘기하니 서브웨이 쿠키 먹고 싶네요. 냠냠

그래서 저거를 고대로 가져와볼겁니다 파이썬 코드로 구현해 볼게요!

url = f'https://catminzzi.tistory.com/manage/statistics/blog/2022-02-10/day/keyword.json'
headers = {
	"Cookie": 엄청나게 긴 로그인 정보를 담은 쿠키 문자열 주루루루루룩
}
req = request.get(url, headers=headers)
obj = req.json()

URL과 쿠키에 대한 설명은 했으니 아래 두 줄도 설명해 보자면, 리퀘스트s 라는 라이브러리를 통해 get(위에 GET 밑줄 그어져 있죠?)를 보낼건데 이때 쿠키를 담아 보냅니다. 그리고 온 응답에 대해서 .json 메소드를 활용해서 바로 객체로 만들어줍니다. 파이썬에서는 딕셔너리로 변환돼요!!

그런데 쪼금 아쉬운게 여기서는 한 날짜만 받아올 수 있네요 반복해서 받아오려면 반복문을 써야할 것 같아요. 음 날짜별로 순회하는 코드를 쉽게 쓸 수 없을까요? 저는 꼼수를 좀 써서 pandas를 사용했습니다.

pandas는 아주아주아주 유명한 파이썬 라이브러리예요. 데이터를 다루는 작업을 할때 매우 유용해요. 특정 시간마다 반복되어 기록되는 데이터(시계열 데이터)를 다루기 위해 DatetimeIndex라는 것을 제공하는데, 요 친구를 한번 써볼까 해요. 다음과 같습니다.

for d in pd.date_range("2022-01-01", "2022-02-10"):
    date = d.date()
    url = f'https://catminzzi.tistory.com/manage/statistics/blog/{date}/day/keyword.json'
    headers = {
        'Cookie': '어마어마하게 길게 암호화된 티스토리 로그인 정보'}
    req = requests.get(url, headers=headers)
    obj = req.json()

이 판다스의 date_range라는 것을 활용하면 반복되는 날짜에 대해서 간단하게 인덱스로 활용할 수 있어요. 저는 여기서 날짜 부분만 쏙 빼서 (.date()를 사용하지 않으면 00시00분까지 기록돼요) url에 삽입해줬습니다. 그러면 알아서 1월1일부터 오늘 날짜까지를 싹 계산해 줄거예요!

그러면 이런 데이터가 obj에 담길 거예요. 그러면 obj의 data 안에, result 안에 있는 단어들 중에서 keyword에 해당하는 단어를 count 번만큼 반복해서 저장하면 되겠네요? (알잘깔딱센 알쥬?)

네 이 부분도 코드를 써보겟습니다.

result_string = []
for d in pd.date_range("2022-01-01", "2022-02-10"):
    date = d.date()
    url = f'https://catminzzi.tistory.com/manage/statistics/blog/{date}/day/keyword.json'
    headers = {
        'Cookie': '어마어마하게 터프한 지아코 쿠키'}
    req = requests.get(url, headers=headers)
    obj = req.json()
    for result in obj["data"]["result"]:
        keyword = result["keyword"]
        count = result["count"]
        for _ in range(count):
            result_string.append(keyword)

result_string 리스트에 원하는 단어들이 일자별로 조회된 뒤 잘 들어갈 거예요. 그럼 이제 워드 클라우드를 만들어봅시다.

2021.09.11 - [Scraping] - [스파르타코딩클럽] 요즘 힙한 취미, 코딩

 

[스파르타코딩클럽] 요즘 힙한 취미, 코딩

스파르타코딩클럽에 무료강의 네가지가 풀렸습니닷!!! (시켜줘 스파르타 마케터) 요즘 힙한 취미, 코딩 어떠심니까.. 여행/음악/아트/운동/게임 분야마다 입장권이 있고 자신의 취미에 가까운 것

cat-minzzi.tistory.com

2021.09.12 - [Scraping] - [파이썬 패키지 wordcloud] 우리 카톡엔 무슨 단어가 가장 많을까??

 

[파이썬 패키지 wordcloud] 우리 카톡엔 무슨 단어가 가장 많을까??

파이썬을 기본적으로 조금 다뤄본 사람이라면 파일을 불러와서 한줄씩 화면에 띄우는 것은 할 수 있으리라 믿고 글을 쓴당. 기본 형식은 다음과 같다. 방법A f = open("./sample.txt", mode="r", encoding="utf

cat-minzzi.tistory.com

한번 글 쓴 적 있는 패키지니까 간단하게 넘어가구 코드로 보여드릴게요!!

wc = WordCloud(
    font_path="NotoSansKR-Regular.otf",
    background_color="white",
    max_font_size=60,
    width=600,
    height=400
)

font_path 같은 경우에는 저는 구글 웹폰트에서 Noto Sans KR otf 파일을 받아와서 사용했는데요. 아 나는 그런거 받기 넘 귀찮고 컴퓨터에 있는거 쓰고 싶다 하시는 분들은 다음을 따라해 보세요.

파이참에서 아래에 있는 Python Console 탭을 들어가주세요!

import matplotlib

matplotlib을 한번 불러와주세요.

matplotlib.font_manager.fontManager.ttflist

요렇게 한번 입력해 보세요. 내 컴퓨터에 설치된 폰트 파일들 + matplotlib 라이브러리에 포함된 기본 폰트들이 싹 리스트로 나타납니다. 여기서 원하는 폰트 위치를 복사해서 사용하시면 됩니다! 저는 생략합니당

# 상위 40개 자주 나온 단어만 추출 (to plt)
counts = Counter(result_string)  # 단어들을 카운트합니다. 
tags = counts.most_common(40)  # 가장 자주 나온 40개의 단어를 선별해요.
cloud = wc.generate_from_frequencies(dict(tags))  # 빈도수에 따라 워드 클라우드를 그려요
plt.figure(figsize=(10, 8))  # pyplot 차트를 그릴 캔버스를 준비해요.
plt.axis("off")  # axis.. 축??을 없애는 코드예요.
plt.imshow(cloud)  # pyplot 표 위에 워드클라우드를 그려요
plt.show()  # 짠 이제 보여주세요!

요렇게 해보세요. 그러면 어떻게 나타나냐면...

이렇게 차트를 보여주는 뷰에서 해당 워드클라우드를 보실 수 있어요!! 오른쪽의 ... 버튼을 누르시면 이미지로 저장도 가능해요.

그런데 나는 이게 단어들까지 분리해서 진짜 자주 나온 단어들을 보고 싶다... 상위 40개? 그냥 다 보여줬음 좋겠다.... 번거롭게 차트로 보고 저장하는거 말고 바로 파일로 저장할 수 없나.... 해서 다음 코드를 준비했습니다.

# 전체적으로 많이 나온 단어들 추출 (to file)
cloud = wc.generate(" ".join(result_string))
cloud.to_file("wordle.png")

WordCloud의 generate는 문자열을 받아서 긴 문자열에서 자주 나타난 단어들을 구름 이미지로 만들어요. 이것을 to_file 메소드로 바로 저장할 수 있는 코드입니다. 이번에 결과가 다른지 볼까요?

오우 훨씬 많은 단어가 나타나서 좀 정신없긴 하네요. 하지만 나쁘지 않은 것 같습니당 하하핳

오늘은 그럼 이만 전체 코드 첨부하고 마칠게요

import requests
import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from collections import Counter

result_string = []
for d in pd.date_range("2022-01-01", "2022-02-10"):
    date = d.date()
    url = f'https://catminzzi.tistory.com/manage/statistics/blog/{date}/day/keyword.json'
    headers = {
        'Cookie': '커잠 텊쿠키텊쿠키텊쿠키'}
    req = requests.get(url, headers=headers)
    obj = req.json()
    for result in obj["data"]["result"]:
        keyword = result["keyword"]
        count = result["count"]
        for _ in range(count):
            result_string.append(keyword)

wc = WordCloud(
    font_path="NotoSansKR-Regular.otf",
    background_color="white",
    max_font_size=60,
    width=600,
    height=400
)

# 상위 40개 자주 나온 단어만 추출 (to plt)
counts = Counter(result_string)
tags = counts.most_common(40)
cloud = wc.generate_from_frequencies(dict(tags))
plt.figure(figsize=(10, 8))
plt.axis("off")
plt.imshow(cloud)
plt.show()

# 전체적으로 많이 나온 단어들 추출 (to file)
cloud = wc.generate(" ".join(result_string))
cloud.to_file("wordle.png")

 

반응형

댓글