💥 꼭 파일을 만든 후 파이참으로 열기!!
🌟 파이썬 만들면 'venv' 파일이 생기는데 절대 건들지 않기❗️
<파이썬 기초 문법>
a=3 # 3을 a에 넣는다.
b=a # a를 b에 넣는다.
a= a+1 # a+1을 다시 a에 넣는다.
num1= a*b # a*b의 값을 num1이라는 변수에 넣는다.
num2= 99 # 99의 값을 num2이라는 변수에 넣는다.
# 변수의 이름은 마음대로 지을 수 있음!
name = 'bob' # 변수에는 문자열이 들어갈 수도 있고,
num = 12 # 숫자가 들어갈 수도 있고,
is_number = True # True 또는 False -> "Boolen(불린)" 형
#그리고 List, Dictionary도 들어갈 수도 있다.
a_list= []
a_list.append(1) // 리스트에 값을 넣는다.
a_list.append([2,3]) // 리스트에 [2,3]이라는 리스트를 다시 넣는다.
# a_list의 값은? [1,[2,3]]
a_dict = {}
a_dict = {'name':'bob','age':21}
a_dict['height'] = 178
# a_dict의 값은? {'name':'bob','age':21, 'height':178}
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'
def is_adult(age): # is_adult라는 이름의 함수를 정의한다. num을 변수로 받는다.
if age > 20: # age 값이 20보다 크면
print('성인입니다') # 조건이 참이면 성인입니다를 출력
else:
print('청소년이에요') # 조건이 거짓이면 청소년이에요를 출력
is_adult(30)
#무엇이 출력될까요?
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']
count = 0
for fruit in fruits:
if fruit == '사과':
count += 1
print(count)
# 사과의 개수를 세어 보여줍니다.
💡 패키지? 라이브러리?
Python에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지의 묶음을 라이브러리. 패키지 설치=외부 라이브러리 설치!
💡 가상환경(vitual environment)?
프로젝트별로 패키지들을 담을 공구함
같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
출처:파이썬 공식 용어집-가상환경
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'])
💡 크롤링?
크롤링이란 데이터를 검색해 내가 필요한 정보를 색인하는것을 의미한다.
크롤링에 필요한 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('위와 동일')
웹스크래핑 순위, 별점, 제목
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)
💡 mongoDB는 데이터 베이스 입니다. (기본적으로 데이터를 쌓아둠.)
mongoDB라는 프로그램은 눈으로 보이지 않습니다. 즉, 그래픽인터페이스(=GUI)를 제공하지 않습니다.
이러한 눈에 보이지 않는것을 우리의 눈으로 볼수 있게 해주는 것이 robot3T 입니다.
데이터 베이스에는 두 종류가 있습니다.
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)
우리가 한 크롤링을 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)
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'}})