크롤링

카톡 스크랩핑

AI Sonny 2022. 6. 23. 21:55
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