2018. 5. 26. 13:49ㆍCoding/Python
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()에 넣어주면 끝
'Coding > Python' 카테고리의 다른 글
3-2. 크롤링한 데이터를 csv 파일 만들기 (0) | 2018.06.10 |
---|---|
3-1. 크롤링한 데이터를 리스트화 List [], 사전화 Dict {} (3) | 2018.05.27 |
2-3. BeautifulSoup를 이용한 Mnet 차트 크롤링 하기[데이터 접근] (1) | 2018.05.22 |
2-2. BeautifulSoup를 이용한 Mnet 차트 크롤링 하기[import 모듈] (0) | 2018.05.20 |
2-1. BeautifulSoup를 이용한 Mnet 차트 크롤링 하기[분석] (0) | 2018.05.20 |