ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스파르타코딩클럽] 웹개발 종합반 3주차 개발일지
    [웹개발일지] 2022. 8. 16. 22:31

     

    스파르타코딩클럽의 웹개발 종합반 3주차 강의에서는 Python의 기초 문법을 배우고, Python의 다양한 패키지를 통해 웹을 크롤링 하여 데이터를 다루는법을 배운다.

     

    먼저, 네이버 영화 페이지를 크롤링해서 영화의 순위, 제목, 평점을 보여주는 코드를 작성했다.

    Python의 requests, beutifulsoup4 패키지를 설치했다. requests 패키지는 Python에서 특정 웹사이트에 HTTP요청을 보내서 HTML을 받아오는 라이브러리 이고, beutifulsoup는 이 자료를 검색하기 용이한 상태로 만들어 준다.

    beutifulsoup 내 select를 이용해서 데이터를 활용한다.

    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.naver?sel=pnt&date=20210829',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
    
    movies = soup.select('#old_content > table > tbody > tr')
    
    for movie in movies:
        a = movie.select_one('td.title > div > a')
        if a is not None:
            title = a.text
            rank = movie.select_one('td:nth-child(1) > img')['alt']
            star = movie.select_one('td.point').text
            doc = {
                'title':title,
                'rank':rank,
                'star':star
            }

     

    <select 사용법>

    # 선택자를 사용하는 방법 (copy selector) soup.select('태그명')

    soup.select('.클래스명')

    soup.select('#아이디명')

     

    soup.select('상위태그명 > 하위태그명 > 하위태그명')

    soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

     

    # 태그와 속성값으로 찾는 방법

    soup.select('태그명[속성="값"]')

     

    # 한 개만 가져오고 싶은 경우

    soup.select_one('위와 동일')

     

    또한, mongoDB Atlas라는 클라우드 서비스와 연동하여 DB를 통해 데이터를 다루는 것을 배웠다. Python에서 mongoDB를 조작하기 위해서 필요한 pymongo 패키지와 dnspython패키지를 설치하였다. 하여 pymongo로 mongoDB를 아래처럼 조작하는 법을 배웠다.

    from pymongo import MongoClient
    import certifi
    
    ca = certifi.where()
    
    client = MongoClient('mongodb+srv://test:sparta@cluster0.9pyyebx.mongodb.net/?retryWrites=true&w=majority', tlsCAFile=ca)
    db = client.dbsparta
    
    # 저장 - 예시
    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주차 숙제는 지니뮤직 사이트의 1-50위 곡을 스크랩핑 하여 순위 / 곡 제목 / 가수를 보여주는 코드를 작성하는 것이였다.

    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=M&rtm=N&ymd=20210701',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    musics = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
    
    for music in musics:
        title = music.select_one('td.info > a.title.ellipsis').text.replace('19금', '').strip()
        rank =  music.select_one('td.number').text[0:2].strip()
        artist = music.select_one('td.info > a.artist.ellipsis').text
        print(rank, title, artist)
    
    

     

    이렇게 해서 3주차에도 정말 많고 낯선 내용을 배웠다. 강의 느낌이 수박 겉핥기 식으로만 배우는 것 같아서 심도있게 공부하고 알아가는건 정말 내 몫인 것 같다. 다른 강의들도 참고해서 프론트엔드 지식의 깊이를 채워가야겠다. 처음엔 매우 어려워서 멘탈이 나갈뻔 했지만 여러번 반복해서 보다보니 전부 이해하지는 못하더라도 낯선 코드와 내용들이 눈과 머리에 익숙해지긴 했다. 개발자의 필수 자질은 낯선 내용을 배우는 것에 대한 거부감이 없어야 한다고 생각하기 때문에 이번주도 아주 모조리 받아들여버릴테다.

     

Designed by Tistory.