3-2. 크롤링한 데이터를 csv 파일 만들기

2018. 6. 10. 17:45Coding/Python

728x90


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import requests
from bs4 import BeautifulSoup as BS
import csv
 
def mnet_Crawling(html):
    temp_list = []
    temp_dict = {}
 
    tr_list = html.select('div.MnetMusicList.MnetMusicListChart > div.MMLTable.jQMMLTable > table > tbody > tr')
 
    for tr in tr_list :
        rank = int(tr.find('td',{'class':'MMLItemRank'}).find('span').text.strip('위'))
 
        img = tr.find('td',{'class':'MMLItemTitle'}).find('div',{'class':'MMLITitle_Album'}).find('img')['src']
        img = tr.find('td',{'class':'MMLItemTitle'}).find('div',{'class':'MMLITitle_Album'}).find('img').get('src')
 
        title = tr.find('td',{'class':'MMLItemTitle'}).find('div',{'class':'MMLITitle_Box info'}).find('a',{'class':'MMLI_Song'}).text
        artist = tr.find('td',{'class':'MMLItemTitle'}).find('div',{'class':'MMLITitle_Box info'}).find('a',{'class':'MMLIInfo_Artist'}).text
        album = tr.find('td',{'class':'MMLItemTitle'}).find('div',{'class':'MMLITitle_Box info'}).find('a',{'class':'MMLIInfo_Album'}).text
        temp_list.append([rank, img, title, artist, album])
        temp_dict[str(rank)] = {'img':img, 'title':title, 'artist':artist, 'album':album}
 
 
 
    return temp_list, temp_dict
#============================================================ End of mnet_Crawling() ============================================================#
 
 
def toCSV(mnet_list):
    file = open('mnet_chart.csv''w', encoding='utf-8', newline='')
    csvfile = csv.writer(file)
    for row in mnet_list :
        csvfile.writerow(row)
    file.close()
#============================================================ End of toCSV() ============================================================#
 
mnet_list = []
mnet_dict = {}
 
req = requests.get('http://www.mnet.com/chart/TOP100/')
 
for page in [1,2]:
    req = requests.get('http://www.mnet.com/chart/TOP100/?pNum={}'.format(page))
    html = BS(req.text, 'html.parser')
    
    mnet_temp = mnet_Crawling(html)
    mnet_list += mnet_temp[0]
    mnet_dict = dict(mnet_dict, **mnet_temp[1])
 
# 리스트 출력
for item in mnet_list :
    print(item)
 
# 사전형 출력
for item in mnet_dict :
    print(item, mnet_dict[item]['img'], mnet_dict[item]['title'], mnet_dict[item]['artist'], mnet_dict[item]['album'])
 
# CSV파일 생성
toCSV(mnet_list)
 
 
cs

CSV모듈이 다 처리해주니, 이를 이용하면 간단합니다.


1. csv모듈 import

import csv




2. toCSV()함수 생성

# CSV파일 생성
toCSV(mnet_list)


def toCSV(mnet_list):
    file = open('mnet_chart.csv''w', encoding='utf-8', newline='')
    csvfile = csv.writer(file)
    for row in mnet_list :
        csvfile.writerow(row)
    file.close()


file =

 open

'mnet_chart.csv'

'w' 

encoding='utf-8' 

newline='' 

 변수

파일생성하는 함수 

생성하는 파일명 

write쓰기모드 

 오류날경우

안하면 마지막에 공백 생김 

encoding = 'utf-8'의 경우, 

에러가 안나는 경우도 있지만, 사용하는 에디터에 따라서 에러가 나기도합니다.

아래와 같은 에러가 나는 경우에 넣으면됩니다.

UnicodeEncodeError: 'ascii' codec can't encode characters in position 64-67: ordinal not in range(128)


newline = ''의 경우,

csv파일을 만들때, 각각의 라인뒤에 빈라인이 생기는데, 이를 제거하는 옵션입니다.




Tip

1
2
3
4
5
6
def toCSV(mnet_list):
    file = open('mnet_chart.csv''w', encoding='utf-8', newline='')
    csvfile = csv.writer(file)
    for row in mnet_list :
        csvfile.writerow(row)
    file.close()
cs

대신에 ↓↓↓ 아래와같이 쓸 수 있습니다.

file.close()를 자동으로 해주기 때문에 편리합니다.

1
2
3
4
5
def toCSV(mnet_list):
    with open('mnet_chart.csv''w', encoding='utf-8', newline='') as file :
        csvfile = csv.writer(file)
        for row in mnet_list:
            csvfile.writerow(row)
cs


728x90