만든 스크래퍼를 웹서버에 넣기.
검색하면 cvs 파일 대신 바로 웹사이트에 띄우게.
사용자에게 입력어 받기
다른 페이지로 넘어가기
받은 입력어 저장하고 활용하기
micro framework - 간단하게 웹 사이트 만들수 있게.
repl it 에서는 패키지 add해주고
from flask import Flask
이렇게 하면 replit으로 웹서버를 구축한 셈
app.run(host="0.0.0.0") 는 replit에만 해당. 레플잇이 아 서버 열고싶구나 알아들음.
/로 접속요처아면 파이썬 함수 실행하게

@는 데코레이터 - 바로 아래있는 함수를 찾아서 데코레이트 함. ("")안에 있는 걸로 요청이 들어오면 함수 실행하게함. -> 바로 밑에 함수 안써주며 에러.
만약 데코레이터 라우트에 /<> placeholder를 쓰면..
<>안에 있는 걸 인자로 받음. -> 바로 밑 함수는 이걸 인자로 꼭 써줘야 함.

다른 사이트에서 / 뒤에 아이디 치면 해당 패이지 가져오는 개념과 같음.

이렇게 바로 쓸 수 있지만 아주 더러움.
-> html 탬플릿을 만들어서 이거 해결하기.
템플릿 폴더를 만들고 html파일을 만들어서 그 안에 html 코드 짜기
파이썬이 html파일 불러오게 하기
flask 라이브러리에 render_template 메서드 임포트

html form 이랑 query argument 수정
html에서 유저가 작성한 input값 가져오기

이렇게 input 테그에 name을 주고 get을 하면 action에 붙여서 url에 다음과 같이 나옴.

파이썬 코드로 이걸(searchword) 가져오도록 함

그러면 페이지에서 이렇게 출력됨.

같은 방식으로 문장 출력 대신 패이지 템플릿을 불러오도록 함.
우선 파이썬으로.. 다음과 같이 탬플릿을 랜더하고 변수를 쓸 수 있게 정해줌.

그리고 html 파일을 만들어줌.
변수를 쓸때는 {{}} 겹으로 붙이기


만약 입력 값이 대문자라면 소문자로 바꿔줘야함. -함수 lower()로 가능
입력값이 없으면 그에 맞는 처리 예를들면 홈으로 돌아가기 설정이 필요함 - redirect로 가능

만든 스크래퍼와 웹페이지를 합치기
!! 분량이 너무 많으니까 한 페이지만 가져와보기
웹페이지 쪽에 스크래퍼 파일을 가져오고, import 필요한 패키지 add해주기
get_job 함수가 searchword를 받을 수 있게 수정하기 - 받아서 url로 쓸 수 있게 url도 수정
main 수정

scrapper 수정 : 인자를 가지는 함수들로 바꿔주기

매번 수많은 페이지를 스크래핑 할 수 없으니까 fakeDB 만들어주자. 아래처럼 빈 {}만들고,
입력받은 검색어가 {}안에 없으면 get_jobs에서 jobs를 가져오고 db[searchword]에 그 jobs를 저장함.
검색을 이미 했던거라면, BD에서 searchword를 get했는데 그게 이미 존재한다면, fromDB가 있다는 뜻이니까 jobs는 그대로 fromDB가 됨.

html 파일 수정해서 페이지에 띄울거 만들고 
html파일이 랜더링 됐을 때 변수 쓸 수 있게 main.py에서 변수 추가해주기 
결과 
html 마크업으로 표 만들기

jobs를 html에서도 쓸 수있도록 변수를 렌더링에 너허주고, html 페이지에 파이썬의 forin구문을 써서 jobs의 모든 job에 대한 코드를 작생해줌. flask를 쓰면 html문서에서 {% %}안에 파이썬 코드를 쓸 수 있음. 
결과 
export 라는 링크 만들고 연결

scrapper에서 만들었던 csv 파일 만드는 python 파일 복붙.
main에 exporter 의 메서드를 임포트하고 코드에 적용 - 함수가 실행되고 파일이 생성됨.
이렇게 해주면 파일이 생성됨.
다운해주려면, flask에서 send_file 임포트하고 코드에 써주기 
페이지 
검색어입력후 
Export 클릭 후 
# main.py
from flask import Flask, render_template, request, redirect, send_file
from so_scrapper import get_jobs
from exporter import save_to_file
app = Flask("SuperScrapper")
db = {}
@app.route("/")
def home():
return render_template("job.html")
@app.route("/report")
def report():
searchword = request.args.get('searchword')
if searchword:
searchword = searchword.lower()
fromDB = db.get(searchword)
if fromDB:
jobs = fromDB
else:
jobs = get_jobs(searchword)
db[searchword] = jobs
else:
return redirect("/")
return render_template("report.html", searchword = searchword, resultsNumber=len(jobs), jobs = jobs)
@app.route("/export")
def export():
try:
searchword = request.args.get('searchword')
if not searchword: #검색어없으면 예외로
raise Exception()
searchword = searchword.lower()
fromDB = db.get(searchword)
if not fromDB: #데이터베이스에 없으면 예외로
raise Exception()
save_to_file(fromDB)
return send_file("downloadjobs.csv")
except: #예외로 오면 밑에 코드 처리
return redirect("/")
app.run(host="0.0.0.0")
유저는 우선 홈으로 - job.html
jobs.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JOB search</title>
</head>
<body>
<h1> Search your Job</h1>
<form action="/report" method="get">
<input placeholder='write the keyword:' name='searchword' required />
<button>Search</botton>
</form>
</body>
</html>
이 html파일에서는 받은 input 정보를 /report로 보내줌
main에서 report부분을 보면, serachword의 arg를(? 다음에 나오는 것) 요청하고 받아서 searchword에 저장해줌.
만약에 검색어가 있다면, 그걸 소문자로 바꿈.
db에 이미 있나 확인, fromBD가 db에서 검색어를 가져온건데 이게 있으면 바로 채용공고의 나열인 jobs가 되고 없으면 그걸 긁어오는 함수를 써주고 db에 추가함
검색어가 없으면 홈으로 돌아감.
그런당므 리턴으로 render template으로 report.html을 렌더해줌. 여기서 html파일에서도 변수 쓸 수 있게 써줌.
report.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JOB search</title>
<style>
section {
display: grid;
gap: 20px;
grid-template-columns: repeat(4, 1fr);
}
</style>
</head>
<body>
<h1> Search results</h1>
<h3> Found {{resultsNumber}} results for: {{searchword}} </h3>
<a href="/export?searchword={{searchword}}"> Export to CSV </a>
<section>
<h4>TITLE</h4>
<h4>COMPANY</h4>
<h4>LOCATION</h4>
<h4>LINK</h4>
{% for job in jobs %}
<span> {{job.title}} </span>
<span> {{job.company}} </span>
<span> {{job.location}} </span>
<a href="{{job.apply_link}}" target="_blanck">Apply</a>
{% endfor %}
</section>
</body>
</html>
report에서는 {{}} 이런설 사용해서 변수 사용할 수 이씀.
여기서 결과를 쭉 보여줌.
section을 사용해서 표처럼 보여줌.
그리고 /export로 가는 링크도 만들어줌.
메인의 export 파트를 보면, 함수가 있음. 이 함수에서는 dntjs url에서 serachword를 가져옴.
만약 서치워드가 없으면 에러 발생 -- 바로 홈으로
서치워드가 있으면 소문자로 바꿔주고 db에서 그 검색어에 해당하는 잡리스트를 찾아 변수에 저장해줌. 만약에 그게 없ㅇ면 또 에러발생시켜서 홈으로.
결과가 있으면 save_to_file 함수로 파일로 만들어줌.
exporter.py
import csv
def save_to_file(jobs):
file = open("downloadjobs.csv", mode="w")
writer = csv.writer(file)
writer.writerow(["title", "company", "location", "apply_link"])
for job in jobs:
writer.writerow(list(job.values()))
return
그리고 서버에 만든 파일을 send_file이라는 함수를 이용해서 사용자 쪽에 보냄.