초보 개발자

1주차 2일차 본문

AI 웹개발 트랙 - 내배캠/1주차

1주차 2일차

taehyeki 2021. 12. 14. 10:16

오늘은 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값을 입력한뒤 저장해주자

 

http://taehyeki.shop/

 

이다희 팬명록

응원한마디 남기고 가세요

taehyeki.shop

 

 

'AI 웹개발 트랙 - 내배캠 > 1주차' 카테고리의 다른 글

타임어택 구현 4  (0) 2021.12.18
타임어택 구현 3  (0) 2021.12.17
타임어택 구현 2  (0) 2021.12.17
타임어택 구현 1  (0) 2021.12.17
1주차 1일차  (0) 2021.12.13