Stage2 - 데이터 csv파일로 저장하기

csv파일의 개념을 이해하고, 파일쓰기를 통해 직접 csv파일을 만들어봅니다. 3주차의 네이버 TV 데이터 수집결과를 csv형식으로 저장합니다.

csv파일의 개념과 csv파일 만들기

csv파일의 개념 이해하기

웹 상에서 필요한 데이터를 찾아 다운받아보면 csv형태로 저장되어있는 경우가 많습니다. 주로 csv파일을 엑셀과 같은 프로그램으로 실행하다보니 csv가 전용프로그램으로 만들 수 있는 표형식의 데이터라고 생각하는 사람이 많은데요. 사실 csv는 아주 간단한 모양의 데이터 저장 방식으로 메모장으로 csv파일을 만들 수 있습니다.

csvcomma separated value의 약자입니다. 말 그대로 콤마(,)로 구분되어지는 값들이라는 뜻입니다. 1주차에 html파일을 만든 것과 마찬가지로 메모장(텍스트 편집기)을 켜서 아래와 같이 값을 적고, test.csv로 저장합니다.

test.csv를 엑셀 파일로 열면 다음과 같이 표형식으로 데이터가 나타나게 됩니다.

위 예제에서 확인할 수 있듯이 csv는 콤마로 데이터를 구분해서 저장하는 방법입니다. 이 때, 콤마를 사용하면 데이터의 열이 구분되고, 줄바꿈을 사용하면 데이터의 열이 구분됩니다. 메모장을 통해서도 ,와 줄바꿈()만 사용하면 간단히 csv파일을 만들 수 있습니다.

파이썬으로 csv파일 만들기

스테이지1에서 다룬 파일변수를 사용해서 파이썬으로도 쉽게 csv파일을 만들 수 있습니다. 아래와 같이 위에서 만든 csv파일을 파이썬으로 만들어봅니다.

week4_2.py
f = open("hitsong.csv", "w")
singers = ["박정현", "임창정", "izi", "아이유"]
songs = ["꿈에", "소주한잔", "응급실", "좋은날"]
for i in range(len(singers)):
f.write(singers[i] + ',' + songs[i] + '\n')
f.close()

hitsong.csv라는 파일을 쓰기형식으로 열어서 파일변수 f에 저장하고, 리스트 형식으로 저장한 데이터 singerssongs를 범위를 이용한 반복문을 이용해서 f에 써줍니다.

f.write(singers[i] + ',' + songs[i] + '\n')

데이터의 열구분을 ,, 행구분을 \n을 통해 해주기 위해 문자열 더하기 방법을 사용합니다.

저장한 csv파일 내부의 데이터가 깨져보이는 경우에는 인코딩 옵션을 넣어줍니다.

f = open("hitsong.csv", "w", encoding="UTF-8")

*컴퓨터가 한글을 이해하는 방식이 다른 경우, 글자 깨짐 현상이 발생하는데요, encoding옵션을 사용하면이 이해하는 방식을 구체적으로 지정해주기 때문에 글자 깨짐현상을 피할 수 있습니다.

*파이참으로 생성한 파일 확인 방법

생성된 파일을 마우스 오른쪽클릭한 후, Reveal in Finder(Mac)/Show in Explorer(Win)을 선택하면 파일이 저장된 위치로 이동합니다. 이동한 디렉토리에서 파일을 더블클릭해서 실행합니다.

네이버TV 데이터 수집 내용 CSV로 저장하기

이번에는 3주차에 완성한 네이버TV 데이터 수집기에서 수집한 데이터를 csv파일로 저장해봅시다.

#0. 지난 코드 불러오기(3주차 Challenge1.)

3주차 challenge1의 데이터수집 코드를 가져옵니다. 3주차 - challenge1. *수집한 데이터를 문자로 변환시키는 부분을 일부 수정했습니다.

week4_3.py
import requests
from bs4 import BeautifulSoup
raw = requests.get("https://tv.naver.com/r")
html = BeautifulSoup(raw.text, "html.parser")
# 1위 - 100위 컨테이너 선택자: dl.cds_info
clips = html.select("dl.cds_info")
for cl in clips:
# 수정된 부분
title = cl.select_one("dt.title").text.strip()
chn = cl.select_one("dd.chn").text.strip()
hit = cl.select_one("span.hit").text.strip()
like = cl.select_one("span.like").text.strip()
print("제목", title)
print("채널명", chn)
print(hit)
print(like)
print("="*50)

#1. 파일만들기

수집한 데이터를 navertv.csv에 저장하기 위해서 navertv.csv파일을 쓰기모드(w)로 열어줍니다. close()를 이용해 파일을 닫아주는 것도 잊지 않고 추가합니다.

week4_3.py
import requests
from bs4 import BeautifulSoup
# navertv.csv파일을 쓰기모드(w)로 열어줍니다.
f = open("navertv.csv", "w")
raw = requests.get("https://tv.naver.com/r")
html = BeautifulSoup(raw.text, "html.parser")
... 생략 ...
print(like)
print("="*50)
# 작업이 끝난 파일을 닫습니다.
# 반복문 밖에서 닫아줍니다.
f.close()

#2. 헤더 추가하기

데이터 파일의 첫행은 헤더를 만들어준다.

데이터 세계에서는 첫번째 행에는 데이터의 구분(헤더)가 들어가고, 두번째 행부터 데이터가 적힌다는 암묵적인 룰이 있습니다.

아래와 같이 파일을 만들고 난 후 바로 헤더 부분을 추가해줍니다.

week4_3.py
import requests
from bs4 import BeautifulSoup
# navertv.csv파일을 쓰기모드(w)로 열어줍니다.
f = open("navertv.csv", "w")
# 헤더 추가하기
f.write("제목,채널명,재생 수,좋아요 수")
raw = requests.get("https://tv.naver.com/r")
html = BeautifulSoup(raw.text, "html.parser")
... 생략 ...

#3. 파일에 수집한 데이터 쓰기

기존에 데이터를 출력하는 부분에서 수집한 데이터를 파일에 쓰는 코드를 추가합니다. 행과 열의 구분을 위해서 ,\n을 추가합니다.

week4_3.py
... 생략
for cl in clips:
# 수정된 부분
title = cl.select_one("dt.title").text.strip()
chn = cl.select_one("dd.chn").text.strip()
hit = cl.select_one("span.hit").text.strip()
like = cl.select_one("span.like").text.strip()
print("제목", title)
print("채널명", chn)
print(hit)
print(like)
print("="*50)
# 파일에 내용을 입력합니다.
f.write(title + "," + chn + "," + hit + "," + like + "\n")
# 작업이 끝난 파일을 닫습니다.
# 반복문 밖에서 닫아줍니다.
f.close()

위 코드를 실행하면 수집한 데이터가 csv파일로 저장됩니다.

#4. 데이터 갈무리하기

, 제거하기

그런데 저장된 csv파일을 실행해보면 아래와 같이 데이터의 열이 맞지 않는 것을 확인할 수 있습니다.

원래제목: 장나라, 오아린 법정대리인 결정 '진심의 승리'

csv파일: 장나라 | 오아린 법정대리인 결정 '진심의 승리'

제목, 채널명, 재생 수, 좋아요 수에 포함된 ,를 csv파일 형식에서 열 구분자 ,로 이해했기 때문입니다. 2주차에서 실습한 문자열 replace함수를 활용하면 쉽게 ,를 제거할 수 있습니다.

week4_3.py
... 생략
for cl in clips:
# 수정된 부분
title = cl.select_one("dt.title").text.strip()
chn = cl.select_one("dd.chn").text.strip()
hit = cl.select_one("span.hit").text.strip()
like = cl.select_one("span.like").text.strip()
# replace 함수를 활용하여 ,를 제거합니다.
title = title.replace(",", "")
chn = chn.replace(",", "")
hit = hit.replace(",", "")
like = like.replace(",", "")
... 생략

숫자만 남기기

csv파일에 저장된 재생 수와 좋아요 수는 "재생 수364464", "좋아요 수1925"와 같이 텍스트가 포함되어있기 때문에 총 합을 구하거나 평균을 구하는 것과 같은 수치계산을 할 수 없습니다.

2주차에서 실습한 문자열 replace함수를 사용하거나 슬라이싱 방법을 활용해서 텍스트 부분을 삭제해줍니다.

week4_3.py
... 생략
for cl in clips:
# 수정된 부분
title = cl.select_one("dt.title").text.strip()
chn = cl.select_one("dd.chn").text.strip()
hit = cl.select_one("span.hit").text.strip()
like = cl.select_one("span.like").text.strip()
# replace 함수를 활용하여 ,를 제거합니다.
title = title.replace(",", "")
chn = chn.replace(",", "")
hit = hit.replace(",", "")
like = like.replace(",", "")
# replace함수를 활용해서 "재생 수" 제거
hit = hit.replace("재생 수", "")
# 슬라이싱을 활용해서 "좋아요 수" 제거
like = like[5:]
... 생략

여기까지 처리해준 후에 코드를 실행하면 원하는 모양의 csv파일을 만들어낼 수 있습니다.

실행 결과