스파르타코딩클럽 내일배움단 웹개발 종합반 -7

몽슈뜨·2022년 10월 23일
0

웹개발 종합반

목록 보기
7/11
post-thumbnail

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

  • 웹스크래핑 더 해보기 (순위, 제목, 별점) - 아래와 같이 만들기
  • 완성 코드
import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a

movies = soup.select('#old_content > table > tbody > tr')

for movie in movies:
    a = movie.select_one('td.title > div > a')
    if a is not None:
        title = a.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point').text
        print(rank, title, star)


✨DB개괄

  • 들어가기 전에 - DB는 왜 쓰는 것일까?

    • 👉 (뜬금) 우리가 방 정리를 하는 이유는 무엇일까요?
      1번: 잘 넣어두기 위해서 / 2번: 나중에 잘 찾기 위해서

    • 👉 (뜬금2) 한가지 더! 교보문고에 가서 책을 찾는 다고 하면?
      꽂혀진 방법대로 찾아야 쉽게 찾을 수 있겠죠!
      (섹션 → 출판사 → 책 제목)

    • 우리 눈에 보이진 않지만, 사실 DB에는 Index 라는 순서로 데이터들이 정렬되어 있답니다!

  • 들어가기 전에 - DB의 두 가지 종류

    • Database에는, 크게 두 가지 종류가 있습니다.

    • RDBMS(SQL)
      행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
      ex) MS-SQL, My-SQL 등

    • No-SQL
      딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
      ex) MongoDB

  • 들어가기 전에 - DB의 실체에 관하여

    • 자, 그럼 DB의 실체는 무엇일까요? 특별한 컴퓨터일까요?
      아닙니다! 아주 간단하게, 우리가 쓰는 프로그램과 같은 것이랍니다.
      즉, 내 컴퓨터에 게임도 설치하고, PPT도 설치하고, DB도 설치할 수 있는 것이죠.

    • 그 런 데! 이 마저도 요새는 Cloud 형태로 제공해주는 곳들이 많답니다.유저가 몰리거나 / DB를 백업해야 하거나 / 모니터링 하기가 아주 용이하기 때문이죠!

      (꿀팁 - 요새 트렌드는 클.라.우.드 !)



    ✨mongoDB 시작하기

  • mongoDB - Atlas 가입하기 - 회원가입하기

    • 구글로 로그인하고 → Accept Privacy ... Service 에 체크 → Submit 합니다.
  • 다음 화면 체크하고 넘어가기

  • Shared를 클릭하고 넘어가기

  • 대한민국 으로 체크하고, Create Cluster 클릭하기

  • 아래와 같은 화면이 잠시 동안 나온 뒤에

  • 새로고침 후 최종 아래와 같은 화면을 만나면 끝!

  • 연결 준비하기

    • Allow Access from Anywhere 클릭 → Add IP address 클릭
    • Username, Password를 아래와 같이 입력 → Create Database User 클릭
    • Choose a connection method 클릭


✨mongoDB 연결하기

  • mongoDB - Atlas 연결하기

    • pymongo 라이브러리의 역할

      예를 들어, MS Excel를 파이썬으로 조작하려면,
      특별한 라이브러리가 필요하지 않겠어요?

      마찬가지로, mongoDB 라는 프로그램을 조작하려면,
      특별한 라이브러리, pymongo가 필요하답니다!

  • 패키지 설치하기

    • pymongo, dnspython
  • mongoDB Atlas 화면에서 Connect your application 클릭

  • pymongo로 조작하기 ( 기본코드 )

from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta
  • 잘 연결됐는지 테스트해보기
doc = {
    'name':'bob',
    'age':27
}

db.users.insert_one(doc)
  • Cluster0의 Collections를 확인


✨pymongo로 DB조작하기

  • pymongo로 mongoDB 조작하기
# '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)
# 모든 데이터 뽑아보기
all_users = list(db.users.find({},{'_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'})
print(user)
  • 수정하기 - pymongo(update_one)
# 오타가 많으니 이 줄을 복사해서 씁시다!
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'})

user = db.users.find_one({'name':'bobby'})
print(user)
  • 📌pymongo 코드 요약
# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))

# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기 - 예시
db.users.delete_one({'name':'bobby'})


✨웹스크래핑 결과 저장하기

  • pymongo 기본 세팅
import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
import certifi
ca = certifi.where()
client = MongoClient('mongodb+srv://test:sparta@cluster0.1ucldgn.mongodb.net/?retryWrites=true&w=majority', tlsCAFile=ca)
db = client.dbsparta

# URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
soup = BeautifulSoup(data.text, 'html.parser')

# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')

# movies (tr들) 의 반복문을 돌리기
for movie in movies:
    # movie 안에 a 가 있으면,
    a_tag = movie.select_one('td.title > div > a')
    if a_tag is not None:
        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)
  • 도큐먼트 만들어 하나씩 insert 하기
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)


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

  • ✍ find, update 연습하기
  • (1) 영화제목 '가버나움'의 평점을 가져오기
target_movie = db.movies.find_one({'title':'가버나움'})
print(target_movie['star'])
  • (2) '가버나움'의 평점과 같은 평점의 영화 제목들을 가져오기
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으로 만들기
db.movies.update_one({'title':'가버나움'},{'$set':{'star':'0'}})


✨3주차 끝 & 숙제 설명

지니뮤직 사이트

  • 순위 / 곡 제목 / 가수를 스크래핑 하면 됩니다.

    🎈 힌트
    0) 출력 할 때는 print(rank, title, artist) 하면 됩니다!
    1) 앞에서 두 글자만 끊기! text[0:2] 를 써보세요!
    2) 순위와 곡제목이 깔끔하게 나오지 않을 거예요. 옆에 여백이 있다던가, 다른 글씨도 나온다던가.. 파이썬 내장 함수인 strip()을 잘 연구해보세요!
  • 내 코드
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://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701', headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
soup = BeautifulSoup(data.text, 'html.parser')

#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis
songs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for song in songs:
    # body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis
    title = song.select_one('td.info > a.title.ellipsis').text.strip()

    # body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
    # 앞에서 두 글자만 끊기 - text[0:2]
    rank = song.select_one('td.number').text[0:2].strip()

    # body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
    artist = song.select_one('td.info > a.artist.ellipsis').text.strip()

    # text.strip() - 문자열 공백제거
    print(rank,title,artist)
  • 💻 출력
profile
개발자되면 맥북사줄께

0개의 댓글