파이썬 정리 -02

시작하기에 앞서

파이썬에서 웹 크롤링하는 것에 대한 정리이다. bs4 flask jinja 등 다양한 라이브러리를 사용하면서 진행해보았다.

requests

  • URL에 요청을 보내고 그에 맞는 응답을 해석하고 크롤링 해보았다.
'''
1. request > naver.com
2. response > bs4
3. webbroser

'''
import requests
from bs4 import BeautifulSoup as bs
import webbrowser

url = "https://www.naver.com"
requests.get(url)
response = requests.get(url).text

#"html.parser" : 받아올 형식을 의미함. 
doc = bs(response, 'html.parser')

# . > class
# # > id
# result = doc.select_one(".ah_k")

#".ah_k"로 끝나는 클래스에서의 값을 리스트 형태로 모조리 받아온다. 하나 받으려면 select_one
result = doc.select(".ah_k")

search_url = "https://search.naver.com/search.naver?query="
for i in range(5): 
    # 실시간 검색어 다섯개를 받아. 새로운 브라우저를 띄워보았다.
    webbrowser.open(search_url + result[i].text)
    # print(result[i].text)

flask

  • 이번에는 요청이 왔을 때 그것에 맞는 응답을 보여주는 것이다.

    flask 라이브러리를 사용해서 간단하게 서버를 구성해보았다.

app.py

from flask import Flask, render_template, request
import random
import datetime

app = Flask(__name__) 
#서버의 이름을 app으로 하겠다.
#파일이름도 똑같게 app으로 하면 명령어 flask run으로 만으로도 동작가능하다.


#url을 관리해주는 친구 > @시작하는 @app.route("/")


@app.route("/")
def hello():
    return "안녕!!"

@app.route("/dday")
def dday():
    today = datetime.datetime.now()
    final = datetime.datetime(2020, 6, 9)
    result = final - today
    #f 문자열 포맷방법 파이썬에서 매우 유용하게 쓰이는것 같다.
    #리턴값은 무엇무엇 오는지는 모르겠지만 string 타입이여야 하는것 같다.
    return f"힘을 내야 하는 날이 {result.days}일 남았습니다."

@app.route("/lotto")
def lotto():
    numbers = random.sample(range(1,46), 6)
    return f"{numbers}"

##오늘이 크리스마스인지 알려준다!
@app.route("/christmas")
def christmas():
    now = datetime.date.today()
    today = datetime.datetime.now()

    print(today.date().strftime("%y년 %m월 %d일"))
    if now.month == 12 and now.day == 25:
        return "크리스마스에요!"
    else :
        return "<h1>아니에요 열심히 기다려봐요<h1>"

@app.route("/movies")
def movies():
    movies = ["겨울왕국2", "클라우스", "어바웃 타임", "나홀로 집에2", "이터널선샤인", "반지의 제왕"]
    return render_template("movie.html", movies = movies) 
##앞 movies가 html 쪽 movies 뒤에는 어떤 리스트를 보낼지.


@app.route("/greeting/<name>")
def greeting(name):
    return f"안녕하세요 {name}님!"

@app.route("/cube/<int:num>")
def cube(num):
    result = num ** 3
    return str(result)

'''
def render_template(str, **args) :
    *이 있으면 파이썬에서는 가변적인 개수가 들어가도 상관없다.
'''


# 식사 메뉴 추천.
# 1. random
# 2. Dynamic route: @app.route("/lunch/1 2 3 4")
# - 숫자를 받아서 명수 개수 만큼 
# - List : 자장면, 짬뽕, 오므라이스, 볶음밥, 고추잡채, 탕수육, 돈까스, 
# - <int:num> 숫자 만큼 뽑기

@app.route("/lunch/<int:num>")
def lunch(num):
    lunches = ["자장면", "짬뽕", "오므라이스", "볶음밥", "고추잡채", "탕수육", "돈까스"]
    #리스트 자체를 넣어줘서 랜덤으로 뽑아줄 수도 있다. 중복허용X
    #중복을 허용하고 싶으면 choice로 뽑아주자.
    lunch = random.sample(lunches,num)
    return render_template("lunch.html", lunches = lunches,people = num, pick_lunch = lunch)

#render_template("lunch.html", lunches = lunces)에서 먼저 폴더안에 templates라는 폴더안에
#"lunch.html" 라는 파일이 있어야한다. 그리고 jinja 라이브러리로 아래의 html에 lunches에 py안의 lunches를 보내준다.



#실행시 debug모드로 들어가 실시간 변화를 감지하게 도와준다.
if __name__ == "__main__":
    app.run(debug=True)

lunch.html

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>점심 메뉴</title>
</head>
<body>
    <h1>점심 메뉴 리스트</h1>
    <ul>
        {% for lunch in lunches %}
            <li>{{lunch}}</li>
        {% endfor %}
    </ul>
    <h1>가고자하는 인원 : {{people}}</h1>
    <h1>뽑힌 점심 메뉴</h1>
    {{pick_lunch}}
</body>
</html>

jinja를 사용할때는 형식에 주의하자

  • 이번에는 웹에서 원하는 요청문을 보낸 후 그것에 맞는 웹을 만들어보자. (vonvon을 참고해서 만들어봤다.)

app.py

@app.route("/vonvon")
def vonvon():
    return render_template("vonvon.html")

@app.route("/godmademe")
def godmademe():
    #vonvon에서 보낸 "name"이라는 키값의 value 를 가져온다. 
    #여기서 request 라이브러리를 사용하는데 이름에 주의하자!
    name = request.args.get("name")
    first_list = ["잘생김", "어중간함", "덤벙거림", "착함", "찌질", "재력", "귀여움"]
    second_list = ["애교", "힘", "용기", "지능", "센스", "식욕", "계획력"]
    third_list = ["운", "행복", "긍정", "생기", "감성", "재수없음", "답답함"]

    #choice는 반환해주는 값이 string 이더라.
    first = random.choice(first_list)
    second = random.choice(second_list)
    third = random.choice(third_list)

    return render_template("godmademe.html", name = name, first = first, second = second, third = third)

vonvon.html

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>vonvon</title>
</head>
<body>
    <h1> 신이 당신을 만들 때</h1>
    <form action="/godmadeeme">
        <input type="text" name="name">
        <input type="submit">
    </form>
</body>
</html>

form 부분을 좀 더 공부해야겠다. 헷갈린다.

godmademe.html

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>신이 당신을 만들때는</title>
</head>
<body>
    <h1>신이 <b>{{ name }}</b>을/를 만들 때...</h1>
    <p> <b>{{ first }}</b>을 한 스푼~</p>
    <p> <b>{{ second }}</b>도 넣어주고~</p>
    <p> 그리고 <b>{{ third }}</b>도 조그....으어ㅡ아아ㅏ아ㅏㅏ</p>
</body>
</html>
  • HTML 태그

    • ol =순서가 있는 목록
    • ul = 순서가 없는 목록

참고링크

© 2020 JunhoBaik, Built with Gatsby