본문 바로가기
SpartaCodingClub/week 3

개발일지 3주차

by 썬이 2021. 9. 1.

https://www.notion.so/teamsparta/3-ed5a2f9b258b4ac6bb63b95c3af4f6a5

 

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

매 주차 강의자료 시작에 PDF파일을 올려두었어요!

www.notion.so

 

 

1. 2주차 복습 - 나홀로 링크 메모장에 openAPI

http://localhost:63342/frontend/index.html?_ijt=h79490mj4n1vlpmgd3ut38s655&_ij_reload#

<script>
$(document).ready(function () {
$('#cards-box').empty()
listing();
})
;

function listing() {
$('#cards-box').empty()

$.ajax({
type"GET",
url"http://spartacodingclub.shop/post",
data: {},
successfunction (response) {

let rows = response ['articles']
for (let i = 0i < rows.lengthi++) {
let comment = rows[i]['comment']
let desc = rows[i]['desc']
let image = rows[i]['image']
let title = rows[i]['title']
let url = rows[i]['url']

let temp_html = `<div class="card">
<img class="card-img-top"
src="${image}"
alt="Card image cap">
<div class="card-body">
<a href="${url}" class="card-title">${title}</a>
<p class="card-text">${desc}</p>
<p class="card-text comment">${comment}</p>
</div>
</div>`
$('#cards-box').append(temp_html)

}
}
})
}

function openclose() {
let status = $('#post-box').css('display');
if (status == 'block') {
$('#post-box').hide();
$('#btn-posting-box').text('포스팅박스 열기');
else {
$('#post-box').show();
$('#btn-posting-box').text('포스팅박스 닫기');
}
}
</script>

$('#cards-box').empty()

둘 중 어디에 넣어도 상관없음!

 

 


2. 파이썬

컴퓨터의 언어를 번역해주는 번역팩!

항상 오른쪽 마우스 누르고 Run 누르기!

 

 

- 함수

def aa(num1, num2):
     print('안녕!')
     return num1+num2

result = aa(2,3)

print(result)
파이썬에서는 중괄호{}같은 거 안 씀.
def의 아래 탭되어서 나타나는 부분은 함수 aa의 내용물인 느낌!

함수 aa에 들어오면, 
print('안녕!') 실행하고,
return num1+num2 실행.

 

 

- 조건문

age = 25

if age > 20:
print('성인입니다')
else:
print('청소년입니다')
def is_adult(age):
if age > 20:
print('성인입니다')
else:
print('청소년입니다')

is_adult(30)
is_adult(15)

조건문 -> 함수

 

 

- 반복문

list 예제

fruits = ['사과','','','','수박','','딸기','사과','','수박']

count = 0
for ff in fruits:
if ff == '수박':
count += 1

print(count)

답 : 2 나옴.

list의 원소를 하나씩 빼서 사용하는 형태!

count += 1 는

count = count + 1 와 같다.

 

dictionary 예제

people = [{'name''bob', 'age'20},
{'name''carry', 'age'38},
{'name''john', 'age'7},
{'name''smith', 'age'17},
{'name''ben', 'age'27}]

for person in people:
if person['age'] < 20:
print(person)
people = [{'name''bob', 'age'20},
{'name''carry', 'age'38},
{'name''john', 'age'7},
{'name''smith', 'age'17},
{'name''ben', 'age'27}]

for person in people:
print(person['name'], person['age'])

 


3. 웹스크래핑(크롤링)

- select_one인 경우

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://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)

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

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

print(title)
<a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>

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

는 네이버 영화 창에 있는 그린 북에 커서를 두고 오른쪽 마우스 눌러서 검사로 들어간 뒤,

copy - copy selector 눌러서 복사한 것!

 

print(title)= /movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북

print(title.text) = 그린 북

print(title['href']) = /movie/bi/mi/basic.naver?code=171539

 

 

- select, select_one인 경우 1

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://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)

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

trs = soup.select('#old_content > table > tbody > tr')

for tr in trs:
a_tag = tr.select_one('td.title > div > a')
if a_tag is not None:
title = a_tag.text
print(title)
영화 제목만 나옴!

그린 북
가버나움
베일리 어게인
주전장
포드 V 페라리
아일라
원더
...

#old_content > table > tbody > tr

한 줄씩 되어있는 묶음을 검사 - copy - copy selector 했을 때

#old_content > table > tbody > tr:nth-child(3)

#old_content > table > tbody > tr:nth-child(4)

이런 식으로 나옴.

select_one이 아니라 전체를 select 할 때는 줄마다 다른 것 같은 뒤에 밑줄 친 부분을 빼고 앞부분만 넣는다!

 

td.title > div > a

그리고 select_one일 때

그린 북 - 검사 - copy - copy selector

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

뒷 부분만 넣기!

 

if a_tag is not None:

print(a_tag) 했을 때 중간에 선 부분이 None으로 나옴.

그래서 그냥 print(title.text)하는 경우 None부분은 text가 없기 때문에 오류가 남.

중간에 if문을 넣어줘서 None을 걸러냄.

 

 

- select, select_one인 경우 2 - 응용

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://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)

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

trs = soup.select('#old_content > table > tbody > tr')


for tr in trs:
a_tag = tr.select_one('td.title > div > a')
if a_tag is not None:
rank = tr.select_one('td:nth-child(1) > img')['alt']
title = a_tag.text
star = tr.select_one('td.point').text
print(rank, title, star)
01 그린 북 9.60
02 가버나움 9.59
03 베일리 어게인 9.52
04 주전장 9.52
05 포드 V 페라리 9.51
06 아일라 9.49
07 원더 9.49
08 당갈 9.47
09 쇼생크 탈출 9.44
010 터미네이터 2:오리지널 9.43
11 보헤미안 랩소디 9.42
...

 

 


4. DB(DataBase)

Mongo DB - 데이터베이스. 기본적으로 데이터를 쌓아 두는 곳. Mongo DB는 내 눈에 보이지는 않지만 돌아가는 중.

Robo 3T - Mongo DB의 데이터를 시각화하여 우리 눈으로 볼 수 있게 하는 것.

 

데이터베이스는 데이터를 잘 가져다 쓰려고 쓰는 것!

 

> 데이터베이스 종류

SQL - 틀이 존재함. 열, 행을 미리 정해 놓음.

행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니

ex) MS-SQL, My-SQL 등

 

NoSQL(Not Only SQL) - 틀 없이 한 줄 한 줄이 dictionary 형태로 들어감.

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

ex) MongoDB

 

 

- pymongo로 DB조작하기

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

기본 틀

# 저장 - 예시
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'})

insert 데이터 넣음

find 데이터 찾음

update 있는 데이터 업데이트

delete 데이터 삭제

 

same_ages = list(db.users.find({'age':21},{'_id':False}))

users - collection 이름

{'age':21} - 조건. 보통 비어있는 경우 많음! same_ages = list(db.users.find({},{'_id':False}))

{'_id':False} - id값은 나타내지 말아라

 

user = db.users.find_one({'name':'bobby'},{'_id':False})

하나만 가져오라고 하고 싶을 때!

if bobby가 여러명 있어도 제일 위에 하나만 가져옴.

 

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

bobby라는 이름을 가진 사람의 나이를 19로 바꿔라

 

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

bobby라는 이름을 가진 사람 모두의 나이를 19로 바꿔라

-> 실제로 잘 쓰지는 않음. (마찬가지로 delete_many도 있지만 거의 사용하지 않음.)

 

 

- 웹스크래핑 결과 pymongo로 데이터 DB에 저장하기

import requests
from bs4 import BeautifulSoup

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

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')

trs = soup.select('#old_content > table > tbody > tr')



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

 

- QUIZ dbquiz.py

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

movie = db.movies.find_one({'title':'매트릭스'})
print(movie['star'])
 
2.
from 
pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

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

target_movies = list(db.movies.find({'star':target_star},{'_id':False}))

for target in target_movies:
print(target['title'])









-> 그냥 print(target_movies)해도 상관 없는데,
이렇게 list 안에 dictionary들이 들어있는 경우에는
이렇게 해주는 게 더 보기 편함!
3.
from 
pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

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


다른 애들이 다 문자열이니까 관리하기 편하도록 0도 숫자가 아닌 문자열('0')로 표시해주는 것이 더 좋음.

 

'SpartaCodingClub > week 3' 카테고리의 다른 글

3주차 과제 _지니뮤직 웹스크래핑 / geine.py  (0) 2021.09.02