시작하기에 앞서
파이썬에서 웹 크롤링하는 것에 대한 정리이다. 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
= 순서가 없는 목록