본문 바로가기
아카이브

스파르타 코딩클럽 [ 웹개발 종합반 ] - 3주차

by nineteen 2022. 1. 13.
반응형

배운 것

python 기본 문법

크롤링

mongoDB

 

내용 정리

 

크롤링

 

ㅇ 크롤링을 위해선 Requests, bs4 라이브러리가 필요

 

Requests 라이브러리 활용 예시

import requests # requests 라이브러리 설치 필요

r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
rjson = r.json()

gus = rjson['RealtimeCityAir']['row']

for gu in gus:
	if gu['IDEX_MVL'] < 60:
		print (gu['MSRSTE_NM'], gu['IDEX_MVL'])

서울의 미세먼지를 표시해주는 서울시 대기 OpenAPI에서 값을 가져와 마음대로 연산이 가능!

 

 

ㅇ 크롤링 기본 세팅

import requests
from bs4 import BeautifulSoup

# 타겟 URL을 읽어서 HTML를 받아오고,
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://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')

#############################
# (입맛에 맞게 코딩)
#############################

Requests와 bs4 라이브러리를 설치하고

기본 세팅을 한 후에, select, select_one을 사용해 크롤링

 

ㅇ 사용방법

# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')

# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')

 

크롬 개발자도구를 참고해, 크롤링하고 싶은 부분을 Copy Selector로 복사해 크롤링할 때 이용한다

 

 

ex) 지니 뮤직에서 순위, 곡이름, 가수이름을 크롤링 하기

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('https://www.genie.co.kr/chart/top200?ditc=D&ymd=20220110&hh=23&rtm=N&pg=1',headers=headers)

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

# select를 이용해서, tr들을 불러오기
songs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

# songs (tr들) 의 반복문을 돌리기, 각 노래의 정보를 추출
for song in songs:
	# 순위, 곡 이름, 가수 이름
    rank = song.select_one('td.number').text[0:2].strip()
    name = song.select_one('td.info > a.albumtitle.ellipsis').text
    singer = song.select_one('td.info > a.artist.ellipsis').text
    print(rank, name, singer)


# 순위
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number

# 곡 이름
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.albumtitle.ellipsis

# 가수 이름
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis

 

크롤링 결과가 아래와 같이 출력된다

 

 

MongoDB

    - No-SQL의 한 종류

    - 딕셔너리 형태로 데이터를 저장해두는 DB

    - 데이터 하나 하나 마다 같은 값들을 가질 필요가 없음

    - 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있음

 

 

파이썬에서 사용하기 위해선 pymongo 라이브러리가 필요

# (pymongo라이브러리 인스톨 후)
from pymongo import MongoClient           # pymongo를 임포트 하기
client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.

# 코딩 시작

# insert / find / update / delete

# insert
doc = {'name':'biky','age':20,'gender':'female'}
db.users.insert_one(doc)

# find

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
same_ages = list(db.users.find({'age':20},{'_id':False})) # 나이가 20인 데이터 가져옮, id는 표시x

for person in same_ages:
    print(person)

# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})
user = db.users.find_one({'name':'bobby'},{'_id':False})

# update
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# delete
db.users.delete_one({'name':'bobby'})

 

 

ex) 지니 뮤직에서 순위, 곡이름, 가수이름을 크롤링한 결과를 DB에 저장하기

...
for song in songs:
    rank = song.select_one('td.number').text[0:2].strip()
    name = song.select_one('td.info > a.albumtitle.ellipsis').text
    singer = song.select_one('td.info > a.artist.ellipsis').text

    doc = {
        'rank': rank,
        'name': name,
        'singer': singer
    }

    # 'songs'라는 collection에 {'rank':rank, 'name':name, 'singer':singer}를 넣음
    db.songs.insert_one(doc)

 

DB에 저장된 결과

 

 

느낀 점 / 보완할 점

스프링을 하다가 JS와 python개념들이 머리에 들어오니까 아주 복잡하고 정리가 안되는 느낌

하나하나 다시보며 개념을 정립해야겠다

 

조급해하지말자