본문 바로가기
크롤링

카톡 스크랩핑

by AI Sonny 2022. 6. 23.
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

댓글