웹개발 종합 - PYTHON, PYMONGO
파이썬은 컴퓨터 프로그래밍 교육을 위해 많이 사용하지만, 기업의 실무를 위해서도 많이 사용하는 언어라고 한다.
모든 프로그래밍 언어에는 각기 장점이 있지만 파이썬은 문법 자체가 아주 쉽고 간결하며 사람의 사고 체계와 매우 닮아 있다. 그렇기 때문에 파이썬은 배우기 쉬운 언어, 활용하기 쉬운 언어라고 할 수 있다.
def hello(a,b):
return a+b
result = hello(3,4)
print(result)
파이썬의 함수구조를 간단하게 표현하자면 위와 같다.
def(Definition)는 함수를 만들 때 사용하는 예약어이며, 함수 이름은 함수를 만드는 사람이 임의로 만들 수 있다.
함수 이름 뒤 괄호 안의 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이다.
hello함수는 매개변수 a와 b를 받고, 리턴값으로 a와 b를 더하는 값을 산출해낸다.
입력값으로 3와 4의 인수를 받게 되면 함수가 실행되게 되고 결과값(a+b)을 산출하는 방식이다.
이것은 일반적인 함수의 전형적인 예이며, 어떠한 값을 입력값으로 받을지 모르기때문에 어떠한 틀을 만들어 놓고 찍어낸다는 느낌이라고 생각하면 이해하기 편할 듯하다.
파이썬은 자바스크립트 함수와는 다르게 브레이스({}, function(){})를 사용하지 않고 콜론(:, function():)을 찍고 값을 표현한다.
그 후 관련된 값은 탭을 통해 공백을 줌으로써 다음에 오는 내용이 관련되어 있음을 표현한다. 이게 되게 신선한 내용이었던 것 같다.
Requests
다음은 requests 라이브러리를 알아보자.
파이썬은 인터프리터로 접근할 수 있는 언어로 각각의 라이브러리들이 존재한다.
그중에 requests는 일반적인 원격으로 API를 호출할때 사용하는 라이브러리이다.
requests의 crud는 다음과 같다.
- GET 방식: requests.get()
- POST 방식: requests.post()
- PUT 방식: requests.put()
- DELETE 방식: requests.delete()
import requests # requests 라이브러리 설치 필요
r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()
print(rjson)
requests는 라이브러리를 import 한 후 , get방식을 사용하여 url을 담고 API 호출 후 json형식으로 프린트를 하여 내용을 확인 할 수 있다.
- API(application programming interface ,응용 프로그램에서 사용할 수 있도록 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스)
크롤링(crawling)
크롤링은 웹(web)상에 필요한 데이터들을 수집하는 것으로, 간단하게 HTML을 가져와서 파싱한 후 내가 찾는 데이터들만 추출하는 기법이다.
크롤링을 하기 위해서 필요한 라이브러리들은 대표적으로 bs4와 beatifulSoup을 사용한다.
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')
BeautifulSoup라이브러리를 이용해서 data의 text의 형식에 대해서 html로 파싱하겠다라는 의미이다. 첫 번째 인자로는 html 문서인 문자열을, 두 번째 인자로는 parsing 방법을 작성한다.
header에 담긴 내용들은 대략적으로 설명하자면 오류로 인한 접속불가를 해결하기 위해 넣는 내용으로 response 403 에러를 해결하는 것이다.
(HTTP 403Forbidden 클라이언트 오류 상태응답코드는 서버에 요청이 전달되었지만, 권한 때문에 거절되었다는 것을 의미)
이 경우 브라우저가 아닌 것(Python)에 대한 접속 차단으로 인한 것이기 때문에 API을 요청할때 header에 User-Agent또는 Referer를 지정하고 접근하면 해결 가능하다라고 한다. 여기에서는 User-Agent 정보를 크롬으로 지정하여 요청한것.
짧게 요약하자면 에러를 해결하기위해 header에 추가정보를 넣어 API호출을 했다고 생각하자. 머리아프다.
select_one()은 select된 첫 번째 element를 한 개 리턴한다.
select()는 select된 모든 element들의 list를 리턴한다.
list = soup.select('#old_content > table > tbody > tr')
for movie in list:
title = movie.select_one('td.title a')
if(title is not None):
title = title.text
rank = movie.select_one('td.ac img')['alt']
star = movie.select_one('td.point').text
print(rank, title, star)
위에 있는 코드를 해석하자면 이렇다.
다음 이미지의 개발자도구를 보면 알 수 있듯이 변수 list는 tbody안에 있는 tr의 모든 element들을 가지고 있다.
즉 list는 tbody안에 있는 모든 tr을 지칭한다.
그 리스트들을 for문을 돌리게 되는데, list의 movie(첫번째, 두번째 ..... 마지막번째의 tr까지)를 돌린다. (for movie in list)
다음 과정으로 별의 갯수(평점)을 구하는 방법은 tr의 안에 있는 td 중에, point라는 class를 가지고 있는 녀석의 text를 가지고 온다. (star = movie.select_one('td.point').text)
PYMongo
pymongo는 파이썬으로 데이터베이스에 연결하여 정보를 저장하거나 가져오기 위하여 사용하는 라이브러리이다.
DB에 연결하는 방법으로, 여기에서는 MongoClient의 값으로 MongoDB 서버 URI를 파라미터로 입력하여 로그인을 시도했다.
from pymongo import MongoClient
import certifi
ca = certifi.where()
client = MongoClient('mongodb+srv://id:password@cluster0.내주소.mongodb.net/DB명?retryWrites=true&w=majority', tlsCAFile=ca)
db = client.dbsparta
강의에서는 certifi이라는 라이브러리는 설명해주지 않았는데, 글쓴이는 강의대로 따라하다보니 오류가 뜨는 해프닝이 발생했다.
이 오류때문에 진도를 나가지 못하고 오타가 있는지.. 어떤 세팅에서 잘못이 있는지.. 처음부터 다시해보고하는 등의 시도와 오류에 대한 해답을 얻기위해 거의 2시간을 찾아보고 있었다.
이에 대하여 튜터님께 '인터넷 환경에 따라 보안 관련 추가 설정을 해주어야 해서 해당 문제가 발생한다.certifi 패키지를 가상 환경에 먼저 설치해야한다'라는 답변을 받게되었다.( 맥을 와이파이로 연결해서 사용해서 그런건가 추측)
그렇게 certifi 라이브러리를 설치하고 DB연결을 할때의 url에 추가로 넣어주니 말끔하게 해결이 되었다.
pymongo의 CRUD
- CREATE
- insert_one(): 하나의 데이터만 입력할 때
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
- insert_many(): 여러개의 데이터를 입력할 때
doc = [{'name':'bobby','age':21},{'name':'bob','age':20}]
db.users.insert_many(doc)
- READ
- find_one(): 조건에 해당되는 가장 빨리 검색되는 하나의 데이터만 찾을 때 (조건이 없을 땐 가장 첫번째 데이터)
user = db.users.find_one({'name':'minseung'},{'_id':False})
print(user)
- list(): 해당 함수를 호출하면 문자열의 리스트 타입으로 반환한다. 여러 데이터를 찾을 때
all_users = list(db.users.find({},{'_id':False}))
- UPDATE
- update_one(): 하나만 수정할 때. 찾기위한 조건과 바꿀 값을 넣어주면 된다. (첫번째로 해당하는 것만 수정됨)
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
// [컬렉션 객체].update_one( { [조건값] }, {"$set":{수정값}} )
...
{'name': 'bob', 'age': 20}
{'name': 'bob', 'age': 21}
{'name': 'bob', 'age': 22}
>>> result = db.test.update_one({'bob': 1}, {'$set': {'age': 33}})
...
{'name': 'bob', 'age': 33}
{'name': 'bob', 'age': 21}
{'name': 'bob', 'age': 22}
- update_many(): 조건에 해당되는 모든 데이터를 수정한다.(필드가 없으면 생성됨)
db.users.update_many({'name':'bobby'},{'$set':{'age':19}})
- DELETE
- delete_one(): 하나만 삭제.
db.users.delete_one({"name": "minseung"})
- delete_many(): 여러 개 삭제.
db_test_users.delete_many({"name": "minseung"})