ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 #Mac

    4. 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').text

     

    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
    
        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회차 수강하는 것이 우선이다.

Designed by Tistory.