[스파르타 웹개발 종합반] 3주차 정리

이번주에는 생각보다 시간이 나지 않아서 진도가 많이 지지부진 했습니다.

이번에는 파이썬과 파이썬 패키지, 그리고 웹크롤링, MongoDB를 이용해보았는데, 파이썬은 기초를 알고 있어서 쉽게 따라갔지만 그 외에는 다 처음 다루는 거라서 조금 버벅거렸네요.

파이썬은 다른 언어들에 비해서 직관적이라서 보기에는 쉽다는 장점이 있고 변수를 선언할 때 따로 앞에 무슨 형인지 안 적어도 되는 점이 편한 것 같아요. 그리고 소괄호 없이 탭으로 구분이 가능하고...

# 수학문제에서
f(x) = 2*x+3
y = f(2)
y의 값은? 7

# 참고: 자바스크립트에서는
function f(x) {
	return 2*x+3
}

# 파이썬에서
def f(x):
	return 2*x+3

y = f(2)
y의 값은? 7


fruits = ['사과','배','감','귤']

for fruit in fruits:
	print(fruit)

패키지?
Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위. 이런 패키지 의 묶음을 라이브러리라 볼 수 있다.

가상환경으로 프로젝트 별로 패키지들을 담을 수 있다.

FILE > Setting > Project : > Python Interpreter에 들어가면 패키지들을 볼 수 있고 다운 또한 받을 수 있다.

+를 클릭하면

원하는 패키지를 install 할 수 있다.

웹 크롤링?
조직적, 자동화된 방법으로 웹을 탐색하는 프로그램. 즉, 웹 상에 존재하는 콘텐츠를 수집하는 작업이다.

패키지는 Requests 와 bs4를 이용한다.

F12를 통해 개발 도구를 킨 상태에서

필요한 부분에 오른쪽 클릭하여 Copy > Copy selector 를 하면 선택자를 카피할 수 있다. 이를 이용하여 코딩

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('localhost', 27017) #로컬호스트 몽고db에 접속합니다.
db = client.dbsparta #dbsparta라는 db에 접속합니다. 없으면 자동으로 생성합니다.

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)

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

#old_content > table > tbody > tr:nth-child(2)
trs = soup.select('#old_content > table > tbody > tr')

#old_content > table > tbody > tr:nth-child(2) > td.title > div > a

#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1)
#old_content > table > tbody > tr:nth-child(2) > td.point
for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    if a_tag is not None:
        title = a_tag.text
        rank = tr.select_one('td:nth-child(1) > img')['alt']
        star = tr.select_one('td.point').text
        doc = {
            'rank':rank,
            'title':title,
            'star':star
        }
        print(title, rank, star)


이렇게 나온다.

공통적인 부분은 tr로 담아두고 나머지 부분을 .select_one 을 이용해 가리키는 방식

MongoDB
No SQL
딕셔너리 형태로 데이터를 저장해두는 DB. 즉 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 되어 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있다.

라고 해도 결국 DB이기 때문에,

  • 저장
  • 찾기
  • 수정
  • 삭제

네가지만 할 줄 알면 대부분 사용할 수 있다.

# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

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

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
same_ages = list(db.users.find({'age':21},{'_id':False}))

# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기 - 예시
db.users.delete_one({'name':'bobby'})

위의 웹크롤링과 MongoDB를 함께 사용하기

정확히는 이미 웹크롤링 한 것을 DB에 저장해서 이를 연습하는 것

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

## 코딩 할 준비 ##

target_movie = db.movies.find_one({'title':'매트릭스'})
print (target_movie['star'])

target_star = target_movie['star']

movies = list(db.movies.find({'star':target_star}))

for movie in movies:
    print(movie['title'])

db.movies.update_one({'title':'매트릭스'},{'$set':{'star':0}})

이러면 저장된 매트릭스 영화의 평점이 0이 된다.

3주차 숙제 :
지니 뮤직 1~50위 곡 스크래핑 하기

순위와 곡제목이 깔끔하게 나오지 않아서 빈공간을 제거해주는 strip()함수를 이용했다.

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=20200403&hh=23&rtm=N&pg=1',headers=headers)

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

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

trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

#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
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis

for tr in trs:
rank = tr.select_one('td.number').text[0:2].strip()
title = tr.select_one('td.info > a.title.ellipsis').text.strip()
singer = tr.select_one('td.info > a.artist.ellipsis').text.strip()
print(rank, title, singer)

결과는 이렇게 나온다.

잠깐 해멘 부분은 text[0:2]
이건 글자의 2번째 까지만 출력해준다는 뜻이다. 그냥 text 했더니 제대로 나오지 않았다.

어찌어찌 스파르타 3주차 끝!

정리가 다소 간단대충이지만 어쩔 수 없다. 더 구구절절 적기엔 그게 더 어려운 것 같다.

좋은 웹페이지 즐겨찾기