일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- NeXT
- Class
- socket io
- Vue
- pandas
- EC2
- SAA
- 중급파이썬
- 튜플
- react
- merge
- Props
- async
- wetube
- S3
- 파이썬
- RDS
- flask
- AWS
- 카톡
- docker
- SSA
- git
- dict
- 채팅
- node
- lambda
- TypeScript
- crud
- MongoDB
- Today
- Total
초보 개발자
1주차 2일차 본문
오늘은 Python 크롤링에, jquery로 ajax통신 하는법 대해서 배웠다.
먼저 크롤링을 하기 위해서는 requests와 bs4를 받아와야 한다. request는 http상에서 data와 같은 정보를 받아 와주는 역할을 쉽게 해준다. get, post ... bs4는 그 가져온 데이터를 가공하여 filter해주는 역할을 해준다.
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')
#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img 여기의 alt속성에 순위가 적혀있다.
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a 여기의 text안에 영화제목이 적혀있다.
#old_content > table > tbody > tr:nth-child(2) > td.point 여기의 text안에 영화 평점이 적혀있다.
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
num = movie.select_one('td > img')
title = movie.select_one('td.title > div > a')
rating = movie.select_one('tr > td.point')
if (num or title or rating) is not None:
print(num['alt'], title.text, rating.text)
request.get을 통하여 정보를 가져온 후 text로 표현하면 string으로 나타내고 content로 표현하면 바이너리로 나타낸다.
검색을 하는 경우에도 select와 find 두가지를 사용할 수 있는데 비슷하지만 몇가지 차이점이 존재한다.
BeautifulSoup 모듈 find와 select의 차이점
tag = "<p class='youngone' id='junu'> Hello World! </p>"
soup = BeautifulSoup(tag)
1. find는 태그 요소를 이용해서 찾는 방법
# 태그 이름만 특정
soup.find('p')
# 태그 속성만 특정
soup.find(class_='youngone') soup.find(attrs = {'class':'youngone'})
# 태그 이름과 속성 모두 특정
soup.find('p', class_='youngone')
2. select는 css를 이용해서 찾는 방법
장점 : 하위로 이동이 편리함
#find soup.find('div').find('p')
#select soup.select_one('div > p') 직관적으로 나타낼 수 있음 '>' 자식 ' '자손
장점 : 특정 요소로 이동이 편리
CSS셀렉터를 사용하여 직관적으로 나타낼 수 있음
# 태그 이름만 특정
soup.select_one('p')
# 태그 class 특정
soup.select_one('.youngone')
# 태그 이름과 class 모두 특정
soup.select_one('p.youngone')
# 태그 id 특정
soup.select_one('#junu')
# 태그 이름과 id 모두 특정
soup.select_one('p#junu')
# 태그 이름과 class, id 모두 특정
soup.select_one('p.youngone#junu')
출처: https://desarraigado.tistory.com/14 [준우의 오류노트]
select를쓰는 것이 좀 더 편할 거 같다.
이젠 mongoDB를 사용해 볼 차례이다.
python에서 mongoDB에 연결하는 방법은 먼저 pymongo, dnspython를 받아온 뒤
from pymongo import MongoClient
client = MongoClient('mongodb+srv://taehyeki:<password>@cluster0.73dgs.mongodb.net/MyCluster?retryWrites=true&w=majority')
db = client.dbsparta(원하는 이름)
doc = {
'name':'kim',
'age':27
}
db.users.insert_one(doc)
먼저 <password>에 자신의 password를 넣고 MyCluster에 자신의 Cluster이름을 넣으면 mongo로 접속이 된다.
그 이후 db를 만들고 있으면 참조한다. doc이라는 dic을 insert_one하면
sparta안에 users안에 doc이 잘 들어와있는 것을 알 수 있다.
간단한 명령어 몇가지를 살펴보자.
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'})
find를 할 때 list()로 묶어주어야지 list형식으로 나타난다.
jquery에서 ajax통신을 하는 방법에 대해서도 배웠다.
index.html이 켜지면 (localhost:5000/) 바로 실행되는 script이다. set_temp(), show_comment()가 실행이 되어진다.
먼저 set_temp()는
get방식으로 호출하고 url은 ~~이며 data를 보내지않고(get이라서) 잘 통신이 되었을 경우 서버에서 받아오는 data를 response에 받아온다. 여기서는 url호출해서 '어떤' 데이터를 받아오는 역할을 한다.
여기서 우리 브라우저가 저 url로 슝~하고 가는 것이아니라 알아서 우리가 보이지 않는 상태에서 해온다. 저건 온도를 구해오는 API이므로 response에 temp라는 키안에 서울의 온도가 들어있다.
show_comment()는
시작하자마자 /homework로 get호출 한다. 그럼 서버에서 /homework에서 get으로 받을경우
mongoDB에서 팬명록을 모조리 긁어온 뒤에 list로 보내준다 이 list가 sript안에 response가 되는 것이다.
근데 여기서 jsonify로 안보내도 잘 가지긴 한다...
무튼 다시 올라가서
거기에 여러 정보가 배열로 들어있다. 단순히 name과 comment만 들어있기 때문에 for문으로 돌린후 값을 추출 후
태그안에 값만 집어넣어서 append하면 된다.
팬명록은 이렇게 생겼다.
여기서 닉네임과 응원댓글을 남기면 이번엔 그 데이터를 가지고 서버 /homework POST방식으로 전송할 것이다.
name과 comment input에서 값을 jquery를 통해 받아 온 뒤에 공백이면 다시 적으라는 경고창을 보내고 그렇지 않으면
ajax로 name과 comment를 보낸다.
request.form안에 우리가 보낸 값이 들어있다 그 값을 doc에 넣은 뒤 db안에 넣어주자
그럼 다시 돌아와서 reload()를 하니까 팬명록이 쌓이지 않고 갱신이 되어진 것처럼 보인다.
가비아에서 도메인을 하나 구매하였다.
taehyeki.shop이었나 ~ 500원 정도 했다 1년에
그리고 내가 만든 페이지를 업로드 하기 위해서 AWS의 EC2 콘솔에 들어가서 인스턴스를 생성하였다.
이제 내 클라우드 서버가 하나 만들어 진 셈이다. 여기에 들어가서 키페어를 생성해주고 gitbash를 통해 ubuntu로 이 서버를 제어할 수 있게 되었다. 포트는 80포트와 5000포트를 열어주었다.
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000
위와 같은 명령어를 통해서 80번포트로 들어오면 5000포트로 변환해주는 기능도 만들었다.
파일질라를 통해서 내 컴퓨터에 있는 파일을 클라우드 서버에 옮겨주었고 이 때 키페어가 필요하였다.
git bash로 넘어와서 필요한 모듈들을 설치해주고 (venv 폴더는 옮기면 안됨)
nohup python app.py & 을 입력해주면 git bash창을 꺼도 내 사이트가 유지 되는 것을 확인할 수 있다.
끄고 싶은 경우에는
ps -ef | grep 'python app.py' | awk '{print $2}' | xargs kill
를 입력해주면 된다.
http://13.209.67.82:5000/ 로 접속하면 홈페이지가 나타나게 된다.
여기서 아까 사둔 도메인을 입혀보도록 해보자
가비아에 호스트에 @을 입력하고 IP값을 입력한뒤 저장해주자