상세 컨텐츠

본문 제목

웹코딩 3주차(2)

취미/코딩

by Kyzen 2021. 12. 27. 10:22

본문

06. 파이썬 패키지 설치하기

    1. 파이썬 패키지(package) 설치하기
    <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
      1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
      <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
    • </aside>
    • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
    • </aside>
    • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
    • </aside>
    • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
      1. pip(python install package) 사용 - requests 패키지 설치해보기
      <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
      • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
    • </aside>
  • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!

07. 패키지 사용해보기

08. 웹스크래핑(크롤링) 기초

    1. 웹스크래핑 해보기 (영화 제목)
    • 어떤 걸 스크래핑 할 계획인가요?
    • 패키지 추가 설치하기(beautifulsoup4)
    • bs4
    • 크롤링 기본 세팅
      • [코드스니펫] 크롤링 기본 세팅
      • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
      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의 사용법을 익혀봅니다.</aside></aside>
    • 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 = 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)
    • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
    • <aside> 👉 영화 제목을 가져와보기!
    • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
    • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
    • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
      1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
      2. 원하는 태그에서 마우스 오른쪽 클릭
      3. Copy → Copy selector로 선택자를 복사할 수 있음

09. Quiz_웹스크래핑(크롤링) 연습

    1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
    • Q. 아래와 같이 보이면 완성!
    • A. 완성 코드
    • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)

10**. DB설치 확인**

    1. DB 설치 확인
    <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
  • </aside>
    1. robo 3T 준비하기
    • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
    • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
    • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
    • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
    • robo3T 세팅하기</aside>
    • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
    • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
    • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!

11. DB개괄

    1. 들어가기 전에 : DB의 두 가지 종류
    <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
  • </aside>
  • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
  • </aside>
  • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
  • <aside> 👉 RDBMS(SQL)
  • </aside>

12. pymongo로 DB조작하기

    1. pymongo로 mongoDB 조작하기
    • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
    • </aside>
    • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
    • 패키지 설치하기
    • pymongo
    • [코드스니펫] pymongo 기본 코드
    • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
    • DB연결하기 & 데이터 넣기
      • [코드스니펫] pymongo(insert)
      • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
      from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
      client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
      db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
      
      # MongoDB에 insert 하기
      
      # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
      db.users.insert_one({'name':'bobby','age':21})
      db.users.insert_one({'name':'kay','age':27})
      db.users.insert_one({'name':'john','age':30})
      
    • 모든 결과 값을 보기
      • [코드스니펫] pymongo(find)
      • same_ages = list(db.users.find({'age':21},{'_id':False}))
      from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
      client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
      db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
      
      # MongoDB에서 데이터 모두 보기
      all_users = list(db.users.find({}))
      
      # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
      same_ages = list(db.users.find({'age':21},{'_id':False}))
      
      print(all_users[0])         # 0번째 결과값을 보기
      print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
      
      for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
          print(user)
      
    • 특정 결과 값을 뽑아 보기
      • [코드스니펫] pymongo(find_one)
      • user = db.users.find_one({'name':'bobby'})
      user = db.users.find_one({'name':'bobby'})
      print(user)
      
    • 수정하기
      • [코드스니펫] pymongo(update_one)
      • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
      # 생김새
      db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
      
      # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
      db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
      
      user = db.users.find_one({'name':'bobby'})
      print(user)
      
    • 삭제하기 (거의 안 씀)
      • [코드스니펫] pymongo(delete_one)
      • db.users.delete_one({'name':'bobby'})
      db.users.delete_one({'name':'bobby'})
      
      user = db.users.find_one({'name':'bobby'})
      print(user)
      
    1. pymongo 사용법. 코드요약
    • [코드스니펫] pymongo 코드 요약
    • # 저장 - 예시 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'})
    <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
    # 저장 - 예시
    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'})
    
  • </aside>

13. 웹스크래핑 결과 저장하기

    1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
    • 이 코드에서 시작해봅시다!
      • [코드스니펫] 크롤링 완성코드
      • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
    • pymongo 기본 세팅
    • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
    • 도큐먼트 만들어 하나씩 insert 하기
    • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)

14. Quiz_웹스크래핑 결과 이용하기

    1. ✍find, update 연습하기 (delete는 연습 안할게요!)
    • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
      • [코드스니펫] pymongo 기본 코드
      • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
    • (1) 영화제목 '매트릭스'의 평점을 가져오기
      • Q. 이렇게 되면 완성
      • A. 완성 코드
      • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
    • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
      • Q. 이렇게 되면 완성
      • A. 완성 코드
      • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
    • (3) 매트릭스 영화의 평점을 0으로 만들기
      • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
      • A. 완성 코드
      • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})

15. 3주차 끝 & 숙제 설명

<aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.

</aside>

HW. 3주차 숙제 해설

  • [코드스니펫] 3주차 숙제 답안 코드
  • 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)06. 파이썬 패키지 설치하기
      1. 파이썬 패키지(package) 설치하기
      <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
        1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
        <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
      • </aside>
      • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
      • </aside>
      • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
      • </aside>
      • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
        1. pip(python install package) 사용 - requests 패키지 설치해보기
        <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
        • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
      • </aside>
    • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
    07. 패키지 사용해보기 08. 웹스크래핑(크롤링) 기초
      1. 웹스크래핑 해보기 (영화 제목)
      • 어떤 걸 스크래핑 할 계획인가요?
      • 패키지 추가 설치하기(beautifulsoup4)
      • bs4
      • 크롤링 기본 세팅
        • [코드스니펫] 크롤링 기본 세팅
        • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
        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의 사용법을 익혀봅니다.</aside></aside>
      • 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 = 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)
      • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
      • <aside> 👉 영화 제목을 가져와보기!
      • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
      • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
      • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
        1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
        2. 원하는 태그에서 마우스 오른쪽 클릭
        3. Copy → Copy selector로 선택자를 복사할 수 있음
    09. Quiz_웹스크래핑(크롤링) 연습
      1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
      • Q. 아래와 같이 보이면 완성!
      • A. 완성 코드
      • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
    10**. DB설치 확인**
      1. DB 설치 확인
      <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
    • </aside>
      1. robo 3T 준비하기
      • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
      • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
      • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
      • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
      • robo3T 세팅하기</aside>
      • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
      • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
      • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!
    11. DB개괄
      1. 들어가기 전에 : DB의 두 가지 종류
      <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
    • </aside>
    • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
    • </aside>
    • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
    • <aside> 👉 RDBMS(SQL)
    • </aside>
    12. pymongo로 DB조작하기
      1. pymongo로 mongoDB 조작하기
      • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
      • </aside>
      • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
      • 패키지 설치하기
      • pymongo
      • [코드스니펫] pymongo 기본 코드
      • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
      • DB연결하기 & 데이터 넣기
        • [코드스니펫] pymongo(insert)
        • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
        from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
        client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
        db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
        
        # MongoDB에 insert 하기
        
        # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
        db.users.insert_one({'name':'bobby','age':21})
        db.users.insert_one({'name':'kay','age':27})
        db.users.insert_one({'name':'john','age':30})
        
      • 모든 결과 값을 보기
        • [코드스니펫] pymongo(find)
        • same_ages = list(db.users.find({'age':21},{'_id':False}))
        from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
        client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
        db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
        
        # MongoDB에서 데이터 모두 보기
        all_users = list(db.users.find({}))
        
        # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
        same_ages = list(db.users.find({'age':21},{'_id':False}))
        
        print(all_users[0])         # 0번째 결과값을 보기
        print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
        
        for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
            print(user)
        
      • 특정 결과 값을 뽑아 보기
        • [코드스니펫] pymongo(find_one)
        • user = db.users.find_one({'name':'bobby'})
        user = db.users.find_one({'name':'bobby'})
        print(user)
        
      • 수정하기
        • [코드스니펫] pymongo(update_one)
        • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
        # 생김새
        db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
        
        # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
        db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
        
        user = db.users.find_one({'name':'bobby'})
        print(user)
        
      • 삭제하기 (거의 안 씀)
        • [코드스니펫] pymongo(delete_one)
        • db.users.delete_one({'name':'bobby'})
        db.users.delete_one({'name':'bobby'})
        
        user = db.users.find_one({'name':'bobby'})
        print(user)
        
      1. pymongo 사용법. 코드요약
      • [코드스니펫] pymongo 코드 요약
      • # 저장 - 예시 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'})
      <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
      # 저장 - 예시
      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'})
      
    • </aside>
    13. 웹스크래핑 결과 저장하기
      1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
      • 이 코드에서 시작해봅시다!
        • [코드스니펫] 크롤링 완성코드
        • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
      • pymongo 기본 세팅
      • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
      • 도큐먼트 만들어 하나씩 insert 하기
      • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)
    14. Quiz_웹스크래핑 결과 이용하기
      1. ✍find, update 연습하기 (delete는 연습 안할게요!)
      • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
        • [코드스니펫] pymongo 기본 코드
        • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
      • (1) 영화제목 '매트릭스'의 평점을 가져오기
        • Q. 이렇게 되면 완성
        • A. 완성 코드
        • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
      • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
        • Q. 이렇게 되면 완성
        • A. 완성 코드
        • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
      • (3) 매트릭스 영화의 평점을 0으로 만들기
        • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
        • A. 완성 코드
        • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
    15. 3주차 끝 & 숙제 설명</aside> HW. 3주차 숙제 해설
    • [코드스니펫] 3주차 숙제 답안 코드
    • 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)06. 파이썬 패키지 설치하기
        1. 파이썬 패키지(package) 설치하기
        <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
          1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
          <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
        • </aside>
        • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
        • </aside>
        • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
        • </aside>
        • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
          1. pip(python install package) 사용 - requests 패키지 설치해보기
          <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
          • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
        • </aside>
      • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
      07. 패키지 사용해보기 08. 웹스크래핑(크롤링) 기초
        1. 웹스크래핑 해보기 (영화 제목)
        • 어떤 걸 스크래핑 할 계획인가요?
        • 패키지 추가 설치하기(beautifulsoup4)
        • bs4
        • 크롤링 기본 세팅
          • [코드스니펫] 크롤링 기본 세팅
          • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
          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의 사용법을 익혀봅니다.</aside></aside>
        • 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 = 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)
        • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
        • <aside> 👉 영화 제목을 가져와보기!
        • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
        • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
        • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
          1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
          2. 원하는 태그에서 마우스 오른쪽 클릭
          3. Copy → Copy selector로 선택자를 복사할 수 있음
      09. Quiz_웹스크래핑(크롤링) 연습
        1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
        • Q. 아래와 같이 보이면 완성!
        • A. 완성 코드
        • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
      10**. DB설치 확인**
        1. DB 설치 확인
        <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
      • </aside>
        1. robo 3T 준비하기
        • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
        • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
        • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
        • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
        • robo3T 세팅하기</aside>
        • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
        • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
        • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!
      11. DB개괄
        1. 들어가기 전에 : DB의 두 가지 종류
        <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
      • </aside>
      • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
      • </aside>
      • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
      • <aside> 👉 RDBMS(SQL)
      • </aside>
      12. pymongo로 DB조작하기
        1. pymongo로 mongoDB 조작하기
        • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
        • </aside>
        • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
        • 패키지 설치하기
        • pymongo
        • [코드스니펫] pymongo 기본 코드
        • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
        • DB연결하기 & 데이터 넣기
          • [코드스니펫] pymongo(insert)
          • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
          from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
          client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
          db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
          
          # MongoDB에 insert 하기
          
          # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
          db.users.insert_one({'name':'bobby','age':21})
          db.users.insert_one({'name':'kay','age':27})
          db.users.insert_one({'name':'john','age':30})
          
        • 모든 결과 값을 보기
          • [코드스니펫] pymongo(find)
          • same_ages = list(db.users.find({'age':21},{'_id':False}))
          from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
          client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
          db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
          
          # MongoDB에서 데이터 모두 보기
          all_users = list(db.users.find({}))
          
          # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
          same_ages = list(db.users.find({'age':21},{'_id':False}))
          
          print(all_users[0])         # 0번째 결과값을 보기
          print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
          
          for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
              print(user)
          
        • 특정 결과 값을 뽑아 보기
          • [코드스니펫] pymongo(find_one)
          • user = db.users.find_one({'name':'bobby'})
          user = db.users.find_one({'name':'bobby'})
          print(user)
          
        • 수정하기
          • [코드스니펫] pymongo(update_one)
          • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
          # 생김새
          db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
          
          # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
          db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
          
          user = db.users.find_one({'name':'bobby'})
          print(user)
          
        • 삭제하기 (거의 안 씀)
          • [코드스니펫] pymongo(delete_one)
          • db.users.delete_one({'name':'bobby'})
          db.users.delete_one({'name':'bobby'})
          
          user = db.users.find_one({'name':'bobby'})
          print(user)
          
        1. pymongo 사용법. 코드요약
        • [코드스니펫] pymongo 코드 요약
        • # 저장 - 예시 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'})
        <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
        # 저장 - 예시
        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'})
        
      • </aside>
      13. 웹스크래핑 결과 저장하기
        1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
        • 이 코드에서 시작해봅시다!
          • [코드스니펫] 크롤링 완성코드
          • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
        • pymongo 기본 세팅
        • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
        • 도큐먼트 만들어 하나씩 insert 하기
        • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)
      14. Quiz_웹스크래핑 결과 이용하기
        1. ✍find, update 연습하기 (delete는 연습 안할게요!)
        • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
          • [코드스니펫] pymongo 기본 코드
          • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
        • (1) 영화제목 '매트릭스'의 평점을 가져오기
          • Q. 이렇게 되면 완성
          • A. 완성 코드
          • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
        • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
          • Q. 이렇게 되면 완성
          • A. 완성 코드
          • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
        • (3) 매트릭스 영화의 평점을 0으로 만들기
          • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
          • A. 완성 코드
          • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
      15. 3주차 끝 & 숙제 설명</aside> HW. 3주차 숙제 해설
      • [코드스니펫] 3주차 숙제 답안 코드
      • 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)06. 파이썬 패키지 설치하기
          1. 파이썬 패키지(package) 설치하기
          <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
            1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
            <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
          • </aside>
          • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
          • </aside>
          • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
          • </aside>
          • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
            1. pip(python install package) 사용 - requests 패키지 설치해보기
            <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
            • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
          • </aside>
        • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
        07. 패키지 사용해보기 08. 웹스크래핑(크롤링) 기초
          1. 웹스크래핑 해보기 (영화 제목)
          • 어떤 걸 스크래핑 할 계획인가요?
          • 패키지 추가 설치하기(beautifulsoup4)
          • bs4
          • 크롤링 기본 세팅
            • [코드스니펫] 크롤링 기본 세팅
            • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
            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의 사용법을 익혀봅니다.</aside></aside>
          • 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 = 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)
          • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
          • <aside> 👉 영화 제목을 가져와보기!
          • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
          • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
          • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
            1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
            2. 원하는 태그에서 마우스 오른쪽 클릭
            3. Copy → Copy selector로 선택자를 복사할 수 있음
        09. Quiz_웹스크래핑(크롤링) 연습
          1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
          • Q. 아래와 같이 보이면 완성!
          • A. 완성 코드
          • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
        10**. DB설치 확인**
          1. DB 설치 확인
          <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
        • </aside>
          1. robo 3T 준비하기
          • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
          • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
          • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
          • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
          • robo3T 세팅하기</aside>
          • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
          • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
          • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!
        11. DB개괄
          1. 들어가기 전에 : DB의 두 가지 종류
          <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
        • </aside>
        • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
        • </aside>
        • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
        • <aside> 👉 RDBMS(SQL)
        • </aside>
        12. pymongo로 DB조작하기
          1. pymongo로 mongoDB 조작하기
          • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
          • </aside>
          • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
          • 패키지 설치하기
          • pymongo
          • [코드스니펫] pymongo 기본 코드
          • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
          • DB연결하기 & 데이터 넣기
            • [코드스니펫] pymongo(insert)
            • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
            from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
            client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
            db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
            
            # MongoDB에 insert 하기
            
            # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
            db.users.insert_one({'name':'bobby','age':21})
            db.users.insert_one({'name':'kay','age':27})
            db.users.insert_one({'name':'john','age':30})
            
          • 모든 결과 값을 보기
            • [코드스니펫] pymongo(find)
            • same_ages = list(db.users.find({'age':21},{'_id':False}))
            from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
            client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
            db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
            
            # MongoDB에서 데이터 모두 보기
            all_users = list(db.users.find({}))
            
            # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
            same_ages = list(db.users.find({'age':21},{'_id':False}))
            
            print(all_users[0])         # 0번째 결과값을 보기
            print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
            
            for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
                print(user)
            
          • 특정 결과 값을 뽑아 보기
            • [코드스니펫] pymongo(find_one)
            • user = db.users.find_one({'name':'bobby'})
            user = db.users.find_one({'name':'bobby'})
            print(user)
            
          • 수정하기
            • [코드스니펫] pymongo(update_one)
            • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
            # 생김새
            db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
            
            # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
            db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
            
            user = db.users.find_one({'name':'bobby'})
            print(user)
            
          • 삭제하기 (거의 안 씀)
            • [코드스니펫] pymongo(delete_one)
            • db.users.delete_one({'name':'bobby'})
            db.users.delete_one({'name':'bobby'})
            
            user = db.users.find_one({'name':'bobby'})
            print(user)
            
          1. pymongo 사용법. 코드요약
          • [코드스니펫] pymongo 코드 요약
          • # 저장 - 예시 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'})
          <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
          # 저장 - 예시
          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'})
          
        • </aside>
        13. 웹스크래핑 결과 저장하기
          1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
          • 이 코드에서 시작해봅시다!
            • [코드스니펫] 크롤링 완성코드
            • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
          • pymongo 기본 세팅
          • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
          • 도큐먼트 만들어 하나씩 insert 하기
          • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)
        14. Quiz_웹스크래핑 결과 이용하기
          1. ✍find, update 연습하기 (delete는 연습 안할게요!)
          • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
            • [코드스니펫] pymongo 기본 코드
            • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
          • (1) 영화제목 '매트릭스'의 평점을 가져오기
            • Q. 이렇게 되면 완성
            • A. 완성 코드
            • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
          • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
            • Q. 이렇게 되면 완성
            • A. 완성 코드
            • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
          • (3) 매트릭스 영화의 평점을 0으로 만들기
            • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
            • A. 완성 코드
            • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
        15. 3주차 끝 & 숙제 설명</aside> HW. 3주차 숙제 해설
        • [코드스니펫] 3주차 숙제 답안 코드
        • 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)06. 파이썬 패키지 설치하기
            1. 파이썬 패키지(package) 설치하기
            <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
              1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
              <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
            • </aside>
            • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
            • </aside>
            • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
            • </aside>
            • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
              1. pip(python install package) 사용 - requests 패키지 설치해보기
              <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
              • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
            • </aside>
          • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
          07. 패키지 사용해보기 08. 웹스크래핑(크롤링) 기초
            1. 웹스크래핑 해보기 (영화 제목)
            • 어떤 걸 스크래핑 할 계획인가요?
            • 패키지 추가 설치하기(beautifulsoup4)
            • bs4
            • 크롤링 기본 세팅
              • [코드스니펫] 크롤링 기본 세팅
              • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
              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의 사용법을 익혀봅니다.</aside></aside>
            • 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 = 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)
            • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
            • <aside> 👉 영화 제목을 가져와보기!
            • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
            • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
            • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
              1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
              2. 원하는 태그에서 마우스 오른쪽 클릭
              3. Copy → Copy selector로 선택자를 복사할 수 있음
          09. Quiz_웹스크래핑(크롤링) 연습
            1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
            • Q. 아래와 같이 보이면 완성!
            • A. 완성 코드
            • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
          10**. DB설치 확인**
            1. DB 설치 확인
            <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
          • </aside>
            1. robo 3T 준비하기
            • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
            • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
            • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
            • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
            • robo3T 세팅하기</aside>
            • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
            • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
            • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!
          11. DB개괄
            1. 들어가기 전에 : DB의 두 가지 종류
            <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
          • </aside>
          • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
          • </aside>
          • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
          • <aside> 👉 RDBMS(SQL)
          • </aside>
          12. pymongo로 DB조작하기
            1. pymongo로 mongoDB 조작하기
            • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
            • </aside>
            • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
            • 패키지 설치하기
            • pymongo
            • [코드스니펫] pymongo 기본 코드
            • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
            • DB연결하기 & 데이터 넣기
              • [코드스니펫] pymongo(insert)
              • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
              from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
              client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
              db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
              
              # MongoDB에 insert 하기
              
              # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
              db.users.insert_one({'name':'bobby','age':21})
              db.users.insert_one({'name':'kay','age':27})
              db.users.insert_one({'name':'john','age':30})
              
            • 모든 결과 값을 보기
              • [코드스니펫] pymongo(find)
              • same_ages = list(db.users.find({'age':21},{'_id':False}))
              from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
              client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
              db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
              
              # MongoDB에서 데이터 모두 보기
              all_users = list(db.users.find({}))
              
              # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
              same_ages = list(db.users.find({'age':21},{'_id':False}))
              
              print(all_users[0])         # 0번째 결과값을 보기
              print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
              
              for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
                  print(user)
              
            • 특정 결과 값을 뽑아 보기
              • [코드스니펫] pymongo(find_one)
              • user = db.users.find_one({'name':'bobby'})
              user = db.users.find_one({'name':'bobby'})
              print(user)
              
            • 수정하기
              • [코드스니펫] pymongo(update_one)
              • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
              # 생김새
              db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
              
              # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
              db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
              
              user = db.users.find_one({'name':'bobby'})
              print(user)
              
            • 삭제하기 (거의 안 씀)
              • [코드스니펫] pymongo(delete_one)
              • db.users.delete_one({'name':'bobby'})
              db.users.delete_one({'name':'bobby'})
              
              user = db.users.find_one({'name':'bobby'})
              print(user)
              
            1. pymongo 사용법. 코드요약
            • [코드스니펫] pymongo 코드 요약
            • # 저장 - 예시 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'})
            <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
            # 저장 - 예시
            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'})
            
          • </aside>
          13. 웹스크래핑 결과 저장하기
            1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
            • 이 코드에서 시작해봅시다!
              • [코드스니펫] 크롤링 완성코드
              • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
            • pymongo 기본 세팅
            • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
            • 도큐먼트 만들어 하나씩 insert 하기
            • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)
          14. Quiz_웹스크래핑 결과 이용하기
            1. ✍find, update 연습하기 (delete는 연습 안할게요!)
            • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
              • [코드스니펫] pymongo 기본 코드
              • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
            • (1) 영화제목 '매트릭스'의 평점을 가져오기
              • Q. 이렇게 되면 완성
              • A. 완성 코드
              • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
            • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
              • Q. 이렇게 되면 완성
              • A. 완성 코드
              • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
            • (3) 매트릭스 영화의 평점을 0으로 만들기
              • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
              • A. 완성 코드
              • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
          15. 3주차 끝 & 숙제 설명</aside> HW. 3주차 숙제 해설
          • [코드스니펫] 3주차 숙제 답안 코드
          • 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)06. 파이썬 패키지 설치하기
              1. 파이썬 패키지(package) 설치하기
              <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
                1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
                <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
              • </aside>
              • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
              • </aside>
              • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
              • </aside>
              • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
                1. pip(python install package) 사용 - requests 패키지 설치해보기
                <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
                • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
              • </aside>
            • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
            07. 패키지 사용해보기 08. 웹스크래핑(크롤링) 기초
              1. 웹스크래핑 해보기 (영화 제목)
              • 어떤 걸 스크래핑 할 계획인가요?
              • 패키지 추가 설치하기(beautifulsoup4)
              • bs4
              • 크롤링 기본 세팅
                • [코드스니펫] 크롤링 기본 세팅
                • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
                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의 사용법을 익혀봅니다.</aside></aside>
              • 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 = 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)
              • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
              • <aside> 👉 영화 제목을 가져와보기!
              • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
              • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
              • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
                1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
                2. 원하는 태그에서 마우스 오른쪽 클릭
                3. Copy → Copy selector로 선택자를 복사할 수 있음
            09. Quiz_웹스크래핑(크롤링) 연습
              1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
              • Q. 아래와 같이 보이면 완성!
              • A. 완성 코드
              • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
            10**. DB설치 확인**
              1. DB 설치 확인
              <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
            • </aside>
              1. robo 3T 준비하기
              • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
              • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
              • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
              • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
              • robo3T 세팅하기</aside>
              • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
              • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
              • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!
            11. DB개괄
              1. 들어가기 전에 : DB의 두 가지 종류
              <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
            • </aside>
            • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
            • </aside>
            • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
            • <aside> 👉 RDBMS(SQL)
            • </aside>
            12. pymongo로 DB조작하기
              1. pymongo로 mongoDB 조작하기
              • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
              • </aside>
              • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
              • 패키지 설치하기
              • pymongo
              • [코드스니펫] pymongo 기본 코드
              • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
              • DB연결하기 & 데이터 넣기
                • [코드스니펫] pymongo(insert)
                • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
                from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                
                # MongoDB에 insert 하기
                
                # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
                db.users.insert_one({'name':'bobby','age':21})
                db.users.insert_one({'name':'kay','age':27})
                db.users.insert_one({'name':'john','age':30})
                
              • 모든 결과 값을 보기
                • [코드스니펫] pymongo(find)
                • same_ages = list(db.users.find({'age':21},{'_id':False}))
                from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                
                # MongoDB에서 데이터 모두 보기
                all_users = list(db.users.find({}))
                
                # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
                same_ages = list(db.users.find({'age':21},{'_id':False}))
                
                print(all_users[0])         # 0번째 결과값을 보기
                print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
                
                for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
                    print(user)
                
              • 특정 결과 값을 뽑아 보기
                • [코드스니펫] pymongo(find_one)
                • user = db.users.find_one({'name':'bobby'})
                user = db.users.find_one({'name':'bobby'})
                print(user)
                
              • 수정하기
                • [코드스니펫] pymongo(update_one)
                • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                # 생김새
                db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
                
                # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
                db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                
                user = db.users.find_one({'name':'bobby'})
                print(user)
                
              • 삭제하기 (거의 안 씀)
                • [코드스니펫] pymongo(delete_one)
                • db.users.delete_one({'name':'bobby'})
                db.users.delete_one({'name':'bobby'})
                
                user = db.users.find_one({'name':'bobby'})
                print(user)
                
              1. pymongo 사용법. 코드요약
              • [코드스니펫] pymongo 코드 요약
              • # 저장 - 예시 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'})
              <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
              # 저장 - 예시
              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'})
              
            • </aside>
            13. 웹스크래핑 결과 저장하기
              1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
              • 이 코드에서 시작해봅시다!
                • [코드스니펫] 크롤링 완성코드
                • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
              • pymongo 기본 세팅
              • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
              • 도큐먼트 만들어 하나씩 insert 하기
              • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)
            14. Quiz_웹스크래핑 결과 이용하기
              1. ✍find, update 연습하기 (delete는 연습 안할게요!)
              • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
                • [코드스니펫] pymongo 기본 코드
                • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
              • (1) 영화제목 '매트릭스'의 평점을 가져오기
                • Q. 이렇게 되면 완성
                • A. 완성 코드
                • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
              • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
                • Q. 이렇게 되면 완성
                • A. 완성 코드
                • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
              • (3) 매트릭스 영화의 평점을 0으로 만들기
                • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
                • A. 완성 코드
                • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
            15. 3주차 끝 & 숙제 설명</aside> HW. 3주차 숙제 해설
            • [코드스니펫] 3주차 숙제 답안 코드
            • 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)06. 파이썬 패키지 설치하기
                1. 파이썬 패키지(package) 설치하기
                <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
                  1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
                  <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
                • </aside>
                • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
                • </aside>
                • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
                • </aside>
                • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
                  1. pip(python install package) 사용 - requests 패키지 설치해보기
                  <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
                  • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
                • </aside>
              • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
              07. 패키지 사용해보기 08. 웹스크래핑(크롤링) 기초
                1. 웹스크래핑 해보기 (영화 제목)
                • 어떤 걸 스크래핑 할 계획인가요?
                • 패키지 추가 설치하기(beautifulsoup4)
                • bs4
                • 크롤링 기본 세팅
                  • [코드스니펫] 크롤링 기본 세팅
                  • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
                  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의 사용법을 익혀봅니다.</aside></aside>
                • 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 = 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)
                • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
                • <aside> 👉 영화 제목을 가져와보기!
                • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
                • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
                • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
                  1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
                  2. 원하는 태그에서 마우스 오른쪽 클릭
                  3. Copy → Copy selector로 선택자를 복사할 수 있음
              09. Quiz_웹스크래핑(크롤링) 연습
                1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
                • Q. 아래와 같이 보이면 완성!
                • A. 완성 코드
                • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
              10**. DB설치 확인**
                1. DB 설치 확인
                <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
              • </aside>
                1. robo 3T 준비하기
                • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
                • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
                • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
                • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
                • robo3T 세팅하기</aside>
                • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
                • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
                • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!
              11. DB개괄
                1. 들어가기 전에 : DB의 두 가지 종류
                <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
              • </aside>
              • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
              • </aside>
              • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
              • <aside> 👉 RDBMS(SQL)
              • </aside>
              12. pymongo로 DB조작하기
                1. pymongo로 mongoDB 조작하기
                • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
                • </aside>
                • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
                • 패키지 설치하기
                • pymongo
                • [코드스니펫] pymongo 기본 코드
                • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                • DB연결하기 & 데이터 넣기
                  • [코드스니펫] pymongo(insert)
                  • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
                  from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                  client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                  db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                  
                  # MongoDB에 insert 하기
                  
                  # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
                  db.users.insert_one({'name':'bobby','age':21})
                  db.users.insert_one({'name':'kay','age':27})
                  db.users.insert_one({'name':'john','age':30})
                  
                • 모든 결과 값을 보기
                  • [코드스니펫] pymongo(find)
                  • same_ages = list(db.users.find({'age':21},{'_id':False}))
                  from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                  client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                  db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                  
                  # MongoDB에서 데이터 모두 보기
                  all_users = list(db.users.find({}))
                  
                  # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
                  same_ages = list(db.users.find({'age':21},{'_id':False}))
                  
                  print(all_users[0])         # 0번째 결과값을 보기
                  print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
                  
                  for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
                      print(user)
                  
                • 특정 결과 값을 뽑아 보기
                  • [코드스니펫] pymongo(find_one)
                  • user = db.users.find_one({'name':'bobby'})
                  user = db.users.find_one({'name':'bobby'})
                  print(user)
                  
                • 수정하기
                  • [코드스니펫] pymongo(update_one)
                  • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                  # 생김새
                  db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
                  
                  # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
                  db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                  
                  user = db.users.find_one({'name':'bobby'})
                  print(user)
                  
                • 삭제하기 (거의 안 씀)
                  • [코드스니펫] pymongo(delete_one)
                  • db.users.delete_one({'name':'bobby'})
                  db.users.delete_one({'name':'bobby'})
                  
                  user = db.users.find_one({'name':'bobby'})
                  print(user)
                  
                1. pymongo 사용법. 코드요약
                • [코드스니펫] pymongo 코드 요약
                • # 저장 - 예시 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'})
                <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
                # 저장 - 예시
                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'})
                
              • </aside>
              13. 웹스크래핑 결과 저장하기
                1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
                • 이 코드에서 시작해봅시다!
                  • [코드스니펫] 크롤링 완성코드
                  • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                • pymongo 기본 세팅
                • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                • 도큐먼트 만들어 하나씩 insert 하기
                • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)
              14. Quiz_웹스크래핑 결과 이용하기
                1. ✍find, update 연습하기 (delete는 연습 안할게요!)
                • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
                  • [코드스니펫] pymongo 기본 코드
                  • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                • (1) 영화제목 '매트릭스'의 평점을 가져오기
                  • Q. 이렇게 되면 완성
                  • A. 완성 코드
                  • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
                • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
                  • Q. 이렇게 되면 완성
                  • A. 완성 코드
                  • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
                • (3) 매트릭스 영화의 평점을 0으로 만들기
                  • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
                  • A. 완성 코드
                  • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
              15. 3주차 끝 & 숙제 설명</aside> HW. 3주차 숙제 해설
              • [코드스니펫] 3주차 숙제 답안 코드
              • 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)06. 파이썬 패키지 설치하기
                  1. 파이썬 패키지(package) 설치하기
                  <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
                    1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
                    <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
                  • </aside>
                  • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
                  • </aside>
                  • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
                  • </aside>
                  • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
                    1. pip(python install package) 사용 - requests 패키지 설치해보기
                    <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
                    • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
                  • </aside>
                • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
                07. 패키지 사용해보기 08. 웹스크래핑(크롤링) 기초
                  1. 웹스크래핑 해보기 (영화 제목)
                  • 어떤 걸 스크래핑 할 계획인가요?
                  • 패키지 추가 설치하기(beautifulsoup4)
                  • bs4
                  • 크롤링 기본 세팅
                    • [코드스니펫] 크롤링 기본 세팅
                    • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
                    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의 사용법을 익혀봅니다.</aside></aside>
                  • 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 = 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)
                  • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
                  • <aside> 👉 영화 제목을 가져와보기!
                  • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
                  • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
                  • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
                    1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
                    2. 원하는 태그에서 마우스 오른쪽 클릭
                    3. Copy → Copy selector로 선택자를 복사할 수 있음
                09. Quiz_웹스크래핑(크롤링) 연습
                  1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
                  • Q. 아래와 같이 보이면 완성!
                  • A. 완성 코드
                  • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                10**. DB설치 확인**
                  1. DB 설치 확인
                  <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
                • </aside>
                  1. robo 3T 준비하기
                  • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
                  • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
                  • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
                  • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
                  • robo3T 세팅하기</aside>
                  • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
                  • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
                  • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!
                11. DB개괄
                  1. 들어가기 전에 : DB의 두 가지 종류
                  <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
                • </aside>
                • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
                • </aside>
                • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
                • <aside> 👉 RDBMS(SQL)
                • </aside>
                12. pymongo로 DB조작하기
                  1. pymongo로 mongoDB 조작하기
                  • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
                  • </aside>
                  • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
                  • 패키지 설치하기
                  • pymongo
                  • [코드스니펫] pymongo 기본 코드
                  • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                  • DB연결하기 & 데이터 넣기
                    • [코드스니펫] pymongo(insert)
                    • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
                    from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                    client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                    db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                    
                    # MongoDB에 insert 하기
                    
                    # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
                    db.users.insert_one({'name':'bobby','age':21})
                    db.users.insert_one({'name':'kay','age':27})
                    db.users.insert_one({'name':'john','age':30})
                    
                  • 모든 결과 값을 보기
                    • [코드스니펫] pymongo(find)
                    • same_ages = list(db.users.find({'age':21},{'_id':False}))
                    from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                    client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                    db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                    
                    # MongoDB에서 데이터 모두 보기
                    all_users = list(db.users.find({}))
                    
                    # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
                    same_ages = list(db.users.find({'age':21},{'_id':False}))
                    
                    print(all_users[0])         # 0번째 결과값을 보기
                    print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
                    
                    for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
                        print(user)
                    
                  • 특정 결과 값을 뽑아 보기
                    • [코드스니펫] pymongo(find_one)
                    • user = db.users.find_one({'name':'bobby'})
                    user = db.users.find_one({'name':'bobby'})
                    print(user)
                    
                  • 수정하기
                    • [코드스니펫] pymongo(update_one)
                    • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                    # 생김새
                    db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
                    
                    # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
                    db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                    
                    user = db.users.find_one({'name':'bobby'})
                    print(user)
                    
                  • 삭제하기 (거의 안 씀)
                    • [코드스니펫] pymongo(delete_one)
                    • db.users.delete_one({'name':'bobby'})
                    db.users.delete_one({'name':'bobby'})
                    
                    user = db.users.find_one({'name':'bobby'})
                    print(user)
                    
                  1. pymongo 사용법. 코드요약
                  • [코드스니펫] pymongo 코드 요약
                  • # 저장 - 예시 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'})
                  <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
                  # 저장 - 예시
                  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'})
                  
                • </aside>
                13. 웹스크래핑 결과 저장하기
                  1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
                  • 이 코드에서 시작해봅시다!
                    • [코드스니펫] 크롤링 완성코드
                    • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                  • pymongo 기본 세팅
                  • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                  • 도큐먼트 만들어 하나씩 insert 하기
                  • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)
                14. Quiz_웹스크래핑 결과 이용하기
                  1. ✍find, update 연습하기 (delete는 연습 안할게요!)
                  • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
                    • [코드스니펫] pymongo 기본 코드
                    • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                  • (1) 영화제목 '매트릭스'의 평점을 가져오기
                    • Q. 이렇게 되면 완성
                    • A. 완성 코드
                    • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
                  • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
                    • Q. 이렇게 되면 완성
                    • A. 완성 코드
                    • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
                  • (3) 매트릭스 영화의 평점을 0으로 만들기
                    • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
                    • A. 완성 코드
                    • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
                15. 3주차 끝 & 숙제 설명</aside> HW. 3주차 숙제 해설
                • [코드스니펫] 3주차 숙제 답안 코드
                • 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)06. 파이썬 패키지 설치하기
                    1. 파이썬 패키지(package) 설치하기
                    <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
                      1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
                      <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
                    • </aside>
                    • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
                    • </aside>
                    • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
                    • </aside>
                    • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
                      1. pip(python install package) 사용 - requests 패키지 설치해보기
                      <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
                      • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
                    • </aside>
                  • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
                  07. 패키지 사용해보기 08. 웹스크래핑(크롤링) 기초
                    1. 웹스크래핑 해보기 (영화 제목)
                    • 어떤 걸 스크래핑 할 계획인가요?
                    • 패키지 추가 설치하기(beautifulsoup4)
                    • bs4
                    • 크롤링 기본 세팅
                      • [코드스니펫] 크롤링 기본 세팅
                      • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
                      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의 사용법을 익혀봅니다.</aside></aside>
                    • 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 = 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)
                    • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
                    • <aside> 👉 영화 제목을 가져와보기!
                    • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
                    • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
                    • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
                      1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
                      2. 원하는 태그에서 마우스 오른쪽 클릭
                      3. Copy → Copy selector로 선택자를 복사할 수 있음
                  09. Quiz_웹스크래핑(크롤링) 연습
                    1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
                    • Q. 아래와 같이 보이면 완성!
                    • A. 완성 코드
                    • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                  10**. DB설치 확인**
                    1. DB 설치 확인
                    <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
                  • </aside>
                    1. robo 3T 준비하기
                    • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
                    • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
                    • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
                    • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
                    • robo3T 세팅하기</aside>
                    • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
                    • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
                    • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!
                  11. DB개괄
                    1. 들어가기 전에 : DB의 두 가지 종류
                    <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
                  • </aside>
                  • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
                  • </aside>
                  • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
                  • <aside> 👉 RDBMS(SQL)
                  • </aside>
                  12. pymongo로 DB조작하기
                    1. pymongo로 mongoDB 조작하기
                    • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
                    • </aside>
                    • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
                    • 패키지 설치하기
                    • pymongo
                    • [코드스니펫] pymongo 기본 코드
                    • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                    • DB연결하기 & 데이터 넣기
                      • [코드스니펫] pymongo(insert)
                      • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
                      from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                      client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                      db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                      
                      # MongoDB에 insert 하기
                      
                      # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
                      db.users.insert_one({'name':'bobby','age':21})
                      db.users.insert_one({'name':'kay','age':27})
                      db.users.insert_one({'name':'john','age':30})
                      
                    • 모든 결과 값을 보기
                      • [코드스니펫] pymongo(find)
                      • same_ages = list(db.users.find({'age':21},{'_id':False}))
                      from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                      client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                      db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                      
                      # MongoDB에서 데이터 모두 보기
                      all_users = list(db.users.find({}))
                      
                      # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
                      same_ages = list(db.users.find({'age':21},{'_id':False}))
                      
                      print(all_users[0])         # 0번째 결과값을 보기
                      print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
                      
                      for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
                          print(user)
                      
                    • 특정 결과 값을 뽑아 보기
                      • [코드스니펫] pymongo(find_one)
                      • user = db.users.find_one({'name':'bobby'})
                      user = db.users.find_one({'name':'bobby'})
                      print(user)
                      
                    • 수정하기
                      • [코드스니펫] pymongo(update_one)
                      • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                      # 생김새
                      db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
                      
                      # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
                      db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                      
                      user = db.users.find_one({'name':'bobby'})
                      print(user)
                      
                    • 삭제하기 (거의 안 씀)
                      • [코드스니펫] pymongo(delete_one)
                      • db.users.delete_one({'name':'bobby'})
                      db.users.delete_one({'name':'bobby'})
                      
                      user = db.users.find_one({'name':'bobby'})
                      print(user)
                      
                    1. pymongo 사용법. 코드요약
                    • [코드스니펫] pymongo 코드 요약
                    • # 저장 - 예시 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'})
                    <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
                    # 저장 - 예시
                    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'})
                    
                  • </aside>
                  13. 웹스크래핑 결과 저장하기
                    1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
                    • 이 코드에서 시작해봅시다!
                      • [코드스니펫] 크롤링 완성코드
                      • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                    • pymongo 기본 세팅
                    • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                    • 도큐먼트 만들어 하나씩 insert 하기
                    • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)
                  14. Quiz_웹스크래핑 결과 이용하기
                    1. ✍find, update 연습하기 (delete는 연습 안할게요!)
                    • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
                      • [코드스니펫] pymongo 기본 코드
                      • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                    • (1) 영화제목 '매트릭스'의 평점을 가져오기
                      • Q. 이렇게 되면 완성
                      • A. 완성 코드
                      • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
                    • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
                      • Q. 이렇게 되면 완성
                      • A. 완성 코드
                      • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
                    • (3) 매트릭스 영화의 평점을 0으로 만들기
                      • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
                      • A. 완성 코드
                      • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
                  15. 3주차 끝 & 숙제 설명</aside> HW. 3주차 숙제 해설
                  • [코드스니펫] 3주차 숙제 답안 코드
                  • 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)06. 파이썬 패키지 설치하기
                      1. 파이썬 패키지(package) 설치하기
                      <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
                        1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
                        <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
                      • </aside>
                      • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
                      • </aside>
                      • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
                      • </aside>
                      • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
                        1. pip(python install package) 사용 - requests 패키지 설치해보기
                        <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
                        • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
                      • </aside>
                    • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
                    07. 패키지 사용해보기 08. 웹스크래핑(크롤링) 기초
                      1. 웹스크래핑 해보기 (영화 제목)
                      • 어떤 걸 스크래핑 할 계획인가요?
                      • 패키지 추가 설치하기(beautifulsoup4)
                      • bs4
                      • 크롤링 기본 세팅
                        • [코드스니펫] 크롤링 기본 세팅
                        • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
                        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의 사용법을 익혀봅니다.</aside></aside>
                      • 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 = 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)
                      • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
                      • <aside> 👉 영화 제목을 가져와보기!
                      • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
                      • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
                      • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
                        1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
                        2. 원하는 태그에서 마우스 오른쪽 클릭
                        3. Copy → Copy selector로 선택자를 복사할 수 있음
                    09. Quiz_웹스크래핑(크롤링) 연습
                      1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
                      • Q. 아래와 같이 보이면 완성!
                      • A. 완성 코드
                      • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                    10**. DB설치 확인**
                      1. DB 설치 확인
                      <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
                    • </aside>
                      1. robo 3T 준비하기
                      • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
                      • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
                      • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
                      • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
                      • robo3T 세팅하기</aside>
                      • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
                      • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
                      • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!
                    11. DB개괄
                      1. 들어가기 전에 : DB의 두 가지 종류
                      <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
                    • </aside>
                    • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
                    • </aside>
                    • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
                    • <aside> 👉 RDBMS(SQL)
                    • </aside>
                    12. pymongo로 DB조작하기
                      1. pymongo로 mongoDB 조작하기
                      • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
                      • </aside>
                      • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
                      • 패키지 설치하기
                      • pymongo
                      • [코드스니펫] pymongo 기본 코드
                      • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                      • DB연결하기 & 데이터 넣기
                        • [코드스니펫] pymongo(insert)
                        • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
                        from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                        client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                        db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                        
                        # MongoDB에 insert 하기
                        
                        # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
                        db.users.insert_one({'name':'bobby','age':21})
                        db.users.insert_one({'name':'kay','age':27})
                        db.users.insert_one({'name':'john','age':30})
                        
                      • 모든 결과 값을 보기
                        • [코드스니펫] pymongo(find)
                        • same_ages = list(db.users.find({'age':21},{'_id':False}))
                        from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                        client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                        db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                        
                        # MongoDB에서 데이터 모두 보기
                        all_users = list(db.users.find({}))
                        
                        # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
                        same_ages = list(db.users.find({'age':21},{'_id':False}))
                        
                        print(all_users[0])         # 0번째 결과값을 보기
                        print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
                        
                        for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
                            print(user)
                        
                      • 특정 결과 값을 뽑아 보기
                        • [코드스니펫] pymongo(find_one)
                        • user = db.users.find_one({'name':'bobby'})
                        user = db.users.find_one({'name':'bobby'})
                        print(user)
                        
                      • 수정하기
                        • [코드스니펫] pymongo(update_one)
                        • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                        # 생김새
                        db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
                        
                        # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
                        db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                        
                        user = db.users.find_one({'name':'bobby'})
                        print(user)
                        
                      • 삭제하기 (거의 안 씀)
                        • [코드스니펫] pymongo(delete_one)
                        • db.users.delete_one({'name':'bobby'})
                        db.users.delete_one({'name':'bobby'})
                        
                        user = db.users.find_one({'name':'bobby'})
                        print(user)
                        
                      1. pymongo 사용법. 코드요약
                      • [코드스니펫] pymongo 코드 요약
                      • # 저장 - 예시 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'})
                      <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
                      # 저장 - 예시
                      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'})
                      
                    • </aside>
                    13. 웹스크래핑 결과 저장하기
                      1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
                      • 이 코드에서 시작해봅시다!
                        • [코드스니펫] 크롤링 완성코드
                        • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                      • pymongo 기본 세팅
                      • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                      • 도큐먼트 만들어 하나씩 insert 하기
                      • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)
                    14. Quiz_웹스크래핑 결과 이용하기
                      1. ✍find, update 연습하기 (delete는 연습 안할게요!)
                      • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
                        • [코드스니펫] pymongo 기본 코드
                        • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                      • (1) 영화제목 '매트릭스'의 평점을 가져오기
                        • Q. 이렇게 되면 완성
                        • A. 완성 코드
                        • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
                      • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
                        • Q. 이렇게 되면 완성
                        • A. 완성 코드
                        • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
                      • (3) 매트릭스 영화의 평점을 0으로 만들기
                        • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
                        • A. 완성 코드
                        • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
                    15. 3주차 끝 & 숙제 설명</aside> HW. 3주차 숙제 해설
                    • [코드스니펫] 3주차 숙제 답안 코드
                    • 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)06. 파이썬 패키지 설치하기
                        1. 파이썬 패키지(package) 설치하기
                        <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
                          1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
                          <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
                        • </aside>
                        • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
                        • </aside>
                        • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
                        • </aside>
                        • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
                          1. pip(python install package) 사용 - requests 패키지 설치해보기
                          <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
                          • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
                        • </aside>
                      • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
                      07. 패키지 사용해보기 08. 웹스크래핑(크롤링) 기초
                        1. 웹스크래핑 해보기 (영화 제목)
                        • 어떤 걸 스크래핑 할 계획인가요?
                        • 패키지 추가 설치하기(beautifulsoup4)
                        • bs4
                        • 크롤링 기본 세팅
                          • [코드스니펫] 크롤링 기본 세팅
                          • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
                          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의 사용법을 익혀봅니다.</aside></aside>
                        • 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 = 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)
                        • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
                        • <aside> 👉 영화 제목을 가져와보기!
                        • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
                        • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
                        • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
                          1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
                          2. 원하는 태그에서 마우스 오른쪽 클릭
                          3. Copy → Copy selector로 선택자를 복사할 수 있음
                      09. Quiz_웹스크래핑(크롤링) 연습
                        1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
                        • Q. 아래와 같이 보이면 완성!
                        • A. 완성 코드
                        • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                      10**. DB설치 확인**
                        1. DB 설치 확인
                        <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
                      • </aside>
                        1. robo 3T 준비하기
                        • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
                        • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
                        • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
                        • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
                        • robo3T 세팅하기</aside>
                        • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
                        • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
                        • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!
                      11. DB개괄
                        1. 들어가기 전에 : DB의 두 가지 종류
                        <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
                      • </aside>
                      • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
                      • </aside>
                      • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
                      • <aside> 👉 RDBMS(SQL)
                      • </aside>
                      12. pymongo로 DB조작하기
                        1. pymongo로 mongoDB 조작하기
                        • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
                        • </aside>
                        • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
                        • 패키지 설치하기
                        • pymongo
                        • [코드스니펫] pymongo 기본 코드
                        • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                        • DB연결하기 & 데이터 넣기
                          • [코드스니펫] pymongo(insert)
                          • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
                          from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                          client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                          db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                          
                          # MongoDB에 insert 하기
                          
                          # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
                          db.users.insert_one({'name':'bobby','age':21})
                          db.users.insert_one({'name':'kay','age':27})
                          db.users.insert_one({'name':'john','age':30})
                          
                        • 모든 결과 값을 보기
                          • [코드스니펫] pymongo(find)
                          • same_ages = list(db.users.find({'age':21},{'_id':False}))
                          from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                          client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                          db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                          
                          # MongoDB에서 데이터 모두 보기
                          all_users = list(db.users.find({}))
                          
                          # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
                          same_ages = list(db.users.find({'age':21},{'_id':False}))
                          
                          print(all_users[0])         # 0번째 결과값을 보기
                          print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
                          
                          for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
                              print(user)
                          
                        • 특정 결과 값을 뽑아 보기
                          • [코드스니펫] pymongo(find_one)
                          • user = db.users.find_one({'name':'bobby'})
                          user = db.users.find_one({'name':'bobby'})
                          print(user)
                          
                        • 수정하기
                          • [코드스니펫] pymongo(update_one)
                          • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                          # 생김새
                          db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
                          
                          # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
                          db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                          
                          user = db.users.find_one({'name':'bobby'})
                          print(user)
                          
                        • 삭제하기 (거의 안 씀)
                          • [코드스니펫] pymongo(delete_one)
                          • db.users.delete_one({'name':'bobby'})
                          db.users.delete_one({'name':'bobby'})
                          
                          user = db.users.find_one({'name':'bobby'})
                          print(user)
                          
                        1. pymongo 사용법. 코드요약
                        • [코드스니펫] pymongo 코드 요약
                        • # 저장 - 예시 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'})
                        <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
                        # 저장 - 예시
                        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'})
                        
                      • </aside>
                      13. 웹스크래핑 결과 저장하기
                        1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
                        • 이 코드에서 시작해봅시다!
                          • [코드스니펫] 크롤링 완성코드
                          • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                        • pymongo 기본 세팅
                        • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                        • 도큐먼트 만들어 하나씩 insert 하기
                        • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)
                      14. Quiz_웹스크래핑 결과 이용하기
                        1. ✍find, update 연습하기 (delete는 연습 안할게요!)
                        • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
                          • [코드스니펫] pymongo 기본 코드
                          • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                        • (1) 영화제목 '매트릭스'의 평점을 가져오기
                          • Q. 이렇게 되면 완성
                          • A. 완성 코드
                          • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
                        • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
                          • Q. 이렇게 되면 완성
                          • A. 완성 코드
                          • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
                        • (3) 매트릭스 영화의 평점을 0으로 만들기
                          • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
                          • A. 완성 코드
                          • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
                      15. 3주차 끝 & 숙제 설명</aside> HW. 3주차 숙제 해설
                      • [코드스니펫] 3주차 숙제 답안 코드
                      • 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)06. 파이썬 패키지 설치하기
                          1. 파이썬 패키지(package) 설치하기
                          <aside> 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.</aside>
                            1. 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
                            <aside> 📌 문제상황: 회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.어떻게 하면 좋을까요?<aside> 💡 해결책: 다 담아둘 필요 없이 공구함을 2개 만들어서,그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함 이에요.<aside> 👉 정리하자면,출처 : 파이썬 공식 용어집- 가상환경
                          • </aside>
                          • **가상환경(virtual environment)**은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
                          • </aside>
                          • 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
                          • </aside>
                          • 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭
                            1. pip(python install package) 사용 - requests 패키지 설치해보기
                            <aside> 👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
                            • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
                          • </aside>
                        • 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
                        07. 패키지 사용해보기 08. 웹스크래핑(크롤링) 기초
                          1. 웹스크래핑 해보기 (영화 제목)
                          • 어떤 걸 스크래핑 할 계획인가요?
                          • 패키지 추가 설치하기(beautifulsoup4)
                          • bs4
                          • 크롤링 기본 세팅
                            • [코드스니펫] 크롤링 기본 세팅
                            • 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.nhn?sel=pnt&date=20200303>',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') # 코딩 시작
                            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의 사용법을 익혀봅니다.</aside></aside>
                          • 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 = 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)
                          • <aside> 👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
                          • <aside> 👉 영화 제목을 가져와보기!
                          • beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다
                          • # 선택자를 사용하는 방법 (copy selector) soup.select('태그명') soup.select('.클래스명') soup.select('#아이디명') soup.select('상위태그명 > 하위태그명 > 하위태그명') soup.select('상위태그명.클래스명 > 하위태그명.클래스명') # 태그와 속성값으로 찾는 방법 soup.select('태그명[속성="값"]') # 한 개만 가져오고 싶은 경우 soup.select_one('위와 동일')
                          • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
                            1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
                            2. 원하는 태그에서 마우스 오른쪽 클릭
                            3. Copy → Copy selector로 선택자를 복사할 수 있음
                        09. Quiz_웹스크래핑(크롤링) 연습
                          1. ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
                          • Q. 아래와 같이 보이면 완성!
                          • A. 완성 코드
                          • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                        10**. DB설치 확인**
                          1. DB 설치 확인
                          <aside> 👉 먼저, 각자 설치해온 DB가 잘 작동하는지 확인합니다. 크롬 창에 localhost:27017 이라고 쳤을 때, 아래와 같은 화면이 나오면 mongoDB가 돌아가고 있는 것입니다.
                        • </aside>
                          1. robo 3T 준비하기
                          • robo 3T의 역할데이터를 저장했는데 눈으로 보이진 않고.. 답답하겠죠?</aside></aside>
                          • <aside> 👉 참고) 우리 눈에는 안보이지만(=GUI는 없지만) 컴퓨터에서 돌아가는 프로그램들은 무척 많으니, 너무 놀라지 마세요~!
                          • 그래서 DB내부를 살펴보기 위한 프로그램을 따로 설치해야해요. → 이것이 바로 robo3T의 역할!
                          • <aside> 👉 mongoDB라는 프로그램은 참 특이한 친구예요. 눈으로 보이지 않는답니다. 유식한 말로, 그래픽인터페이스(=GUI)를 제공하지 않는다고 표현합니다.
                          • robo3T 세팅하기</aside>
                          • <aside> 👉 아래처럼 준비해서 robo3T에서 DB 볼 세팅을 미리 해둡니다! (sparta-local-DB는 아무 이름이나 입력해도 됩니다)
                          • db, collection, documents(각 데이터들을 지칭)를 확인 가능합니다.</aside>
                          • <aside> 👉 지금은 System, config 외엔 아무것도 없죠? 조금 이따 데이터를 넣으면 아래처럼 보일거예요!
                        11. DB개괄
                          1. 들어가기 전에 : DB의 두 가지 종류
                          <aside> 👉 Database에는, 크게 두 가지 종류가 있습니다.ex) MS-SQL, My-SQL 등<aside> 👉 No-SQLex) MongoDB
                        • </aside>
                        • 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
                        • </aside>
                        • 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
                        • <aside> 👉 RDBMS(SQL)
                        • </aside>
                        12. pymongo로 DB조작하기
                          1. pymongo로 mongoDB 조작하기
                          • pymongo 라이브러리의 역할마찬가지로, mongoDB 라는 프로그램을 조작하려면, 특별한 라이브러리, pymongo가 필요하답니다!
                          • </aside>
                          • <aside> 👉 예를 들어, MS Excel를 파이썬으로 조작하려면, 특별한 라이브러리가 필요하지 않겠어요?
                          • 패키지 설치하기
                          • pymongo
                          • [코드스니펫] pymongo 기본 코드
                          • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                          • DB연결하기 & 데이터 넣기
                            • [코드스니펫] pymongo(insert)
                            • doc = {'name':'bobby','age':21} db.users.insert_one(doc)
                            from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                            client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                            db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                            
                            # MongoDB에 insert 하기
                            
                            # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
                            db.users.insert_one({'name':'bobby','age':21})
                            db.users.insert_one({'name':'kay','age':27})
                            db.users.insert_one({'name':'john','age':30})
                            
                          • 모든 결과 값을 보기
                            • [코드스니펫] pymongo(find)
                            • same_ages = list(db.users.find({'age':21},{'_id':False}))
                            from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
                            client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
                            db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
                            
                            # MongoDB에서 데이터 모두 보기
                            all_users = list(db.users.find({}))
                            
                            # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
                            same_ages = list(db.users.find({'age':21},{'_id':False}))
                            
                            print(all_users[0])         # 0번째 결과값을 보기
                            print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
                            
                            for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
                                print(user)
                            
                          • 특정 결과 값을 뽑아 보기
                            • [코드스니펫] pymongo(find_one)
                            • user = db.users.find_one({'name':'bobby'})
                            user = db.users.find_one({'name':'bobby'})
                            print(user)
                            
                          • 수정하기
                            • [코드스니펫] pymongo(update_one)
                            • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                            # 생김새
                            db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
                            
                            # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
                            db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
                            
                            user = db.users.find_one({'name':'bobby'})
                            print(user)
                            
                          • 삭제하기 (거의 안 씀)
                            • [코드스니펫] pymongo(delete_one)
                            • db.users.delete_one({'name':'bobby'})
                            db.users.delete_one({'name':'bobby'})
                            
                            user = db.users.find_one({'name':'bobby'})
                            print(user)
                            
                          1. pymongo 사용법. 코드요약
                          • [코드스니펫] pymongo 코드 요약
                          • # 저장 - 예시 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'})
                          <aside> 👉 우리는 딱 네 가지 기능만 알면 됩니다. 저장하고, 찾고, 바꾸고, 지우고! 이 기능들을 어떻게 사용하는지 요약하면 다음과 같습니다.
                          # 저장 - 예시
                          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'})
                          
                        • </aside>
                        13. 웹스크래핑 결과 저장하기
                          1. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
                          • 이 코드에서 시작해봅시다!
                            • [코드스니펫] 크롤링 완성코드
                            • 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                          • pymongo 기본 세팅
                          • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 print(rank,title,star)
                          • 도큐먼트 만들어 하나씩 insert 하기
                          • import requests from bs4 import BeautifulSoup from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?) client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다. db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다. # 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 = 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: rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기 title = a_tag.text # a 태그 사이의 텍스트를 가져오기 star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기 doc = { 'rank' : rank, 'title' : title, 'star' : star } db.movies.insert_one(doc)
                        14. Quiz_웹스크래핑 결과 이용하기
                          1. ✍find, update 연습하기 (delete는 연습 안할게요!)
                          • 파이썬 파일을 새로 하나 만들어 연습해봅니다.
                            • [코드스니펫] pymongo 기본 코드
                            • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # 코딩 시작
                          • (1) 영화제목 '매트릭스'의 평점을 가져오기
                            • Q. 이렇게 되면 완성
                            • A. 완성 코드
                            • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) print (target_movie['star'])
                          • (2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기
                            • Q. 이렇게 되면 완성
                            • A. 완성 코드
                            • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## target_movie = db.movies.find_one({'title':'매트릭스'}) target_star = target_movie['star'] movies = list(db.movies.find({'star':target_star})) for movie in movies: print(movie['title'])
                          • (3) 매트릭스 영화의 평점을 0으로 만들기
                            • Q. 이렇게 되면 완성 (robo3T로 봤을 때)
                            • A. 완성 코드
                            • from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta ## 코딩 할 준비 ## db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
                        15. 3주차 끝 & 숙제 설명</aside> HW. 3주차 숙제 해설
                        • [코드스니펫] 3주차 숙제 답안 코드
                        • 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)
                      • <aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.
                    • <aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.
                  • <aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.
                • <aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.
              • <aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.
            • <aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.
          • <aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.
        • <aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.
      • <aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.
    • <aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.
  • <aside> 📃 지니뮤직의 1~50위 곡을 스크래핑 해보세요.

'취미 > 코딩' 카테고리의 다른 글

웹코딩 3주차(1)  (0) 2021.12.27
코딩 2주차  (0) 2021.12.24
코딩 1주차  (0) 2021.12.22

관련글 더보기