웹크롤러는 다양한 사이트에서 데이터를 가져오고 최신으로 유지합니다. 지난번에 node.js환경에서 멜론차트 데이터를 가져오는 방법을 소개했었는데, 이번에는 파이썬으로 해 볼 예정입니다.
멜론 사이트 구조가 변경되어 제대로 작동하지 않습니다. 하단의 최종 코드는 작동되는 코드로 수정하였습니다. 설명은 빠른 시일 내에 수정하겠습니다.
Intro
node.js 로의 웹크롤링이 궁금하다면,
Node.js로 멜론 순위 차트 데이터 파싱 참고
파이썬의 requests
와 BeautifulSoup
모듈을 이용하여 진행합니다.
requests
requests 모듈은 파이썬에서 HTTP 요청을 할 수 있게 합니다.
requests 설치
1 |
$ pip install requests |
python3 에서는
1 |
$ pip3 install requests |
그 뒤에 파이썬 파일을 하나 만들어서 requests 모듈을 추가해 줍니다.
(http://docs.python-requests.org 참고)
1 |
import requests |
그 뒤로 다음 코드들을 추가해 줍니다.
가끔 튕겨나는 현상이 있어서, header을 추가해줍니다 (2018.05.19 수정)
1 2 3 4 |
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'} melon = requests.get('https://www.melon.com/chart/index.htm', headers = header) # 멜론차트 웹사이트 melon_html = melon.text melon_parse= BeautifulSoup(melon_html, 'html.parser') |
requests 모듈의 get() 메소드로 웹사이트에 http 요청을 하고 → html 텍스트를 저장합니다.
BeautifulSoup
이제 가져온 html 텍스트를 파싱합니다.
다시말해, 원하는 태그만 가져오고 그 태그 내의 문자열을 처리할 수 있습니다. 근데 그러기 위해서는 우선 파싱할 웹페이지가 어떻게 구성이 되어있는지 확인해야 합니다.
Chrome
의 개발자도구에서 해당 웹사이트의 태그를 확인할 수 있습니다.
ellipsis rank01
→ span
→ a
에 곡정보
ellipsis rank02
→ span
에 아티스트 정보가 있습니다.
이 태그를 쉽게 가져오는 법은
우클릭 → Copy → Copy selector
1 2 |
title = melon_parse.select('#lst50 > td > div > div > div.ellipsis.rank01 > span > a') artist = melon_parse.select('#lst50 > td > div > div > div.ellipsis.rank02 > span') |
그리고 이렇게 입력해 줍니다. 이는 html에서 select 메소드가 가리키는 경로의 태그를 가져오는 것입니다.
출력
이제 원하는 정보를 가져왔으니, 출력하는 일만 남았습니다.
1 2 3 |
rank = 10 for r in range(rank): print(title[r].text + " - " + artist[r].text) |
상위 10개의 목록을 출력하는 코드 입니다.
결과
1 2 3 4 5 6 7 8 9 10 11 |
$ python parser_simple01.py 꽃 길 - BIGBANG 별이 빛나는 밤 - 마마무 사랑을 했다 (LOVE SCENARIO) - iKON Jenga (Feat. Gaeko) - 헤이즈 (Heize) 뿜뿜 - 모모랜드 (MOMOLAND) 그날처럼 - 장덕철 그때 헤어지면 돼 - 로이킴 내가 더 나빠 - 헤이즈 (Heize) HandClap - Fitz & The Tantrums Bad Boy - Red Velvet (레드벨벳) |
최종 코드 (수정됨) 위 설명 수정 예정
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 if __name__ == "__main__": RANK = 54 header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'} req = requests.get('https://www.melon.com/chart/index.htm', headers = header) html = req.text parse = BeautifulSoup(html, 'html.parser') titles = parse.find_all("div", {"class": "ellipsis rank01"}) songs = parse.find_all("div", {"class": "ellipsis rank02"}) title = [] song = [] for t in titles: title.append(t.find('a').text) for s in songs: song.append(s.find('span', {"class": "checkEllipsis"}).text) for i in range(RANK): print('%3d위: %s - %s'%(i+1, title[i], song[i])) |