# 함수
def hey(): # --->함수의 내용물이다
print("헤이") # ---->(내용물)
hey() # ---->헤이! 로 출력
def sum(a,b,c): # ---->합계의 값이
return a+b+c # ---->a,b,c가 1,2,3으로 변해서/return이 있으면 이 함수sum(1,2,3)를 그 값으로 변신시킨다
result = sum(1,2,3) # ---->sum함수를 부르면
print(result) # ---->6 출력된다
조건문
age = 25
if age > 20:
print('성인입니다')
else:
print('청소년입니다')
# ----->출력값은 성인입니다
반복문
ages = [5,10,13,23,25,9] # ------>이런 age리스트가 있는데
for a in ages: # -----> ages의 하나하나씩의 값을 가져와서 a로 넣고 그 a를 밑에서 가져다 쓰자
print (a) # ----->출력값은 5 10 13 23 25 9
반복문+조건문
ages = [5,10,13,23,25,9]
for a in ages:
if a > 20:
print('성인입니다')
else:
print('청소년입니다')
# age를 한번씩 돌면서 조건에 맞는지 안맞는지 돌아서 값을 출력
가상환경 venv - 패키지를 담아두는 공구함
회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요. 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B' 로 쓰면 코드를 다 바꿔야 해요. 이때,
다 담아둘 필요 없이 공구함을 2개 만들어서, 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠? 그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함이에요.
정리하자면, 가상환경(virtual environment) 은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
venv 생성하기
python -m venv venv : 가상환경 venv 파일을 만들어준다.
venv 활성화
venv 활성화 : 활성화를 시켜줘야 라이브러리를 컴퓨터가 읽어준다. (오른쪽 하단에 3.8.3보이는거 클릭해서 venv로 바꿔주고 새터미널 실행하면 venv로 바뀐걸 볼 수 있다.)
이런 방법도 존재
라이브러리 만들기
pip install 라이브러리이름_requests : 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치, 가상환경_venv이 활성화된 상태에서 설치해주기
Requests 라이브러리 사용
requsets 웹에 접속하는 라이브러리
Requests 라이브러리는 fetch처럼 서버에서 데이터를 가져와서 볼 때 사용한다. 이런 기능을 사용하기 위해서 requests라이브러리가 필요한 것이다.(pip install requests) Requests라이브러리 docs
# requests 써보기
import requests # requests 라이브러리 설치 필요
# 기재된 url = 즉 데이터를 받아 올 곳
r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()
print(rjson)
import requests
r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()
print(rjson['RealtimeCityAir']['row'])
# 해당 url(API)의 RealtimeCityAir와 row를 받아옴
라이브러리(requests)를 이용해서 API의 MSRSTE_NM을 gu_name로, IDEX_MVL를 gu_mise로 설정해서 받아온 걸 print(gu_name,gu_mise)한 것
import requests
r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()
rows = rjson['RealtimeCityAir']['row']
for a in rows:
gu_name = a['MSRSTE_NM']
gu_mise = a['IDEX_MVL']
print(gu_name,gu_mise)
웹스크래핑(크롤링)
웹에 접속해서 특정 데이터를 솎아내어 가지고 오는 것
pip install bs4 : 가상환경 활성화 해주고(venv) beautifulsoup4 패키지/라이브러 추가 설치하기
- beautifulSoup 데이터를 솎아내는 라이브러리 - requsets 웹에 접속하는 라이브러리
bs4(beautifulsoup4) 사용해보기
# bs4 써보기
import requests
from bs4 import BeautifulSoup
# 해당 url의 정보를 크롤링 해올 것이다.
URL = "https://movie.daum.net/ranking/reservation"
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(URL, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# print(soup)
# 타겟 URL을 읽어서 HTML를 받아오고,
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
import requests
from bs4 import BeautifulSoup
URL = "https://movie.daum.net/ranking/reservation"
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(URL, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# select / select_one사용
title = soup.select_one('#mainContent > div > div.box_ranking > ol > li:nth-child(1) > div > div.thumb_cont > strong > a')
# print(title)
print(title.text)
select / select_one
태그 안의 텍스트를 찍고 싶을 땐 → 태그.text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
개발자도구에서 어떤 뼈대를 가져와야 하는지 찾기
원하는 부분에서 마우스 오른쪽 클릭 → 검사 원하는 태그에서 마우스 오른쪽 클릭 Copy → Copy selector로 선택자를 복사할 수 있음
title = soup.select_one("#mainContent > div > div.box_ranking > ol > li:nth-child(1) > div > div.thumb_cont > strong > a").text
print(title)
> soup.select_one()으로 셀렉터 값을 넣고 원하는 뼈대만 꺼내기 >> print()로 어떻게 가져와졌는지 확인 >>> 가져온 데이터는 html의 뼈대이기 때문에 .text()를 사용해서 문자 값만 꺼내기
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')
# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')
import requests
from bs4 import BeautifulSoup
URL = "https://movie.daum.net/ranking/reservation"
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(URL, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
lis = soup.select('#mainContent > div > div.box_ranking > ol > li')
# li들을 가져올꺼야
print(lis)
import requests
from bs4 import BeautifulSoup
URL = "https://movie.daum.net/ranking/reservation"
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(URL, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
lis = soup.select('#mainContent > div > div.box_ranking > ol > li')
# lis의 li를 돌면서
# title를 가져오는데
# title는 li에서 class가(.) link_txt인 것을 하나가져오는거야
for li in lis:
title = li.select_one('.link_txt')
print(title)
import requests
from bs4 import BeautifulSoup
URL = "https://movie.daum.net/ranking/reservation"
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(URL, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
lis = soup.select('#mainContent > div > div.box_ranking > ol > li')
for li in lis:
title = li.select_one('.link_txt').text
# print(title.text)
import requests
from bs4 import BeautifulSoup
URL = "https://movie.daum.net/ranking/reservation"
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(URL, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
lis = soup.select('#mainContent > div > div.box_ranking > ol > li')
# 순위(rank), 제목(title), 평점(rate) 가져오기
for li in lis:
rank = li.select_one('.rank_num').text
title = li.select_one('.link_txt').text
rate = li.select_one('.txt_grade').text
print(rank,title,rate)
title = li.select_one(".tit_item").text.strip("\n") : 제목을 출력했는데 공백이 많다면, strip()을 검색해서 사용, 그래도 많다면, \n을 strip안에 넣어보기
DB
: 잘 쌓는게 아닌 저장해 놓은 데이터를 잘 가져오기 위함
Database에는, 크게 두 가지 종류가 있다.
RDBMS(SQL)
행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
정형화된 규칙이 있어서 많은 정보를 관리하기에 유용(대기업)
ex) MS-SQL, My-SQL 등
No-SQL(Not only)
딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority') --->이 DB에서
db = client.dbsparta
all_users = list(db.users.find({-조건-},{'_id':False}))
# db에서 user들을 찾아서,{'_id':False} --> id 안보겠다
for a in all_users:
print(a)
pymongo(find_one)
user = db.users.find_one({})
print(user)
from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
user = db.users.find_one({})
print(user)
# 저장 - 예시
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'})
총 정리를 해보자!
즉, 웹에 접속해서 원하는 데이터를 크롤링해서 저장하기의 과정이 필요한것, 모두 가상환경으로의 설정 후 진행!!
+웹에 접속을 위해서 reauests 라이브러리가 필요
설치 : pip install requests
import requests
r = requests.get('url')
rjson = r.json()
print(rjson)
+원하는 데이터를 크롤링하기 위해서 bs4(beautifulsoup4) 라이브러리가 필요
설치 : pip install bs4
import requests
from bs4 import BeautifulSoup
URL = "크롤링 할 웹 페이지 url"
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(URL, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')