ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 오늘도 쓴다 개발일지 3편
    개발일지 2021. 8. 24. 10:31

    직장 방학이 끝나면서 직장이랑 병행했더니 강의듣다가 의식이 자꾸 날라간다.

    글 적다가 이번에 뭐 배웠었지? 하고 뇌정지옴

     

    시작한지 벌써 일주일 정도 지난 것 같은데, 출발 점에 있던 진도사우르스가 출발했더라

    1주차로 진격한 진도사우르스

    쟤한테 잡히면 스파가 되어서 털썩당하는데, 게임오버 같은건가?

    아무튼 1주차에서 벗어나지 못한 사람들이 저렇게 변해버렸다.

     

    이번에 배웠던 내용은 파이썬과 DB에 관한 내용이었다.

     

    파이썬이야 졸업논문도 파이썬으로 만든 프로그램 가지고 적어냈고, 대학교 다니면서 계속 사용한 언어기 때문에 기초 내용이야 매우 쉽게 넘어갔다.

    DB은 MongoDB 프로그램을 사용하여 학습하였다.

     

    문제는 둘이 섞어쓰려니까 좀 헷갈렸다.

     

    파이썬 기초는 이미 익숙하니까 넘어가고, 웹 크롤링과 크롤링한 데이터를 활용한 DB조작이 주된 내용이었다.

     

    학교에서 데이터/텍스트마이닝 공부하면서 질리도록 했던 '그' 웹 크롤링..

     

    requests와 bs4 패키지를 import하여 사용하였다.

     

    실습은 아래와 같은 영화 정보를

    이렇게 가져오는 간단한 연습이었다. ' .text 를 사용하는 것이 요점!'

     

    for tr in trs:
        #제목
        a_tag = tr.select_one('td.title > div > a')
        #.text를 붙여서 if문을 단축할 수 있음.
        
        #평점
        a_score = tr.select_one('td.point')
        #위와 동일
        
        #순위
        a_rank = tr.select_one('td:nth-child(1) > img')
    	#if 문 안에서 한번에 정리하려면 a_rank = tr.select_one('td:nth-child(1) > img')['alt]
        
        # old_content > table > tbody > tr:nth-child(12) > td (NONE 값이 존재하는 행의 selector)
        # NONE 값이 존재하기 때문에 if문을 사용하여 데이터를 걸러줘야 한다
        if a_tag is not None:
            
            rank = a_rank['alt']
            title = a_tag.text
            score = a_score.text
            
            print(rank,title,score)

    DB는 mongoDB를 사용하기 위해 pymongo를 사용함

     

    # insert 데이터 넣기 / find 찾기 / update 데이터 업데이트(수정) / delete 지우기
    
    # 저장 - 예시
    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'})

    간단한 조작을 연습했다. DB는 Robo3T를 실행해서 확인할 수 있다. 처음에 mongoDB를 실행시키려고 찾아 헤멤..

     

    db = client.dbsparta
    
    name01 = db.movies.find_one({'title':'매트릭스'})
    t_star = name01['star']
    print(t_star)
    
    same_scores = list(db.movies.find({'star':t_star}))
    for movies in same_scores:
        print(movies['title'])
    
    #내용물을 확인해 보니 평점은 사실 문자열이었다..!
    db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
    name02 = db.movies.find_one({'title':'매트릭스'})
    print(name02['star'])
    
    #0으로 수정한 값을 다시 원상복구 시켜두고 끝내기
    db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'9.39'}})

    중간 중간 있는 퀴즈를 풀었던 거, 총 세 문제를 각각 푸는거 였는데 한번에 실행할 수 있게 다시 작성해봤다.

     

    과제는 DB에 관한 내용은 나오지 않았고, 음원 사이트의 순위를 크롤링 해서 정리해두는 거였는데.

    깔끔하게 정리되지 않아서 시간이 좀 걸렸다. 아마 .strip() 을 사용해보게하기 위함인 것 같다.

     

    덤으로 과제하다 .text 붙이는 거 깜빡해서 한번 더 헤멤.. 까먹지말자..메..모....

     

    trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
    
    #1위 타이틀 :body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis
    #2위 타이틀 :body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.info > a.title.ellipsis
    
    #가수 body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
    #순위 body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
    
    for tr in trs :
        rank = tr.select_one('td.number').text[0:2].strip()
        # 순위말고도 변동내역이 함께 포함되어있으니 가장 앞에있는 순위를 slice해준다.
        # 0<= 내용물 <2
        
        title = tr.select_one('td.info > a.title.ellipsis').text.strip()
        artist = tr.select_one('td.info > a.artist.ellipsis').text.strip()
    
        print(rank,title,artist)

     

    고뇌의 흔적을 남기고 작성완료오

    '개발일지' 카테고리의 다른 글

    복습일지 02  (0) 2021.08.27
    오랜만에 개발일지 4편  (0) 2021.08.27
    복습일지 01  (0) 2021.08.25
    응애 나 뉴비 개발일지 2편  (0) 2021.08.22
    뉴우비 개발일지 1편  (0) 2021.08.20

    댓글

Designed by Tistory.