본문 바로가기

개발

파이썬 코드로 멜론 노래 크롤링

반응형
다음 강의를 보고 작성한 필기입니다.

###1

멜론사이트에서 검색 시
개발자모드 > network > all 을 보면
각 글자가 바뀔때마다 새로운 json파일이 뜸.
이 json파일에서 우클릭 > open in new tab 했을 때의 결과물을 크롤링 하는 것.
이 탭의 url복사해두기

###2

파이썬 새 파일 melon_search.py 생성



import requests
url = "http://www.melon.com/search/keyword/index.json?jscallback=jQuery191035080718916700837_1500265008682&query=%25EC%2597%2590%25ED%2594%25BD%25ED%2595%2598%25EC%259D%25B4&_=1500265008687"
#아까 json파일의 url
response = requests.get(url).text
print(response)

###3 패러미터 분리

위 json url
http://www.melon.com/search/keyword/index.json?jscallback=jQuery191035080718916700837_1500265008682&query=%25EC%2597%2590%25ED%2594%25BD%25ED%2595%2598%25EC%259D%25B4&_=1500265008687
에서 ? 뒷부분이 파라미터임. 이것만 따로 분리해서 넣어주자.
import requests
url = "http://www.melon.com/search/keyword/index.json"
params = {'jscallback':'jQuery191035080718916700837_1500265008682', 'query':'에픽하이',
    }
response = requests.get(url, params=params).text
print(response)
강의에는 없지만 이렇게 하면 쿼리부분이 한글이라서 에러가 남. 맨위에 한글인코딩을 위한 코드
#-*- coding: utf-8 -*-
추가

###4 json string -> python dictionary

- 문자열 정리
response.replace(params['jscallback']+'(', '').replace(');','')
- json 임포트
import json
- dictionary 만들기
json_string = response.replace(params['jscallback']+'(', '').replace(');','')
result_dict = json.loads(json_string)
print(result_dict)
#-*- coding: utf-8 -*-
import json
import requests
url = "http://www.melon.com/search/keyword/index.json"
params = {'jscallback':'jQuery191035080718916700837_1500265008682', 'query':'에픽하이'}
response = requests.get(url, params=params).text
json_string = response.replace(params['jscallback']+'(', '').replace(');','')
result_dict = json.loads(json_string)
print(result_dict)

###5. 노래 제목 + 노래 디테일 링크 출력

#-*- coding: utf-8 -*-
import json
import requests
url = "http://www.melon.com/search/keyword/index.json"
params = {'jscallback':'jQuery191035080718916700837_1500265008682', 'query':'터보'}
response = requests.get(url, params=params).text
json_string = response.replace(params['jscallback']+'(', '').replace(');','')
result_dict = json.loads(json_string)
for song in result_dict['SONGCONTENTS']:
  print('''{SONGNAME} {ALBUMNAME} {ARTISTNAME}
  http://www.melon.com/song/detail.htm?songId={SONGID}'''.format(**song))

###6. 터미널에서 사용자가 입력한 값에 대한 검색이 되도록 변경

#-*- coding: utf-8 -*-
import json
import requests
def melon_search(q):
  url = "http://www.melon.com/search/keyword/index.json"
  params = {'jscallback':'jQuery191035080718916700837_1500265008682', 'query':q}
  response = requests.get(url, params=params).text
  json_string = response.replace(params['jscallback']+'(', '').replace(');','')
  result_dict = json.loads(json_string)
  for song in result_dict['SONGCONTENTS']:
    print('''{SONGNAME} {ALBUMNAME} {ARTISTNAME}
    http://www.melon.com/song/detail.htm?songId={SONGID}'''.format(**song))
if __name__ == '__main__':
  print("찾으려는 것을 입력하세요 : ")
  line = input()
  melon_search(line)

###7. 찾으려는 값이 없을 경우 처리

#-*- coding: utf-8 -*-
import json
import requests #웹 리퀘스트
def melon_search(q):
  url = "http://www.melon.com/search/keyword/index.json"
  params = {'jscallback':'jQuery191035080718916700837_1500265008682', 'query':q}
  response = requests.get(url, params=params).text
  # response = BeautifulSoup(r.content, 'html.parser', from_encoding='utf-8')
  json_string = response.replace(params['jscallback']+'(', '').replace(');','')
  result_dict = json.loads(json_string)
  if 'SONGCONTENTS' not in result_dict:
    print('[찾으시는 결과가 없습니다]')
  else:
    for song in result_dict['SONGCONTENTS']:
      print('''{SONGNAME} {ALBUMNAME} {ARTISTNAME}
      http://www.melon.com/song/detail.htm?songId={SONGID}'''.format(**song))
if __name__ == '__main__':
  print("찾으려는 것을 입력하세요")
  line = input()
  melon_search(line)


반응형