on
[노마드 코더] Python으로 웹 스크래퍼 만들기 - 총 코드 정리
[노마드 코더] Python으로 웹 스크래퍼 만들기 - 총 코드 정리
728x90
from flask import Flask, render_template,request,redirect,send_file #render_template: html을 main문으로(유저에게) 이동시켜주기 위해서, request: 사용자가 찾으려는 단어를 찾기 위해서 from scrapper import get_jobs from exporter import save_to_file app=Flask("SuperScapper")#앱 이름 db={} #DB는 라우트 외부에 나와있어야 함 ,report가 실행될때마다 초기화가 되면 안되니까 @app.route("/") def home(): return render_template("potato.html") #return "Hello! Welcome to mi casa!" @app.route("/report") def report(): word=request.args.get('word') #word 이름의 argument를 request에서 뽑은것 if word: word=word.lower() #소문자 처리리 fromDb = db.get(word) if fromDb: jobs=fromDb else: jobs=get_jobs(word)#DB에 단어가 없다면 scrapper를 돌리면 된다. db[word]=jobs #scrapping을 마친 jobs를 DB에 넣어주면 됨 else: return redirect("/") return render_template("report.html",searchingBy=word,resultsNumber=len(jobs),jobs=jobs) #report.html로 가는 정보들들 # 변수들을 {{}}안에 넣어줘서 사용자한테 보여줌 @app.route("/export") def export(): try: word=request.args.get('word') #word 이름의 argument를 request에서 뽑은것 if not word: raise Exception() #except 블록으로 가게 만들어줌 jobs=db.get(word) if not jobs: raise Exception() save_to_file(jobs) return send_file("jobs.csv") except: return redirect("/") #@app.route("/") # @=데코레이터 파이썬이 위와 같은 코드를 보면 /contact 로 요청이 들어오면 밑에있는 함수를 실행시킨다 (함수만 봄) #꺽쇠 부분은 placeholder #def potato(username): # return f"Hello {username} how are you doing" app.run(host="0.0.0.0") #repl.it이 이 사이트를 공개하고 싶구나 알수 있게하는 코드
Job Search Job search Search
Job Search section{ display: grid; gap:20px; grid-template-columns: repeat(4, 1fr); } Search Results Found {{resultsNumber}} result for: {{searchingBy}} Export to CSV Title Company Location Link {% for job in jobs %} {{job.title}} {{job.company}} {{job.location}} Apply {% endfor %}
import csv def save_to_file(jobs): file=open("jobs.csv",mode="w") print(file) writer=csv.writer(file) #연 파일에다가 csv 작성 writer.writerow(["title", "company", "location", "link"]) #writerow 함수를 통해 각 column 들의 첫번째 칸에 작성된다. for job in jobs: writer.writerow(list(job.values())) #job이 가진 list값을 row로 옮긴다 return
import requests from bs4 import BeautifulSoup def get_last_page(url): result=requests.get(url) soup=BeautifulSoup(result.text,"html.parser") pages=soup.find("div",{"class":"s-pagination"}).find_all("a") last_page=pages[-2].get_text(strip=True) return int(last_page) #아래 extract_jobs에서 range함수를 사용하기 위해 정수형 변환 def extract_job(html): title=html.find("h2",{"class":"mb4"}).find("a")["title"] company,location=html.find("h3",{"class":"fc-black-700"}).find_all("span",recursive=False) company=company.get_text(strip=True) location=location.get_text(strip=True) job_id=html["data-jobid"] return{'title':title,'company':company,'location':location,'apply-link':f"https://stackoverflow.com/jobs/{job_id}"} def extract_jobs(last_page,url): jobs=[] for page in range(last_page): print(f"Scrapping SO: Page:{page}") result=requests.get(f"{url}&pg;={page+1}") soup=BeautifulSoup(result.text,"html.parser") results=soup.find_all("div",{"class":"-job"}) for result in results: job=extract_job(result) jobs.append(job) return jobs def get_jobs(word): url=f"https://stackoverflow.com/jobs?q={word}" last_page=get_last_page(url) jobs=extract_jobs(last_page,url) return jobs
from http://hiyoonhyuck.tistory.com/43 by ccl(A) rewrite - 2021-04-06 16:00:28