본문 바로가기

내일배움캠프/Today I Learned

[내배캠 회고록] 나의 네번째 회고록

오늘은 웹 개발 종합반에서 들었던 크롤링(웹 스크리핑) 기술을 미니 프로젝트에 녹여서 사용해보았다.

 

첫번째로 우리가 가장 친근하게 사용하는 네이버 뮤직(네이버 바이브)를 통해서 

웹 스크리핑을 하려고 시도하였으나, 보안상의 문제 때문인지 태그들이 불러와지지 않는다는 것을 알아차렸다. 

 

오늘 튜터님과 상담을 통해서 알게 된 정보로는 요즘 '웹 스크리핑' 기법이 핫하기 때문에 보안상의 문제로 막아두기도 한다고 말씀해주셨다. 

 

첫번째 시도했던 네이버 뮤직에 실패하고 두번째로 지니 뮤직을 이용하여 스크리핑에 도전하였다. 

이번 미니 프로젝트 팀명은  '코딩 잘하는 김.조.한' 

스크리핑 기법은 가수 김조한의 수 많은 노래들을 따와서 리스트로 보여주기 위해서 시도하였다. 

 

스크리핑하고자 하는 웹사이트에 들어가서 

'마우스 오른쪽 버튼 클릭 > 검사' 를 누르면 개발자 탭이 열림 

또 한번 '마우스 오른쪽 클릭 > copy > selector copy' 해당 태그의 경로가 copy가 되는 것을 볼 수 있다. 

 

copy한 태그 경로를 soup.select를 통해 공통된 경로를 잘라서 넣어주고 

내가 뽑고 싶은 내용의 태그들의 상세 경로를 위와 같은 동일한 방법을 통해서 동일한 경로를 제외한 나머지 경로를 

select.one() 메소드를 사용하여 변수에 담아주면 된다. 

 

담아준 변수들을 하나의 doc에 담아(배열...모양이긴 하지만 배열이 맞는지 모르겟..!! 이부분은 다시 찾아보고 수정하기)

연결된 db에  key값을 담아주면 된다. 

 

※ 참고로

1) .text

ex : <span>개발자</span> 태그 안에 있는 '개발자' 텍스트 값만 가져올 때 사용

2)  ['속성명']

 ex: music.select_one('td > a > img')['src']  => 뽑고자 하는 img태그의 src속성 값을 가져올 때 사용

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('mongodb://sparta:sparta@43.201.105.241', 27017)
db = client.johan

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://www.genie.co.kr/detail/artistSong?xxnm=14945151', headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

musics = soup.select('#songlist-box > div.music-list-wrap > table > tbody > tr')

for music in musics:
        image = music.select_one('td > a > img')['src']
        title = music.select_one('td.info > a.title.ellipsis')['title']
        album = music.select_one('td.info > a.albumtitle.ellipsis').text

        doc = {
            'image': image,
            'title': title,
            'album': album
        }
        db.musics.insert_one(doc)

@app.route("/api/music", methods=["GET"])
def music_get():
    find = list(db.musics.find({}, {'_id': False}))
    return jsonify({'musics': find})

해당 코드를 실행 한 결과물

 

 

해당 곡의 제목을 클릭하면 해당 곡의 상세 정보 url로 연결 시키려고 시도하였으나

김조한 노래 리스트에 있는 곡의 id값과 url로 연결되는 id값이 달라서 연결에 시간이 걸리고 있다. 

리스트를 뽑는 것 까지 완성하였으니 이제는 paging이 가능할 수 있도록 구현 해볼 예정이다.