본문 바로가기
TIL

TIL[23.05.12.]웹개발종합반 3주차

by heediv 2023. 5. 12.
반응형

오늘의 계획

웹종반 3주차 모두 끝내기

이해가 될때까지 천천히 보면서 직접 해보다보니 진도가 잘 나가지 않는 느낌이다.

그래도 내 페이스대로 이해하면서 내것으로 만들어야겠다. 천천히 멀리가자!

 

강의노트

3-3강부터 다시 듣기

3-4강. Python  

변수 자료형 함수 반복문 조건문 순서로 배울것.

함수 내용
터미널 결과

함수에서 콜론:을 세미콜론;으로 오타를 내었다.

그 결과 터미널에서 ;에 표시가 나타났다. 오타조심!!!

 

3-5강.Python의 반복문과 조건문

조건문
반복문-for a in ages: (ages에서 하나하나 가져와 a로 놓고 쓰자)

3-6강. 파이썬 패키지 설치하기

가상환경-라이브러리를 담아두는 폴더

 

파일→폴더열기→sparta→pyrhonprac→밑에 인터프리터선택 click→python 3.8.6 64bit click→새터미널 열기→

터미널에서 python -m venv venv 치고 엔터 (venv라는 파일이 생김)→밑에 3.8.6 click → venv click →새터미널 열기 → 터미널에서 (venv)를 볼수있음('지금부터 이 폴더에서 라이브러리를 갖다 쓰는거야~')→ pip install 라이브러리이름(requests)

 

3-7강. 패키지(라이브러리) 사용하기

Fetch의 역할을 하는것이 requests라이브러리이다.

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

rjson = r.json()

python
터미널 결과

3-9강.크롤링(웹페이지에서 정보를 가져오는것)

pip install bs4 라고 터미널에서 입력 (bs: beutiful soup)

크롤링이란 html속에서 원하는 부분 솎아내어 가져오는것, 특정부분 빨리 솎아내주는 BS 라이브러리사용

아래 크롤링기본구조 입력후 아래 print(soup)입력하고 터미널에서 python hello.py 엔터

print(soup)은 지우고 title = soup.selec_one('원하는 부분 selector복사후 붙여넣기')

print(title.text) 확인

print(title['href']) 하면 원하는 부분 href보여줌

 

.strip()붙여주면 앞뒤로 붙은 띄어쓰기 다 제거

.replace(',','') ,를 없애줌

 

 

크롤링 기본구조

import requests
from bs4 import BeautifulSoup

URL = "https://movie.daum.net/ranking/reservation"
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(URL, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

 

python 입력
터미널 결과

3-10강. DB

DB두가지 종류

1) SQL=RDBMS : 엑셀처럼 이미 정해진 칸에 저장하는것 장점: 틀이 정해져있으므로 사람이 실수 할일이 없다. 대기업 같은 큰 비지니스가 잘안바뀌는곳 데이터를 좀더 빨리 가져올수 있다.

2) NoSQL(Not only SQL) :mongo DB처럼 데이터를 마음대로 저장할수 있어 장점: 비지니스의 유연성을 담보한다. 스타트업처럼 변화가 많은 곳에서 사용하면 좋다.

 

클라우드 환경에서 운영되고 있는 데이터베이스를 빌려와서 사용할것. - mongoDB Atlas 사용할것

 

3-11강. mongoDB 시작하기

https://account.mongodb.com/account/register

 

Cloud: MongoDB Cloud

 

account.mongodb.com

3-12강. mongoDB 연결하기

두개의 라이브러리 필요(pymongo 와 dnspython)

터미널에서 pip install dnspython

pip install pymongo

순차적으로 실시

 

pymongo 기본코드

from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')                                여기에서 URL은 mongoDB의 주소-mongoDB site에서 가져옴
db = client.dbsparta

 

mongoDB에서 구글로 로그인 후 connect 클릭하고 python, 3.6 or ~~~ 로 맞춰준 후 아래의 주소를 복사하여 URL 입력

mongoDB Browse Collections에 들어가보면 dbsparta의 소그룹users안에 저장되어있어야함

but 나는 저장되어 있지 않았다. (_ssl.c:1124)에러 문구가 나타나 구글링하고 python을 업그레이드하고 certifi도 install해보았지만 아직도 저장이 안된다.

위처럼 입력후 mongoDB에서 확인

 

Keep getting ServerSelectionTimeoutError - MongoDB Atlas - MongoDB Developer Community Forums

 

Keep getting ServerSelectionTimeoutError

This fixed the issue completely… Thank you!

www.mongodb.com

위 주소로 들어가 인증서를 설치하였다.

그리고 mongoDB의 PW가 틀릴수도 있으니 PW도 다시 변경해주었다.

pymongo.errors.OperationFailure: bad auth : authentication failed

그랬더니 이번엔 이런 오류가 떴다.

주소도 다시 입력해보고 구글링도 계속하면서 혼자 3시간을 끙끙앓다가 매니저님께 달려갔다

일단 PW입력란에 <>를 지우고 다시 실행해보니

$ pip install--upgrade pip
ERROR: unknown command "install--upgrade" - maybe you meant "install"
(venv) 

이런 에러가 떠서 

pip install --upgrade pip

pip install --upgrade pymongo 

위 순서대로 설치하고 나니 오류메시지가 뜨지 않았다. 위에서 보니 계속 upgrade하라고 소리치고있었구나...

오류 하나하나 잘읽어봐야겠다는 생각을 하게되었다

그리고 mongoDB에 들어가 확인해보니 저장이 되었다!!!!!!!

매니저님과 박수치고 환호를 불렀다 ㅋㅋㅋㅋ 오류해결쾌감이 장난아니구나 싶었다

 

3-13강. Pymongo로 DB조작하기

-Pymongo(find) 코드스니펫

all_users = list(db.users.find({},{'_id':False}))

for a in all_users:
    print(a)

위 코드스니펫 아래 이렇게 붙여주면  목록이 모두 나온다

지우고 아래를 입력하면 하나만 보여줌. id지우려면 뒤에 붙여주면됨

user = db.users.find_one({})
print(user)

-DB조작하기

-Pymongo update1 코드스니펫

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

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

age가 24에서 19로 바뀌었다.

db.users.delete_one({'name':'영수'})

위와 같이 입력하니 영수가 mongoDB에서 사라졌다.

 

Pymongo 코드요약

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

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

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

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

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

3-14강. 웹스크래핑 결과 저장하기

hello.py에서 rank, title,star를 DB에 저장

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

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(URL,headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

video_list = soup.select("#mainContent > div > div.box_ranking > ol > li")
for v in video_list:
  # print(v)
  rank = v.select_one(".rank_num").text
  title = v.select_one(".tit_item").text.strip("\n")
  rate = v.select_one(".txt_grade").text
  print(rank, title, rate)

  doc = {
    'title': title,
    'rank': rank,
    'rate': rate
    }
  db.movies.insert_one(doc)

mongoDB 결과

3-15강. 복습하기

dbmovie.py파일만들기

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

movie = db.movies.find_one({'title':'문재인입니다'})
target_rate = movie['rate']

movies = list(db.movies.find({'rate':target_rate},{'_id':False}))
for a in movies:
    print(a['title'])

문재인입니다와 평점이 같은 영화제목을 보여주세요

그결과 문재인입니다 와 드림이 나온다

다음은 드림의 평점을 0으로 만들기를 해보겠다

db.movies.update_one({'title':'드림'},{'$set':{'rate':0}})

mongoDB 결과

3주차 숙제.

mongoDB는 이용X

지니뮤직의 1위부터 50위까지의 곡 스크래핑하기

https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20230101 

 

지니차트>월간 - 지니

AI기반 감성 음악 추천

www.genie.co.kr

 

 

랭킹 제목 가수 순으로 결과나와야함

genie.py 만들고 실시

크롤링의 기본코드 복사 붙여넣기

rank 깔끔하게 나오게하기위해 text[0:2] 를 사용하여 앞에 두글자만 끊기!

곡제목의 여백을 없애기 위해 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(URL,headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

music_list = soup.select("#body-content > div.newest-list > div > table > tbody > tr")
for a in music_list:
    rank = a.select_one(".number").text[0:2].strip()
    title = a.select_one(".info >a.title.ellipsis").text.strip()
    artist = a.select_one(".info>a.artist.ellipsis").text.strip()

    print(rank,title,artist)

숙제결과

숙제까지 모두 완료~ 뿌으듯하다 ; ) 결과가 잘나올때 성취감이 너무 좋다^^

 

오늘의 느낀점

구글링을 정말 잘해야한다 ㅎㅎ 

오류를 하나하나 차근차근 잘살펴보자 늦었으니 얼른 자고 주말에 4주차 5주차 백엔드도 빠르게 보기

화이팅!!!

 

 

 

반응형