스파르타 웹 개발 종합 - 3주차

heehe·2023년 1월 13일
0

Sparta-coding club

목록 보기
10/16
post-thumbnail

오늘 공부한 내용 📋


  • 스파르타 웹 개발 종합 - 3주차 완료

  • 웹스크래핑(크롤링) , DB 연결

    • 파이참에 beautifulsoup4 패키지 설치

      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.naver?sel=pnt&date=20210829',headers=headers)
      
      # HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
      # soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
      # 이제 코딩을 통해 필요한 부분을 추출하면 된다.
      soup = BeautifulSoup(data.text, 'html.parser')
      
      #############################
      # (입맛에 맞게 코딩)
      #############################
    • select / seect_one 사용

      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.naver?sel=pnt&date=20210829',headers=headers)
      
      # HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
      soup = BeautifulSoup(data.text, 'html.parser')
      
      # select를 이용해서, tr들을 불러오기
      movies = soup.select('#old_content > table > tbody > tr')
      
      # movies (tr들) 의 반복문을 돌리기
      for movie in movies:
          # movie 안에 a 가 있으면,
          a_tag = movie.select_one('td.title > div > a')
          if a_tag is not None:
              # a의 text를 찍어본다.
              print (a_tag.text)
    • beautifulsoup 내 select에 미리 정의된 다른 방법

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

    • 원하는 부분에서 마우스 오른쪽 클릭 → 검사
    • 원하는 태그에서 마우스 오른쪽 클릭
    • Copy → Copy selector로 선택자를 복사할 수 있음
  • DB 정의

    • RDBMS / No-SQL
    • 요새 트랜드는 클라우드 형식
  • mongoDB Atlas 사용 해보기

    • pymongo로 mongoDB 조작하기
      # 저장 - 예시
      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'})
    • 저장한 DB값 불러오기
      #movie 값 불러오기
      target_movie = db.movie.find_one({'title':'가버나움'})
      target_star = target_movie['star']
      
      db.movie.update_one({'title':'가버나움'},{'$set':{'star':'0'}})
      
      ###다른 예
      
      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 movies in movies:
          a = movies.select_one('td.title > div > a')
          if a is not None:
              title = a.text
              rank = movies.select_one('td:nth-child(1) > img')['alt']
              star = movies.select_one('td.point').text
      
              doc = {
                  'title':title,
                  'rank':rank,
                  'star':star
              }
      
              db.movie.insert_one(doc)
  • 숙제 : 지니뮤직 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')
    
    #body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
    #body-content > div.newest-list > div > table > tbody > tr:nth-child(15) > td.info > a.title.ellipsis > span
    
    music = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
    
    for music in music:
            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.strip()
    
            print(rank,title,artist)

회고 및 코멘트 🙏🏻


  • mongoDB 처음 써봤는데, 어떻게 쓰이는지 get ↔  host 를 정확히 알거 같다.
  • 파이썬은 아직도..멀고도 험하다.. 알아둔 것을 써먹고 또 써먹으려고 노력해야겠다.
  • 언제 한번 자바스크립트와 파이썬 문법 정리 해야겠다.
profile
성장하고픈 ISFJ

0개의 댓글