웹 스크래핑, mongoDB

_Opacity·2021년 12월 18일

프로그래밍

목록 보기
4/9
post-thumbnail

웹 스크래핑

다른 말로 크롤링이라고도 한다. 이게 무엇일까? 웹사이트 내에서 데이터를 추출하는 방법이라고 생각하면 된다. 말보다는 행동으로, 바로 한 번 크롤링을 해보자.

완성된 모습

내가 만든 웹사이트는 벅스를 크롤링하였는데 이것을 리뷰하면서 크롤링에 대해 알아보겠다. 먼저 완성된 모습을 보자.

나는 파이썬을 이용하여 크롤링 할 것이고 이를 위해선 필요한 패키지가 있다. 이를 설치하도록 하자.

bs4, requests 설치한다.

설치를 완료했다면 기본적인 크롤링의 구조를 보자.

import requests
from bs4 import BeautifulSoup

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('크롤링할 주소')

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

벅스를 크롤링하였으니 벅스의 순위를 알 수 있는 사이트를 위 코드에 넣자.

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.whmxq.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.bugDB

# 벅스 사이트 크롤링
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://music.bugs.co.kr/chart', headers=headers)

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

완성된 모습에서 순위, 노래, 가수를 스크래핑한 것을 볼 수 있다. 각자 우측 마우스로 검사하여 태그를 봐보자.

#CHARTrealtime > table > tbody > tr:nth-child(1) > td:nth-child(4) > div

순위

#CHARTrealtime > table > tbody > tr:nth-child(1) > th > p

노래

#CHARTrealtime > table > tbody > tr:nth-child(1) > td:nth-child(8) > p > a

가수

나는 songs라는 변수에 #CHARTrealtime > table > tbody > tr 부분까지 가져와보겠다. 그리고 이 부분에서 순위, 노래, 가수를 가져오고 출력해보자.

songs = soup.select('#CHARTrealtime > table > tbody > tr')
for song in songs:
    bugs_rank = song.select_one('td > div > strong').text
    bugs_title = song.select_one('th > p > a').text
    bugs_artist = song.select_one('td > p > a').text

이렇게 웹에서 받은 정보를 나에게서 출력해보았다.

mongoDB

mongoDB를 이용해서 위에 출력했던 데이터를 한 번 저장해보자. 그러기 위해서는 기본적인 패키지가 필요하다.

pymongo, dnspython을 설치한다.

기본적으로 mongoDB를 사용하기 위한 코드는 이것이다.

from pymongo import MongoClient
client = MongoClient('url')
db = client.bugDB

url은 mongoDB를 설치하면서 받은 주소를 의미하고 아래 db는 bugDB라는 곳에 저장한다는 의미라고 생각하면 된다.

위에서 받은 데이터의 코드를 다시 보자.

for song in songs:
    bugs_rank = song.select_one('td > div > strong').text
    bugs_title = song.select_one('th > p > a').text
    bugs_artist = song.select_one('td > p > a').text

이 코드를 이제 DB에 집어넣자. bugs_rank는 rank 이런 식으로 저장할 것이다.

doc = {
        'rank': bugs_rank,
        'title': bugs_title,
        'artist': bugs_artist
    }
db.bugs_site.insert_one(doc)

참고로 믿에 있는 명령어는 데이터를 삽입하겠다는 것인데 기본적인 조작어에 대해서는 따로 일지를 올렸다.

이제 mongoDB에 refresh를 통해 새로고침을 하고 확인해보자.

데이터가 들어왔음을 확인할 수 있다.

profile
열심히 개발하려고 하는 주니어 개발자-!

0개의 댓글