왕초보 시작반(3)

euniiee·2021년 10월 8일
0

sparta

목록 보기
3/5
post-thumbnail

수업 목표!

  1. 파이썬 기초 문법을 안다.
  2. 원하는 페이지를 크롤링 할 수 있다.
  3. pymongo를 통해 mongoDB를 제어할 수 있다.

3주차 4강

💥 꼭 파일을 만든 후 파이참으로 열기!!
🌟 파이썬 만들면 'venv' 파일이 생기는데 절대 건들지 않기❗️


3주차 5강

<파이썬 기초 문법>

  • 변수 & 기본 문법
a=3        # 3을 a에 넣는다.
b=a        # a를 b에 넣는다.
a= a+1     # a+1을 다시 a에 넣는다.

num1= a*b  # a*b의 값을 num1이라는 변수에 넣는다.
num2= 99   # 99의 값을 num2이라는 변수에 넣는다.

# 변수의 이름은 마음대로 지을 수 있음!
  • 자료형
  1.   숫자, 문자형
name = 'bob'   # 변수에는 문자열이 들어갈 수도 있고,
num = 12      # 숫자가 들어갈 수도 있고,

is_number = True  # True 또는 False -> "Boolen(불린)" 형

#그리고 List, Dictionary도 들어갈 수도 있다.
  1. 리스트 형(Javascript의 배열형과 동일)
a_list= []
a_list.append(1)       // 리스트에 값을 넣는다.
a_list.append([2,3])   // 리스트에 [2,3]이라는 리스트를 다시 넣는다.

# a_list의 값은? [1,[2,3]]
  1. Dictionary형 (Javascript의 dictionary형과 동일)
a_dict = {}
a_dict = {'name':'bob','age':21}
a_dict['height'] = 178

# a_dict의 값은? {'name':'bob','age':21, 'height':178}
  1. Dictionary형 List형의 조합
person = {'name':'john','age':7}
people.append(person)

# people의 값은? [{'name':'bob','age':20},{'name':'carry','age':38},{'name':'john','age':7}]
# people[2]['name']의 값은? 'john'
  • 함수
  • 조건문
  1. if/else로 구성!
def is_adult(age):      # is_adult라는 이름의 함수를 정의한다. num을 변수로 받는다.
 if age > 20:           # age 값이 20보다 크면
   print('성인입니다')    # 조건이 참이면 성인입니다를 출력
 else:
   print('청소년이에요')  # 조건이 거짓이면 청소년이에요를 출력

is_adult(30)
#무엇이 출력될까요?
  1. 응용
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']

count = 0
for fruit in fruits:
	if fruit == '사과':
		count += 1

print(count)

# 사과의 개수를 세어 보여줍니다.

3주차 6강

💡 패키지? 라이브러리?
    Python에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지의 묶음을 라이브러리.  패키지 설치=외부 라이브러리 설치!

💡 가상환경(vitual environment)?
     프로젝트별로 패키지들을 담을 공구함

 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
출처:파이썬 공식 용어집-가상환경


3주차 7강

Requests 라이브러리 사용해보기
맥북인경우: Pycharm -> preferences -> Python interpreter에서 설치

import requests   # requests 라이브러리 설치 필요

r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
rjson = r.json()

print(rjson['RealtimeCityAir']['row'][0]['NO2'])

3주차 8강

💡 크롤링?
  크롤링이란 데이터를 검색해 내가 필요한 정보를 색인하는것을 의미한다.

크롤링에 필요한 bs4(beautifulsoup4) 설치하기

import requests
from bs4 import BeautifulSoup

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

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')


# (코딩)

🌟 태그 안의 텍스트를 찍고 싶을 땐 -> 태그.text
     태그 안의 속성을 찍고 싶을땐 -> 태그['속성']

크롤링(=스크래핑) 하기
<select/ select_one의 사용법 익히기>

import requests
from bs4 import BeautifulSoup

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

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
soup = BeautifulSoup(data.text, 'html.parser')
----------------------------------------기본 코드(url만 바꿔준다.)
# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')
# #old_content > table > tbody > tr : 원하는 부분 copy selctor로 가져온다.
# 원래는 '#old_content > table > tbody > tr:nth-child(2) > td.title > div > a' 이거지만 tr 전체를 가져오기 위해서 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_tag.text하면 오류 난다. 그이유는 본문에 None 값이 있기 때문이다.
        print (a_tag.text) # 간격 맞춰주기!!  # a의 text를 찍어본다.
    # 이걸 다음과 같이 할수 있다.
    if a_tag is not None:
    	title = a_tag.text
    	print (title)

<beautifulsoup 내 select에 미리 정의된 다른 방법을 알아보기>

# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')

# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')

3주차 9강

웹스크래핑 순위, 별점, 제목

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')
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
movie_tr = soup.select('#old_content > table > tbody > tr')

#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img

for tr in movie_tr:
    a_tag = tr.select_one('td.title > div > a')

    if a_tag is not None:
        rank = tr.select_one('td:nth-child(1) > img')['alt'] #old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
        title = a_tag.text
        star = tr.select_one('td.point').text #old_content > table > tbody > tr:nth-child(2) > td.point
        print(rank, title, star)

3주차 10강

💡 mongoDB는 데이터 베이스 입니다. (기본적으로 데이터를 쌓아둠.)
  mongoDB라는 프로그램은 눈으로 보이지 않습니다. 즉, 그래픽인터페이스(=GUI)를 제공하지 않습니다.
이러한 눈에 보이지 않는것을 우리의 눈으로 볼수 있게 해주는 것이 robot3T 입니다.


3주차 11강

데이터 베이스에는 두 종류가 있습니다.

  1. RDBMS(SQL)
    행/ 열의 생김새가 정해진 엑셀에 데이터를 저장하는것과 유사합니다. 데이터 10,000개가 적된 상태에서 갑자기 중간에 열을 하나 더하기는 어렵다. 그러나 정형화되어 있는 만큼, 데이터가 일관적이며 분석하기 빠릅니다.
    ex) MS-SQL, MY-SQL
  2. NO-SQL
    딕셔너리 형태로 데이터를 저장해두는 DB입니다. 그래서 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족합니다.
    ex) MongoDB

3주차 12강

pymongo 설치하기

  • mongoD라는 프로그램을 조작하려면, pymongo가 필요합니다.
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})



#find 하기
# 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)
#특정 결과 값을 뽑아 내기 
user = db.users.find_one({'name':'bobby'})
print(user)  



#update 하기

# 생김새
db.people.update_one(찾을조건,{ '$set': 어떻게바꿀지 })

# 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

user = db.users.find_one({'name':'bobby'})
print(user)

##update_many는 거의 안쓰다. 전부 바꿔주는 것이기때문에 위험성이 높다.

⛔️ 거의 안쓰는 삭제하기

db.users.delete_one({'name':'bobby'})

user = db.users.find_one({'name':'bobby'})
print(user)

3주차 13강

우리가 한 크롤링을 mongodb에 넣기

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)

3주차 14강

Quiz

  • 특정 영화 평점 가져오기
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

## 코딩 할 준비 ##

target_movie = db.movies.find_one({'title':'매트릭스'})
print (target_movie['star'])
  • 평점 같은 것 가져오기
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'])
  • 영화 평점을 바꾸기
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

## 코딩 할 준비 ##

db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
profile
코린이

0개의 댓글

관련 채용 정보