http://db-log.tistory.com/entry/22-BeautifulSoup%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-Mnet-%EC%B0%A8%ED%8A%B8-%ED%81%AC%EB%A1%A4%EB%A7%81-%ED%95%98%EA%B8%B0-1


http://www.mnet.com/chart/TOP100



1) 기본패턴

## mnet 50위 까지,,,,,크롤링 기본 패턴
import requests
from bs4 import BeautifulSoup

req = requests.get('http://www.mnet.com/chart/TOP100/') #웹 찾기
html = BeautifulSoup(req.text, 'html.parser') #내용 가져오기


tr_list = html.select('div.MMLTable.jQMMLTable > table > tbody > tr') #select는 find_all은 []같은 list를 만드는 것이다.
for tr in tr_list :
rank = tr.find('td', {'class':'MMLItemRank'}).find('span').text
title = tr.find('a', {'class':'MMLI_Song'}).text
artist = tr.find('a',{'class':'MMLIInfo_Artist'}).text
album = tr.find('a', {'class':'MMLIInfo_Album'}).text

img = tr.find('div',{'class':'MMLITitle_Album'}).find('img').get('src') # 1
print(rank, title, artist, album, img)



#1   또는 img = tr.find('div', {'class': 'MMLITitle_Album'}).find('img')['src']


#find 데이터 접근

1. 접근 방법

.find('태그')

.find_all('태그')

.select('태그주소')

.select_one('태그주소')

이렇게 네가지가 있고,


.find('태그') / .select_one('태그주소') 

태그나 태그주소를 통해 하나의 값을 반환합니다.

여러개일경우 최초 1개만 반환합니다.


.find_all('태그') / .select('태그주소')

태그나 태그주소를 통해 검색된 모든 결과를 List[] 목록으로 반환합니다.

-접근 코딩방법

tr_list1 = html.find_all('div',{'class':'MMLTable jQMMLTable'})

tr_list2 = html.find_all(class_='MMLTable jQMMLTable')

tr_list3 = html.select('div.MnetMusicList.MnetMusicListChart > div.MMLTable.jQMMLTable')


find 항목 설정은 쉽다... 

그냥 select로 최대한 가까운곳까지 설정하고(3번째방법)

find로  태그 적은 다음에,,,옆에 클래스(or id)와 클레스 제목을 적으면된다,., (1번째방법) 





2) 함수 형태로 만들어 부품화 하기

## mnet 100위까지,,,, 2페이지,,, ,함수부품만들기,,,,
import requests
from bs4 import BeautifulSoup

#----find또는select등 문서를 찾는 애들끼리 함수 def로 묶는다...----------------------------------------------------
def mnet_Crawling(html):
tr_list = html.select('div.MMLTable.jQMMLTable > table > tbody > tr') #select는 find_all은 []같은 list를 만드는 것이다.
for tr in tr_list:
rank = tr.find('td', {'class':'MMLItemRank'}).find('span').text
artist = tr.find('a', {'class': 'MMLIInfo_Artist'}).text
title = tr.find('a', {'class':'MMLI_Song'}).text
album = tr.find('a', {'class':'MMLIInfo_Album'}).text
img = tr.find('div',{'class':'MMLITitle_Album'}).find('img').get('src')
print(rank, artist, title, album, img)
#-------------------------------------------------------------------------------

for page in [1, 2]:
req = requests.get('http://www.mnet.com/chart/TOP100/?pNum={}'.format(page))
html = BeautifulSoup(req.text, 'html.parser')
mnet_Crawling(html) #결과 내기,,,for 구문에 들어가야한다..위의 내용을 부품화해서 for구문에 넣은 것




3) 리스트화 하기  

from bs4 import BeautifulSoup


def mnet_Crawling(html):
temp_list = [] #임시 리스트 선언
tr_list = html.select('div.MMLTable.jQMMLTable > table > tbody > tr')
for tr in tr_list:
# rank = tr.find('td', {'class':'MMLItemRank'}).find('span').text
rank = int(tr.find('td', {'class':'MMLItemRank'}).find('span').text.strip('위')) #위 빼기, int()는 굳이 왜 집어 넣는지 잘 모르겠다.
artist = tr.find('a', {'class': 'MMLIInfo_Artist'}).text
title = tr.find('a', {'class':'MMLI_Song'}).text
album = tr.find('a', {'class':'MMLIInfo_Album'}).text
img = tr.find('div',{'class':'MMLITitle_Album'}).find('img').get('src')

temp_list.append([rank, artist, title, album, img]) # temp_list[] 에 append()추가
return temp_list
# ============================================================ End of mnet_Crawling() ==============================

mnet_list = [] #리스트 선언

for page in [1, 2]:
req = requests.get('http://www.mnet.com/chart/TOP100/?pNum={}'.format(page))
html = BeautifulSoup(req.text, 'html.parser')

mnet_list += mnet_Crawling(html)
#1
#리스트 출력
for item in mnet_list:
print(item)



#1

mnet_list = mnet_Crawling(html) 가 아닌,,이렇게 mnet_list = mnet_list + mnet_Crawling(html) 기존 리스트(1페이지)에 새로운 리스트(2페이지)를 해준다

 mnet_list가 기존페이지,,, mnet_Crawling(html)가 추가되는 페이지




4) 사전화 하기


import requests
from bs4 import BeautifulSoup

def mnet_Crawling(html):
temp_dict = {}
tr_list = html.select('div.MMLTable.jQMMLTable > table > tbody > tr')
for tr in tr_list:
rank = tr.find('td', {'class':'MMLItemRank'}).find('span').text.strip('위') # 1
artist = tr.find('a', {'class': 'MMLIInfo_Artist'}).text
title = tr.find('a', {'class':'MMLI_Song'}).text
album = tr.find('a', {'class':'MMLIInfo_Album'}).text
img = tr.find('div',{'class':'MMLITitle_Album'}).find('img').get('src')

temp_dict[rank] = {'img': img, 'title': title, 'artist': artist, 'album': album}
return temp_dict
# ============================================================ End of mnet_Crawling() ===============================

mnet_dict = {}

for page in [1, 2]:
req = requests.get('http://www.mnet.com/chart/TOP100/?pNum={}'.format(page))
html = BeautifulSoup(req.text, 'html.parser')

mnet_dict = dict(mnet_dict, **mnet_Crawling(html)) #리스트와 비슷하게 += 개념이지만,,, 그렇게 표현 하지 않는다...

# 사전형 출력
for item in mnet_dict:
print(item, mnet_dict[item]['img'], mnet_dict[item]['title'], mnet_dict[item]['artist'], mnet_dict[item]['album'])


#1

int()를 그냥 아얘 없애 버렸다..... 설명으로는 순위가 숫자니까 정수화 시켰다고 했다..

그렇게 되면.. rank가 에러가 생긴다.....  string(rank) 이렇게 해야하는데,,, 굳이 이렇게 할필요는 없을듯




5) 리스트화 사전화 동시에 하기

import requests
from bs4 import BeautifulSoup


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 = tr.find('td', {'class': 'MMLItemRank'}).find('span').text.strip('위')
artist = tr.find('a', {'class': 'MMLIInfo_Artist'}).text
title = tr.find('a', {'class':'MMLI_Song'}).text
album = tr.find('a', {'class':'MMLIInfo_Album'}).text
img = tr.find('div',{'class':'MMLITitle_Album'}).find('img').get('src')

temp_list.append([rank, img, title, artist, album])
temp_dict[rank] = {'img': img, 'title': title, 'artist': artist, 'album': album}
return temp_list, temp_dict


# ============================================================ End of mnet_Crawling() =================================

mnet_list = []
mnet_dict = {}

for page in [1, 2]:
req = requests.get('http://www.mnet.com/chart/TOP100/?pNum={}'.format(page))
html = BeautifulSoup(req.text, 'html.parser')

mnet_list += mnet_Crawling(html)[0] # 0 1 이렇게 표시한 이유는 ( [] , {} ) 이런 개념이라서 그런듯
mnet_dict = dict(mnet_dict, **mnet_Crawling(html)[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'])


# 리스트화 사전화 하는 이유

크롤링만 해서는 단순히 텍스트 데이터기 때문에
데이터를 활용하기 위해서 리스트화나 사전화를 합니다.

텍스트의 경우는 내용의 구분 없이 하나의 문장일 뿐이지만,
리스트화나 사전화를 하게되면 인덱스나, 키값을 통해서 다양한 접근이 가능하게되어 데이터를 다루는데 있어서 효율성이 크게 증가합니다.








































+ Recent posts