티스토리 뷰

 

 

 


1. 웹스크래핑 이란

웹에서 원하는 데이터를 뽑아내는 것이다.

 

예를 들어, 페이스북 댓글 이벤트를 진행한다고 하자.

그렇다면 해당 페이스북 댓글창이 보이는 상태에서 이름에 해당하는 부분만 스크랩하는 것이다.

이는, html의 특정 태그, 아이디, 클래스를 선택함으로 가능하다.


2. 준비물

파이썬, BeautifulSoup, 구글 크롬


3. 방법

바로 실습으로 알아보자.

(원래 예제로 네이버 실시간 검색어 순위를 스크래핑 하려 했으나 2020년 1월 17일 부로 네이버가 ajax 방식으로 변경했기 때문에, 본문에서 원하는 방식의 스크래핑은 불가하다는 것. 대신 다른 형식으로 json을 불러와 읽을 수 있다. 해당 코드는 아래 링크에 참고.)

201108 수정) beautifulsoup로 크롤링 하는 방식은 html이나 css로 이루어진 동적 데이터만 크롤링이 가능하다. 네이버 실시간 검색어처럼 js 등으로 된 동적데이터를 크롤링 하려면 selenium을 이용해야 한다!!

https://www.inflearn.com/questions/22012

 

실습으로 벅스 음악 차트 정보를 스크래핑 해보자.

 

먼저 cmd에서 requests 모듈을 설치해준다.

requests 모듈은 서버에 무언가를 보내달라고 요청한다.

프론트엔드 쪽의 Ajax와 비슷한 역할을 한다.

 

명령프롬프트(cmd)를 열어 아래와 같이 적어준다.

pip install requests

설치를 완료하면

파이썬 파일을 열어 BeautifulSoup를 설치해야 한다.

BeautifulSoup는 html의 내용들을 파이썬이 읽기 쉽게 해주는 파이썬 라이브러리다.

 

아래의 코드를 복사 붙여넣기 해보자.

import requests
from bs4 import BeautifulSoup

data = requests.get('https://music.bugs.co.kr/chart')
soup = BeautifulSoup(data.text, 'html.parser')

bs4에 마우스를 가져다대면 설치할 수 있는 바로가기 링크가 뜰 것이다(파이참).

그렇지 않다면 각자의 코드 에디터에서 bs4를 다운받을 수 있는 경로를 검색해보자.

 

import는 모듈을 가져온다.

 

requests.get()은 GET을 요청할때 사용, requests.post()는 POST를 요청할때 이용한다.

 

soup 라는 변수에 html에서 긁어온 데이터들을 넣는 형태이다.

 

한번 print(soup)를 해 보면 전체 html 코드들이 출력되는걸 볼 수 있다.

 

본격적으로 실시간 검색어 순위를 스크래핑하기 위해 

구글 크롬 개발자 도구를 이용해보자.

ctrl+shift+i로 개발자 도구를 연다.

개발자 도구의 왼쪽 상단을 보면 마우스 커서가 화면을 가리키는 작은 아이콘이 있다.

이를 눌러주고 코드를 알고 싶은 화면에 가져다댄 후 클릭하면 해당 요소의 경로가 어디인지 알 수 있다.

https://music.bugs.co.kr/chart

 

슈퍼사운드 벅스

4천만곡 음악서비스, 슈퍼사운드, 고음질, FLAC, 최신 인기가요, 뮤직PD, 커넥트, 페이코, 추천 플레이리스트, 추천 선곡, 테마 음악

music.bugs.co.kr

우선 위의 링크로 들어간다.

 

 

 

우리가 찾고자 하는 실시간 검색어 리스트는 list클래스 안,  tbody 안, tr에 들어있음을 알았다.

이제 해당 태그를 찾아 아래와 같이 적는다.

rank_list = soup.select('.list > tbody > tr')

그렇기에 rank_lists를 print하면 tr을 포함한 코드들이 출력된다.

 

이제 본격적으로 순위, 제목, 가수를 뽑아보자.

 

 

순위
노래 제목
가수 이름

 

 

위의 위치를 코드로 뽑아보면 아래와 같다.

 

ranking = rank_list.select_one('td > div.ranking > strong').text	#순위
m_title = rank_list.select_one('th > .title > a').text		#제목
m_artist = rank_list.select_one('td.left > .artist > a').text		#가수

select_one은  해당 태그 중 처음 하나만 선택하는 태그다.

왜 하나만 선택하냐면, 한 줄에 하나씩 띄울 것 이기 때문이고

이는 for 반복문을 이용해 전체를 출력 할 것이다.

 

위의 태그들을 for 반복문에 넣어보자.

for rank_list in rank_lists:
    ranking = rank_list.select_one('td > div.ranking > strong').text
    m_title = rank_list.select_one('th > .title > a').text
    m_artist = rank_list.select_one('td.left > .artist > a').text
    print(ranking, m_title, m_artist)

 

rank_list는 rank_lists의 갯수와 같다. 때문에 리스트 모두를 뽑아낼 수 있게 된다.

 

전체 태그는 다음과 같고, 프린트한 결과는 다음과 같다.

import requests
from bs4 import BeautifulSoup

data = requests.get('https://music.bugs.co.kr/chart')
soup = BeautifulSoup(data.text, 'html.parser')
rank_lists = soup.select('.list > tbody > tr')

for rank_list in rank_lists:
    ranking = rank_list.select_one('td > div.ranking > strong').text
    m_title = rank_list.select_one('th > .title > a').text
    m_artist = rank_list.select_one('td.left > .artist > a').text
    print(ranking, m_title, m_artist)

 

 


4. 결론

실습 가능한 사이트가 어디인지 찾느라 한참 헤맸다.

ajax로 돌려버린 사이트들만 어떻게 찾아서 그랬나보다...

사이트의 태그들을 잘 분석하는 것이 중요할 것 같다.

 

출처
it에 취하개님 블로그 https://hongku.tistory.com/292
반응형
댓글