-
WIL 4-2. 웹개발 종합반 3주차 2회독(7월 3주차)HangHae99/WIL 2023. 7. 18. 20:20
< WIL이란? >
Weekly I Learend의 약자로, 주간 학습한 내용을 정리 후 공유하기 위해 작성하는 글이다.
아래는 웹 개발 종합반 강의 3주차를 2회독하면서 정리한 내용이다.
< 2주차에 배우는 것들 >
Python: 기본 문법과 웹 서버 파일 만들기
웹 크롤링 (bs4 라이브러리): 웹 페이지에서 필요한 정보를 솎아 내어 가져오기
MongoDB: 웹페이지로부터 입력받은 데이터를 데이터베이스에 저장하기
<Python>
Python 프로그래밍 언어를 배운다.
해당 강의에서는 웹 서버를 만들기 위해 사용한다.
서버는 데이터를 주는 역할을 한다.
<Python 기본 문법>
Python의 문법은 굉장히 직관적이다. 그래서 배우기 쉽다.
1. print
print('hello world')2. 변수 선언
a = 2 b = 3 print(a+b)3. 리스트
a= [‘사과’, ‘배’, ‘감’] print(a[0])4. 딕셔너리
a = {‘name’: ‘영수’, ‘age’:24} print(a[‘name’])5. 함수
def hey(): print(‘헤이’)파이썬에서는 들여쓰기를 유의해야 한다.
들여쓰기를 하지 않으면 문법적으로 맞지 않다.
def sum(a,b,c): return a+b+c result = sum(1,2,3) print(result)6. 조건문
age = 25 if age > 20: print('성인입니다.') else: print('청소년입니다.')7. 반복문
ages = [5,10,13,23,25,9] for a in ages: print(a) # 출력결과: 5 ↵ 10 ↵ 13 ↵ 23 ↵ 25 ↵ 9 for a in ages: if a > 20: print('성인입니다.') else: print('청소년입니다.')a에 ages 하나하나씩 가져와 넣는다.
<패키지 설치>
- 가상환경 설정
1. 가상환경 설정할 폴더 열기
2. interpreter 선택 (3.8.6 버전 혹은 설치되어 있는 버전)
3. 터미널에 명령어 입력
python -m venv venv #Win python3 -m venv venv #Mac4. interpreter 선택하여 python 3.8.6(‘venv’:venv) 선택
5. 터미널 종료 후 새터미널 실행
6. 터미널에 (venv) 문구가 뜨는지 확인
- 패키지 설치
터미널에 명령어 입력
pip install requests
<Requests 라이브러리 사용해보기>
Requests 의 기능은 앞서 사용해본 Fetch 와 유사하다.
라이브러리 사용방법은 공식문서에서 찾아볼 수 있다.
(예시) requests python docs 검색
import requests r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair') rjson = r.json() rows = rjson['RealtimeCityAir']['row'] for a in rows: gu_name = a['MSRSTE_NM'] gu_mise = a['IDEX_MVL'] print(gu_name, gu_mise)Fetch 에서 연습해본 것처럼 결과도 동일하다.
터미널에 중구 31 ↵ 종로구 39 ↵ … 과 같이 출력된다.
<크롤링>
크롤링은 웹 페이지에서 필요한 정보를 솎아내어 가져오는 것이다.
title = soup.select_one('#mainContent > div > div.box_ranking > ol > li:nth-child(1) > div > div.thumb_cont > strong > a') print(title.text)copy selector를 통해 가져올 정보를 지정할 수 있다.

영화 리스트 전체를 가져와 반복문에 써줄 수 있다.
li 의 뒷부분은 첫번째 리스트를 가리키는 구문이기 때문에 지워준다면 전체 리스트를 선택할 수 있다.
lis = soup.select('#mainContent > div > div.box_ranking > ol > li') for li in lis: title = li.select_one('.link_txt').text print(title)
title 에 넣어줄 li 의 제목은 클래스 이름을 확인해서 가져와야 한다.
class 이름과 href 등의 정보는 제외하고 텍스트, 즉 영화제목만 가져오기 위해서는 .text를 사용한다.
순위와 평점도 마찬가지로 클래스 이름으로 가져온다.
title = li.select_one('.link_txt').text rate = li.select_one('.txt_grade').textfor li in lis: rank = li.select_one('.rank_num').text title = li. select_one('.link_txt').text rate = li.select_one('.txt_grade').text print(rank, title, rate)출력결과는 다음과 같다.

.text 처럼 뒤에 붙이는 다른 명령어를 알아보자.
.strip() 앞 뒤로 붙은 띄어쓰기 제거
.replace('a', 'b') 텍스트 a를 b로 교체함. 예를 들어, 컴마를 공백으로 바꿔서 지우기
.replace(‘,’, ‘’)
<DB>
DB는 데이터를 그저 저장해놓기만 하는 것이 아니라, 저장해놓은 데이터를 잘 가져오기 위한 도구이다.
*RDBMS vs NoSQL
- RDBMS(SQL)
엑셀에 데이터를 저장하는 것과 유사하다. 정형화 되어 있는 데이터 틀. 일관성과 분석이 장점이다.
- NoSQL(Not only SQL)
정해진 틀이 없어서 유연성이 장점이다. 스타트업이 NoSQL로 데이터를 저장하다가 기업과 데이터 규모가 커지면 RDBMS로 넘어가기도 한다고 한다. 강의에서 사용하는 MongoDB는 NoSQL 이다.
<MongoDB 연습>
웹페이지에서 입력한 데이터를 받아 컬렉션에 저장한다.
MongoDB를 사용하기 위해서 dnspython, pymongo 라이브러리 설치가 필요하다.
- 라이브러리 설치
from pymongo import MongoClient import certifi ca = certifi.where() client = MongoClient('mongodb+srv://sparta:<password>@cluster0.wtgsmkg.mongodb.net/?retryWrites=true&w=majority', tlsCAFile=ca) db = client.dbsparta개인적으로 certifi 패키지를 추가로 설치해주어야 정상적으로 작동했다.
+ client 변수에 URL을 넣는 곳에 , tlsCAFile=ca 도 같이 넣어주어야 했다.
1. DB에 데이터 넣어주기
doc = { 'name': '영수2', 'age': 24 } db.users.insert_one(doc)doc 을 정의하고, db 의 users 콜렉션에 doc 하나를 넣는다.
doc = {'name': '영희', 'age': 30} db.users.insert_one(doc) doc = {'name': '철수', 'age': 20} db.users.insert_one(doc)추가로 영희, 철수도 넣어준다.

아까 저장한 영수2, 영희, 철수 모두 컬렉션에 잘 저장되었다.
2. DB로부터 데이터 가져오기
all_users = list(db.users.find({},{'_id':False})) for a in all_users: print(a)users 컬렉션에 있는 데이터들을 리스트로 all_users 변수에 저장하고, a 를 all_users에 넣어 반복문을 통해 출력 시켜준다. (뒤에 있는 명령어는 데이터 중 _id 값은 빼고 받는다는 의미이다.)

이렇게 데이터가 하나씩 출력된다.
3. 데이터 업데이트
db.users.update_one({'name':'영수2'},{'$set':{'age':19}})이름이 영수2 인 데이터의 age를 바꿔주거나,
4. 데이터 삭제
db.users.delete_one({'name':'영수2'})이름이 영수2 인 데이터를 지울 수도 있다.
<웹스크래핑과 MongoDB>
웹스크래핑 결과를 데이터베이스에 저장한다.
hello.py 파일에서 미리 웹스크래핑을 해온 데이터를 movies 컬렉션에 저장한다.
for li in lis: rank = li.select_one('.rank_num').text title = li. select_one('.link_txt').text rate = li.select_one('.txt_grade').text doc = { 'rank': rank, 'title': title, 'rate': rate } db.movies.insert_one(doc)
<MongoDB 연습하기>
2010년 영화 순위 데이터를 movies2 컬렉션에 저장하고, find와 update 명령어를 연습한다. (컬렉션 저장 과정 생략)
1. find
movie = db.movies2.find_one({'title':'아저씨'})영화 제목이 아저씨인 데이터를 찾는다.
print(movie['rank'])해당 데이터의 순위를 출력한다. 출력결과: 2
2. find 응용
movie = db.movies2.find_one({'title':'하모니'})영화 제목이 하모니인 데이터를 찾는다.
age = movie['age']해당 데이터의 age(관람 가능 나이)를 찾는다.
이때 age = 12세 이상 관람가
movies = list(db.movies2.find({'age': age}, {'_id': False}))movies 변수에 age가 변수 age와 같고, _id는 출력하지 않은 데이터를 넣는다.
for m in movies: print(m)m에 movies 리스트를 반복하면서 출력한다. (반복문이 아닌 print movies를 하면 원하는 결과 값을 얻을 수 없다.)

for m in movies: print(m['title'])해당 영화들의 제목만 가져올 수도 있다.
3. 업데이트
db.movies2.update_one({'title':'부당거래'},{'$set':{'age':'18세이상관람가'}})영화 제목이 부당거래인 데이터의 관람가를 18세이상관람가로 업데이트 한다.
<숙제>
지니뮤직에서 웹스크래핑하기(1위부터 50위까지의 곡 정보 불러오기)
순위, 아티스트, 제목을 1위부터 50위까지 차례대로 가져오는 것이 목표이다.
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.info > a.artist.ellipsis\ for music in trs: title = music.select_one('a.title.ellipsis').text.strip() artist = music.select_one('a.artist.ellipsis').text rank = music.select_one('.number').text[0:2] print(rank, artist, title)다른 부분은 배웠던 대로 하면 되는데, selector로 가져와 trs 변수에 넣을 때 어디까지 써야하는지가 어려웠다. 주석처리 되어있는 부분이 가져온 셀렉터인데, tr:nht-child(1) 부분에서 tr까지 살리고 그 뒷부분까지 지우면 된다.(강의를 보고 알았다.)
<학습 방향>
7.23(일)까지 해서 웹개발 종합반 강의를 수강하는 것은 마무리 되고,
7.24(월)부터는 선택 온보딩이 시작된다.
시간이 맞을 것 같지 않아 선택 온보딩에 참여하지는 않지만, 필요한 공부는 혼자서 해두려고 한다.
주특기를 선택해서 필요한 언어공부와 관련된 알고리즘 학습이 필요하다.
일단 웹개발 종합반 2회차 수강하는 것이 우선이다.
'HangHae99 > WIL' 카테고리의 다른 글
WIL 4. 웹개발 종합반 2주차 2회독(7월 3주차) (1) 2023.07.16 WIL 3. 웹개발 종합반 1주차 2회독(7월 2주차) (0) 2023.07.14 WIL 2-2. 웹개발 종합반 5주차(7월 1주차) (0) 2023.07.09 WIL 2. 웹개발 종합반 5주차(7월 1주차) (0) 2023.07.09 WIL 1-2. 웹개발 종합반 4주차(6월 5주차) (0) 2023.06.30