어제에 이어 프론트엔드 조금 더 다뤘다.
API : Application Programming Interface
API의 맥락에서 애플리케이션이라는 단어는 고유한 기능을 가진 모든 소프트웨어를 나타냅니다.
API는 은행 창구와 같은 것!
- GET → 통상적으로! 데이터 조회(Read)를 요청할 때
예) 영화 목록 조회- POST → 통상적으로! 데이터 생성(Create), 변경(Update), 삭제(Delete) 요청 할 때
예) 회원가입, 회원탈퇴, 비밀번호 수정
GET 방식으로 데이터를 전달하는 방법
예시) google.com/search?q=아이폰&sourceid=chrome&ie=UTF-8
? : 여기서부터 전달할 데이터가 작성된다는 의미입니다.
& : 전달할 데이터가 더 있다는 뜻입니다.
Ajax 코드
$.ajax({
type: "GET",
url: "주소값",
data: {},
success: function (response) {
console.log(response)
}
})
Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다.
이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다.
지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.
즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
가상환경(virtual environment)은
같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설
치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.
파일 -> 설정 -> 프로젝트 : ?? -> python 인터프리터 -> + -> 설치
(여기서는 requests 썼음.)
또 자바와 다른 점 위주로 적어보았다.
#변수 선언 조차 안한다.
a = 2
b = 3
print(a+b)
# '문자열'과 리스트, 사전 자료형은 자바스크립트와 비슷하다.
a = 'KyungYeon'
b = 'Shin'
print(a+b)
a_list = ['사과', '배', '감']
a_list.append('수박')
print(a_list)
a_dict = {
'name' : 'bob',
'age' : 27
}
print(a_dict['name'])
# 함수
# 들여쓰기만 조심하면 된다.
def sum(a, b) :
print('더하자!')
return a+b
result = sum(1,2)
print(result)
# for문, if문
people = [{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27}]
for person in people:
if person['age'] > 20:
print(person['name'])
BeautifulSoup
패키지 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('주소',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
영화 제목을 갖고 온다 하면
영화 제목 우클릭 > 검사 > 그 부분의 코드가 뜸. > copy > copy selector#old_content > table > tbody > tr:nth-child(3) > td.title > div > a #old_content > table > tbody > tr:nth-child(4) > td.title > div > a
위와 같은 코드가 카피 된다.
앞 부분이 다 같은 것을 확인.
#tr에 저장된 데이터를 전부 가져옴.
movies = soup.select('#old_content > table > tbody > tr') print(movies) for movie in movies: a = movie.select_one('td.title > div > a') #tr에 저장된 데이터 중 title 부분만 가져오기. if a is not None: #가끔 이상한 데이터가 있는데 None 이라고 뜨게 된다. 이를 걸러냄. title = a.text rank = movie.select_one('td:nth-child(1) > img')['alt'] star = movie.select_one('td.point').text print(title, rank, star)
이 중에 No-SQL에 해당하는 MongoDB를 사용하였다.
RDBMS(SQL)
행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다.
데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다.
그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
ex) MS-SQL, My-SQL 등
No-SQL
딕셔너리 형태로 데이터를 저장해두는 DB입니다.
고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다.
자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
ex) MongoDB
패키지 설치 : pymongo, dnspython
url 위치
mongoDB Atlas 화면 > Cluster0 옆의 Connect > Connect your application > Python 3.6 or later > url 복사
from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta
#url 변경이 필요함.
#mongodb+srv://<아이디>:<비밀번호>@cluster0.8vasl6v.mongodb.net/<클러스터0>?retryWrites=true&w=majority
#결과물
mongodb+srv://test:sparta@cluster0.8vasl6v.mongodb.net/Cluster0?retryWrites=true&w=majority
doc = {
'name': 'bob',
'age': 27
}
#users가 db 폴더명
db.users.insert_one(doc)
mongoDB Atlas 화면 > browse collections 에서 직접 볼 수도 있고, 수정도 가능하다.
크롤링
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('주소',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
movies = soup.select('#old_content > table > tbody > tr')
print(movies)
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(title, rank, star)
DB
from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.8vasl6v.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.dbsparta
# 저장 - 예시
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'})