2-4. BeautifulSoup를 이용한 Mnet 차트 크롤링 하기[함수]

2018. 5. 26. 13:49Coding/Python

728x90

1. 1-100위까지 추출하기

기존 주소로는 1-50위까지만 추출이 가능했으니, 2페이지에 있는 51-100위까지의 차트도 이어서 출력해 봅니다.

1페이지는 http://www.mnet.com/chart/TOP100/ 이렇게 나오지만,

2페이지를 가보면 http://www.mnet.com/chart/TOP100/2018052613?pNum=2 이런식으로 나오기 때문에

구조를 짐작해볼 수 있습니다.


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

 /2018052613

 ?pNum=2

 엠넷 차트 주소

 날짜와 시간

페이지 

이러한 구조를 가지고 있고,

'날짜와 시간'의 경우 지금은 YYYYMMDDHH의 구조를 가지고 있지만,

YYYY                    -    해당 연도 차트

YYYYMM              -    해당 달의 차트

YYYYMMDD         -    해당 날의 차트

YYYYMMDDHH    -    해당 날의 특정 시간의 차트(1시간 단위)

이런 식으로 활용이 가능하다.


http://www.mnet.com/chart/TOP100/?pNum=2

'날짜와 시간'을 지우면 항상 최신 차트의 결과 값을 받아 볼 수 있다.


[변경 부분]

1
req = requests.get('http://www.mnet.com/chart/TOP100/')
cs

아래와 같이 수정

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


하위 코드는 전부 for 문 안에 넣는다.


[수정 코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
from bs4 import BeautifulSoup as BS
 
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')
 
    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
 
        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
        print(rank, img, title, artist, album)
cs

1위 http://cmsimg.mnet.com/clipimage/album/50/002/949/2949825.jpg 여행 볼빨간사춘기 Red Diary Page.2

2위 http://cmsimg.mnet.com/clipimage/album/50/002/949/2949825.jpg 바람사람 볼빨간사춘기 Red Diary Page.2

...

...

...

99위 http://cmsimg.mnet.com/clipimage/album/50/002/908/2908495.jpg Fly Away 신승훈 더 콜(The Call) 첫 번째 프로젝트

100위 http://cmsimg.mnet.com/clipimage/album/50/002/828/2828127.jpg 내가 더 나빠 헤이즈(Heize) 바람


이런식으로 출력되면 성공






2. 함수로 만들기

재사용의 효율과 코드를 간결하게 만들기 위해서 함수를 만듭니다.

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
import requests
from bs4 import BeautifulSoup as BS
 
def mnet_Crawling(html):
    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
 
        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
        print(rank, img, title, artist, album)
 
 
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_Crawling(html)
cs

결과는 당연히 바로 위의 '1. 1-100위까지 추출하기'와 동일합니다.


'tr_list =' 부터 'for문'까지 함수 mnet_Crawling()에 넣어주면 끝




728x90