본문 바로가기

개발

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

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



###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)




반응형