ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3일차- 내일배움캠프 1기 TIL(Today I learned)_파이썬/웹스크레핑/MongoDB
    개발일지(TIL) 2021. 9. 16. 10:16

    월, 화, 수 3일 안에

    강의 완강이 목표인 이유로 2일간 수면부족+피곤함과 싸웠다. 

    같은 이유로 개발 일지를 2일이나 밀려서 밀린 2일 치를 적어본다. 

     


     

    1. 설치한 것

    -파이썬, 몽고디비, Robo3T

     

    2.복습한 것 $.Ajax

    -

    HTML로 쏘는 값들이 중복으로 계속 입력되서,

    추가로 입력되는 중복값을 없애는 기능을 구현했다. 

    ajax 메서드 중에, . .ready()는 DOM tree가 생성된 이후에 실행되는 메서드이다. 

    ```jsx
    <script>
        $(document).ready(function () {
            $('#cards-box').empty('');
            listing();
        });
    
        function listing() {
            $.ajax({
    				  type: "GET",
    				  url: "http://spartacodingclub.shop/post",
    				  data: {},
    				  success: function (response) {
    				      let articles = response['articles'];
    				      for (let i = 0; i < articles.length; i++) {
    				          let article = articles[i];
    				          let image = article["image"];
    				          let url = article["url"];
    				          let title = article["title"];
    				          let desc = article["desc"];
    				          let comment = article["comment"];
    				          let temp_html = `<div class="card">
    				                             <img class="card-img-top" src="${image}" alt="Card image cap">
    				                             <div class="card-body">
    				                               <a href="${url}" target="_blank" class="card-title">${title}</a>
    				                               <p class="card-text">${desc}</p>
    				                               <p class="card-text comment">${comment}</p>
    				                             </div>
    				                           </div>`;
    				          $('#cards-box').append(temp_html);
    				      }
    				  }
    				})
        }
    
        function openclose() {
            // id 값 post-box의 display 값이 block 이면
            if ($('#post-box').css('display') == 'block') {
                // post-box를 가리고
                $('#post-box').hide();
                $('#btn-posting-box').text('포스팅 박스 열기');
            } else {
                // 아니면 post-box를 펴라
                $('#post-box').show();
                $('#btn-posting-box').text('포스팅 박스 닫기');
            }
        }
    </script>
    ```

     

    3.파이썬 

    -기본 문법(변수, 조건문, 반복문, 함수, 데이터타입)

    -사용 패키지 : requests, bs4 pymongo

    -웹스크래핑 : requests/bs4를 사용 + 크롬 개발자 도구에서 사용하고 싶은 html요소 copy selector로 가져오기

     

    #기본 세팅!
    import requests
    from bs4 import BeautifulSoup
    
    # 타겟 URL을 읽어서 HTML를 받아오고,
    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.nhn?sel=pnt&date=20200303',headers=headers)
    
    # HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
    # soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
    # 이제 코딩을 통해 필요한 부분을 추출하면 된다.
    soup = BeautifulSoup(data.text, 'html.parser')

    select, select_one으로 원하는 Data 가져오기!

    # 선택자를 사용하는 방법 (copy selector)
    soup.select('태그명')
    soup.select('.클래스명')
    soup.select('#아이디명')
    
    soup.select('상위태그명 > 하위태그명 > 하위태그명')
    soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
    
    # 태그와 속성값으로 찾는 방법
    soup.select('태그명[속성="값"]')
    
    # 한 개만 가져오고 싶은 경우
    soup.select_one('위와 동일')

     - 실습으로 네이버 인기영화 데이터를 스크랩핑 했다. 

     - 필요하지 않은 데이터들도 같이 스크랩되는 이유로 고민하고 씨름했다.

    **** 공백 없애기 .strip()

    **** 필요없는 문자 없애기 .strip('필요없는 문자')

    회고:  아직도 이해할 수 없지만 .strip으로 원하는 데이터 하위에 있는 <span>테그를 지웠더니 

    목표데이터가 망가지는 현상이 있었다...(아직도 모르겠다..) 다행히 같이 공부하는 팀원이 해결책을 주었는데,

    String[0:2]로 원하는 문자열만 배열식으로 반환하는 방법을 사용했다. 

     

    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=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
    
    for tr in trs:
        title = tr.select_one('td.info > a.title.ellipsis').text.strip()
        rank = tr.select_one('td.number').text[0:2].strip()
        artist = tr.select_one('td.info > a.artist.ellipsis').text
        print(rank, title, artist)

     

    4.몽고디비 CRUD 구현

    -여러개 찾을때 list()처리를 해주지 않아서, 장시간 오류와 씨름했다,,

    -DB에서 받아온 데이터를 반복문으로 Array[i]['key'] 형태로 써야하기 때문에  잊지말고 사용해 주자. 

     

    #기본 세팅
    from pymongo import MongoClient
    client = MongoClient('localhost', 27017)
    db = client.dbsparta
    
    # 코딩 시작
    # C insert / R find / U update / D 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'})

     

     

     

    반응형
Designed by Tistory.