728x90
이번에는 카카오톡 스크랩핑을 해보았다. 크롤링을 하고 싶었지만 결과물을 빨리 보고싶어 스크랩핑을 하였다.
나중에 크롤링도 해볼 예정이다.
일단 카톡에 채팅방에 들어가 상단에 작대기 3개를 클릭한다. 이 후 다음과 같이 내보내서 메모장으로 저장한다.

이 후 주피터 노트북을 켜서 다음과 같이 정리한다.
text = ""
with open("C:/Users/user2009/Desktop/KakaoTalk_20220527_2113_31_207_group.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
for line in lines[4:]: # 4번째 줄까지 필요없는 데이터 제거
text+=line
~~ 님과 카카오톡 대화
저장한 날짜 : 2022-05-27 21:13:35
--------------- 2021년 4월 24일 토요일 ---------------
위와 같이 필요없는 맨 위 4번째 줄까지의 데이터를 제거하고, print(text) 출력을 하면 된다.
[이름][시간] 대화내용으로 출력이 된다.
text = ""
with open("C:/Users/user2009/Desktop/KakaoTalk_20220527_2113_31_207_group.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
for line in lines[4:]:
if '] [' in line:
text+=line
print(text)
나는 이전의 분류된 데이터를 보고 ] [ 을 기준으로 데이터를 다음과 같이 분류하였다.
text = ""
with open("C:/Users/user2009/Desktop/KakaoTalk_20220527_2113_31_207_group.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
for line in lines[4:]:
if '] [' in line:
text+=line.split(']')[0] # 시간 데이터 분류
text+=line.split(']')[2]
print(text)
그러면 [이름 대화내용으로 출력이 된다!
print(text)
chat = open("C:/Users/user2009/Desktop/KakaoTalk_20220527_2113_31_207_group.txt", encoding="utf-8")
#추출을 위한 채팅 원본 파일로, 읽기 모드로 가져온다. 'r'값은 기본값이라 생략했다.
mhchat = open("C:/Users/user2009/Desktop/MhChats.txt", 'w', encoding="utf-8")
sikchat = open("C:/Users/user2009/Desktop/SikChats.txt", 'w', encoding="utf-8")
inschat = open("C:/Users/user2009/Desktop/InsChats.txt", 'w', encoding="utf-8")
zingchat = open("C:/Users/user2009/Desktop/ZingChats.txt", 'w', encoding="utf-8")
mechat = open("C:/Users/user2009/Desktop/MeChats.txt", 'w', encoding="utf-8")
mychat = open("C:/Users/user2009/Desktop/MyChats.txt", 'w', encoding="utf-8")
#각 사용자별로 새 텍스트 파일을 생성해준다. 'w' 쓰기모드
mh = "윤**] ["
sik = "전**] ["
ins = "허**] ["
zing = "정**] ["
me = "허**] ["
my = "손*] ["
# 친구들 이름 +" : "
# 해당 문자열이 들어있으면 추출해서 따로 저장할 예정
nonchating = ['사진','샵검색','이모티콘','동영상']
# 일반적인 채팅 내용이 아닌 것들은 예외처리를 해주기 위해 리스트에 넣는다
while True:
line = chat.readline()
#채팅 내용에서 한 줄씩 가져와준다
#print(line)
if not line:
break
#더 가져올 줄이 없으면 break
isOk = True
#예외처리에 필요한 변수 하나 선언
for item in nonchating:
#아이템 안에 들어있는 요소들마다
if item in line:
#줄에 그 내용이 있으면
isOk = False
#다음 단계로 넘기지 마
break
if isOk:
#문제가 없으면 Keep Going~
if mh in line:
#mh라는 친구가 한 말이면
line = line.split("]")[2]
#split으로 대화 내용만 추출한다.
mhchat.write(line)
#mhchat파일에 추출한 대화 내용을 써준다.
if sik in line:
line = line.split("]")[2]
sikchat.write(line)
if ins in line:
line = line.split("]")[2]
inschat.write(line)
if zing in line:
line = line.split("]")[2]
zingchat.write(line)
if me in line:
line = line.split("]")[2]
mechat.write(line)
if my in line:
line = line.split("]")[2]
mychat.write(line)
#python에는 스위치문이 없어서 elif나 아니면 딕셔너리를 사용한다고 한다.
chat.close()
mhchat.close()
sikchat.close()
inschat.close()
zingchat.close()
mechat.close()
mychat.close()
#file 객체 다 닫아줌
위와 같은 코드로 각자의 친구들의 파일을 만들고, 사진, 동영상, 이모티콘, 샵검색을 없애준다.
그리고 파일에 추출된 내용들을 넣는다.
마지막으로 각자의 파일들을 닫아준다!
import operator
mhchat = open("C:/Users/user2009/Desktop/MhChats.txt", 'r', encoding="utf-8")
mhchatfreq = open("C:/Users/user2009/Desktop/MhChatsFreq.txt", 'w', encoding="utf-8")
sikchat = open("C:/Users/user2009/Desktop/SikChats.txt", 'r', encoding="utf-8")
sikchatfreq = open("C:/Users/user2009/Desktop/SikChatsFreq.txt", 'w', encoding="utf-8")
inschat = open("C:/Users/user2009/Desktop/InsChats.txt", 'r', encoding="utf-8")
inschatfreq = open("C:/Users/user2009/Desktop/InsChatsFreq.txt", 'w', encoding="utf-8")
zingchat = open("C:/Users/user2009/Desktop/ZingChats.txt", 'r', encoding="utf-8")
zingchatfreq = open("C:/Users/user2009/Desktop/ZingChatsFreq.txt", 'w', encoding="utf-8")
mechat = open("C:/Users/user2009/Desktop/MeChats.txt", 'r', encoding="utf-8")
mechatfreq = open("C:/Users/user2009/Desktop/MeChatsFreq.txt", 'w', encoding="utf-8")
mychat = open("C:/Users/user2009/Desktop/MyChats.txt", 'r', encoding="utf-8")
mychatfreq = open("C:/Users/user2009/Desktop/MyChatsFreq.txt", 'w', encoding="utf-8")
#기존에 저장한 각 화자별 대화 내용을 가져오고,
#단어와 빈도수를 저장할 freq파일을 생성한다.
#function을 하나 만들어서 간단히 처리해보자
def get_freq(chat_file, out_file):
#chat_file은 대화 내용이 담긴 텍스트 파일, out_file은 빈도를 저장할 file이다.
# 생각해보니 그냥 chat_flie만 받아서 해도 되었을텐데... 또 바보같이 했다.
freq = {}
# 단어와 빈도를 저장할 딕셔너리 생성
while True:
line = chat_file.readline()
if not line:
break
#읽어오는 부분은 동일하다
lines = line.split("]")
#공백으로 단어를 구분한다
for i in lines:
#구분한 단어들을,
i = i.replace('\n', '')
#개행문자를 제거한 후
count = freq.get(i, 0)
#기존에 저장된 빈도 딕셔너리에서 가져온다
#없는 값이라면(처음 보는 값이라면) 0과 함께 저장
freq[i] = count + 1
#이렇게 하면 i라는 단어의 value는 기존에 존재했다면 +1, 처음이라면 1이 저장된다
frequency_list = sorted(freq.items(), key=operator.itemgetter(1), reverse=True)
#저장된 딕셔너리의 값을 빈도수가 높은 순서대로 재정렬 해준다. 낮은 순서대로 하려면 reverse=False
'''
# sorted(dict.items(), key=operator.itemgetter(0))
# key=operator.itemgetter(0)는 정렬하고자 하는 키 값을 0번째 인덱스로 한다.
# 딕셔너리 자료형에서 0번째 인덱스는 Key.
# 1번째 인자는 Value니까 1로 해야한다.
'''
for words in frequency_list:
out_file.write(words[0] + " : " + str(words[1]) + "\n")
#정렬된 딕셔너리 자료형을 보기 좋게 {단어} : {빈도} \n 로 저장한다.
chat_file.close()
out_file.close()
get_freq(mhchat, mhchatfreq)
get_freq(sikchat, sikchatfreq)
get_freq(inschat, inschatfreq)
get_freq(zingchat, zingchatfreq)
get_freq(mechat, mechatfreq)
get_freq(mychat, mychatfreq)
#5명 반복
마지막으로 각자의 파일에서 빈도가 많은 단어들을 세어 빈도수가 많은 순으로 정렬하여 나타내준다!
스크랩핑을 혼자하면서 코딩을 100% 혼자서 한 것이 아닌 다른 사람들의 것을 보고하였다.
다음번에 크롤링할 때는 혼자서 더 많은 코딩을 할 수 있었으면 좋겠다.
728x90
댓글