-
Crawling 2 , fast파이썬 2022. 6. 16. 09:57728x90
<mynmap_dao>
import pymysql class DaoMap: def __init__(self): self.conn = pymysql.connect(host='localhost', user='root', password='python', db='python',port=3305, charset='utf8') self.curs = self.conn.cursor(pymysql.cursors.DictCursor) def myinsert(self,store,m_name,price): sql = f"""insert into menu (store,m_name,price) values ('{store}','{m_name}','{price}')""" print("sql",sql) cnt =-1 try: cnt = self.curs.execute(sql) self.conn.commit() except: print("Daomap:error") return cnt def __del__(self): self.curs.close() self.conn.close() if __name__ == '__main__': de = DaoMap() cnt = de.myinsert('1','1','1') print(cnt)
<mymap_gui.py>
import sys from PyQt5 import uic from PyQt5.QtWidgets import QApplication, QMainWindow from selenium import webdriver from selenium.webdriver.common.by import By form_class = uic.loadUiType("mynmap_gui.ui")[0] class MainClass(QMainWindow, form_class): def __init__(self) : QMainWindow.__init__(self) self.browser = webdriver.Chrome() self.browser.get("https://place.map.kakao.com/1636040232") self.setupUi(self) self.show() self.pb.clicked.connect(self.myclick) self.pb_scrap.clicked.connect(self.myscrap) def myclick(self): url = self.le.text() self.browser.get(url) def myscrap(self): ims = self.browser.find_elements(by=By.CSS_SELECTOR, value='.info_menu') for im in ims: m_name = im.find_elements(by=By.CSS_SELECTOR, value='.loss_word')[0].text price = im.find_elements(by=By.CSS_SELECTOR, value='.price_menu')[0].text.replace(",","") print(m_name,price) if __name__ == "__main__" : app = QApplication(sys.argv) window = MainClass() app.exec_()
데이터 넣기
import sys from PyQt5 import uic from PyQt5.QtWidgets import QApplication, QMainWindow from selenium import webdriver from selenium.webdriver.common.by import By from day14.mynmap_dao import DaoNmap form_class = uic.loadUiType("mynmap_gui.ui")[0] class MainClass(QMainWindow, form_class): def __init__(self) : QMainWindow.__init__(self) self.dn = DaoNmap() self.browser = webdriver.Chrome() self.browser.get("https://place.map.kakao.com/1636040232") self.setupUi(self) self.show() self.pb.clicked.connect(self.myclick) self.pb_scrap.clicked.connect(self.myscrap) def myclick(self): url = self.le.text() self.browser.get(url) def myscrap(self): ims = self.browser.find_elements(by=By.CSS_SELECTOR, value='.info_menu') store = self.browser.find_elements(by=By.CSS_SELECTOR, value='.tit_location')[1].text for im in ims: m_name = im.find_elements(by=By.CSS_SELECTOR, value='.loss_word')[0].text price = im.find_elements(by=By.CSS_SELECTOR, value='.price_menu')[0].text.replace(",","") cnt = self.dn.myinsert(store, m_name, price) print(cnt,store,m_name,price) if __name__ == "__main__" : app = QApplication(sys.argv) window = MainClass() app.exec_()
패스트API는 표준 파이썬 타입 힌트를 바탕으로 한 파이썬 3.6이상에서 작동하는, 현대적이고 빠른(고성능) API 서버 웹 프레임워크다." , 파이썬 기반 웹프레임워크 중에서 가장 빠른 프레임워크 중 하나
FastAPI는 파이썬으로 API를 빌드하기 위한 web framework이다.
=>관리자 권한으로 실행 하여 다운받는다
<dao_emp.py>
import pymysql class DaoEmp: def __init__(self): self.conn = pymysql.connect(host='localhost', user='root', password='python', db='python',port=3305, charset='utf8') self.curs = self.conn.cursor(pymysql.cursors.DictCursor) def myselects(self): sql = "select * from emp" self.curs.execute(sql) rows = self.curs.fetchall() return rows def myselect(self,e_id): sql = f""" select e_id,e_name,sex,addr from emp where e_id = '{e_id}' """ self.curs.execute(sql) rows = self.curs.fetchall() return rows[0] def myinsert(self,e_id,e_name,sex,addr): sql = f"""insert into emp (e_id,e_name,sex,addr) values ('{e_id}','{e_name}','{sex}','{addr}')""" print("sql",sql) cnt = self.curs.execute(sql) self.conn.commit() return cnt def myupdate(self,e_id,e_name,sex,addr): sql = f""" update emp set e_name='{e_name}', sex='{sex}', addr='{addr}' where e_id='{e_id}' """ cnt = self.curs.execute(sql) self.conn.commit() return cnt def mydelete(self,e_id): sql = f""" delete from emp where e_id='{e_id}' """ cnt = self.curs.execute(sql) self.conn.commit() return cnt def __del__(self): self.curs.close() self.conn.close() if __name__ == '__main__': de = DaoEmp() cnt = de.mydelete('5') print(cnt)
<myfastapi2/py>
from typing import Optional from fastapi import FastAPI from dao_emp import DaoEmp app = FastAPI() #uvicorn myfastapi2:app --reload @app.get("/emp_one.ajax") def emp_one_ajax(): de = DaoEmp() list = de.myselects() return list
C:\workspace_python\DAY15
uvicorn myfastapi2:app --reload
나가는 방법은 : ctrl+c를 하면된다.
http://127.0.0.1:8000/emp_one.ajax 검색하면
http://127.0.0.1:8000/docs에 접근하기 try 누르면 입력할 수 있음
cors문제 해결
from fastapi.middleware.cors import CORSMiddleware class Emp(BaseModel): e_id: str e_name: str sex: str addr: str app = FastAPI() origins = ["*"] app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], )
<fast 이용한 crud>
<myfastapi2.py>
from typing import Optional from fastapi import FastAPI from dao_emp import DaoEmp from pydantic.main import BaseModel from starlette.middleware.cors import CORSMiddleware class Emp(BaseModel): e_id: str e_name: Optional[str] = None sex: Optional[str] = None addr: Optional[str] = None app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) #uvicorn myfastapi2:app --reload @app.post("/emp_one.ajax") async def emp_one_ajax(emp: Emp): print("emp",emp) de = DaoEmp() emp = de.myselect(emp.e_id) return emp @app.post("/emp_list.ajax") async def emp_list_ajax(): print("emp_list_ajax") de = DaoEmp() list = de.myselects() return list @app.post("/emp_add.ajax") async def emp_add_ajax(e: Emp): print("emp",e) de = DaoEmp() cnt = -1 try: cnt = de.myinsert(e.e_id, e.e_name, e.sex, e.addr) except: print("dao : error") return {'cnt':cnt} @app.post("/emp_mod.ajax") async def emp_mod_ajax(e: Emp): print("emp",e) de = DaoEmp() cnt = -1 try: cnt = de.myupdate(e.e_id, e.e_name, e.sex, e.addr) except: print("dao : error") return {'cnt':cnt} @app.post("/emp_del.ajax") async def emp_del_ajax(e: Emp): print("emp",e) de = DaoEmp() cnt = -1 try: cnt = de.mydelete(e.e_id) except: print("dao : error") return {'cnt':cnt}
class Emp(BaseModel):
e_id: str
e_name: Optional[str]=None
sex: Optional[str]=None
addr:Optional[str]=None파라미터가 1개만 들어와도 괜찮다 일종의 validation체크
<emp.html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script type="text/javascript"> function fn_init(){ fn_list(); } function fn_list() { var param ={ e_id: '7', e_name: '7' } axios.post('http://127.0.0.1:8000/emp_list.ajax',param) .then(function (res) { fn_list_cb(res); }) } function fn_one(e_id){ var param={ e_id: e_id } axios.post('http://127.0.0.1:8000/emp_one.ajax',param) .then(function (res) { var emp = res; document.querySelector("input[name='e_id']").value = emp.data.e_id; document.querySelector("input[name='e_name']").value = emp.data.e_name; document.querySelector("input[name='sex']").value = emp.data.sex; document.querySelector("input[name='addr']").value = emp.data.addr; }) } function fn_list_cb(res){ console.log(res); var list = res.data; var trs = ""; for(var i=0;i<list.length;i++){ var e_id = list[i].e_id; var e_name = list[i].e_name; var sex = list[i].sex; var addr = list[i].addr; var tr = ` <tr> <td><a href="javascript:fn_one('${e_id}')">${e_id}</a></td> <td>${e_name}</td> <td>${sex}</td> <td>${addr}</td> </tr> `; trs += tr; var obj = document.querySelector("#tb"); obj.innerHTML = trs; } } function fn_add(){ var e_id = document.querySelector("input[name='e_id']").value; var e_name = document.querySelector("input[name='e_name']").value; var sex = document.querySelector("input[name='sex']").value; var addr = document.querySelector("input[name='addr']").value; var param ={ e_id : e_id, e_name : e_name, sex : sex, addr : addr } axios.post('http://127.0.0.1:8000/emp_add.ajax',param) .then(function (res) { console.log("emp_add.ajax",res); var cnt = res.data.cnt; if(cnt == "1"){ fn_list(); document.querySelector("input[name='e_id']").value = ""; document.querySelector("input[name='e_name']").value = ""; document.querySelector("input[name='sex']").value = ""; document.querySelector("input[name='addr']").value = ""; } else { alert("추가도중 문제가 생겼습니다."); } }) } function fn_mod(){ var e_id = document.querySelector("input[name='e_id']").value; var e_name = document.querySelector("input[name='e_name']").value; var sex = document.querySelector("input[name='sex']").value; var addr = document.querySelector("input[name='addr']").value; var param ={ e_id : e_id, e_name : e_name, sex : sex, addr : addr } axios.post('http://127.0.0.1:8000/emp_mod.ajax',param) .then(function (res) { var cnt = res.data.cnt; if(cnt == "1"){ fn_list(); document.querySelector("input[name='e_id']").value = ""; document.querySelector("input[name='e_name']").value = ""; document.querySelector("input[name='sex']").value = ""; document.querySelector("input[name='addr']").value = ""; } else { alert("수정도중 문제가 생겼습니다."); } }) } function fn_del(){ var e_id = document.querySelector("input[name='e_id']").value; var param ={ e_id : e_id } axios.post('http://127.0.0.1:8000/emp_del.ajax',param) .then(function (res) { var cnt = res.data.cnt; if(cnt == "1"){ fn_list(); document.querySelector("input[name='e_id']").value = ""; document.querySelector("input[name='e_name']").value = ""; document.querySelector("input[name='sex']").value = ""; document.querySelector("input[name='addr']").value = ""; } else { alert("삭제도중 문제가 생겼습니다."); } }) } </script> </head> <body onload="fn_init()" > <table border="1px"> <thead> <tr> <td>사번</td> <td>이름</td> <td>성별</td> <td>주소</td> </tr> </thead> <tbody id="tb"> <tr> <td>1</td> <td>1</td> <td>1</td> <td>1</td> </tr> <tr> <td>2</td> <td>2</td> <td>2</td> <td>2</td> </tr> </tbody> </table> <table border="1px"> <tr> <td>사번</td> <td> <input type="text" name="e_id" /> </td> </tr> <tr> <td>이름</td> <td> <input type="text" name="e_name" /> </td> </tr> <tr> <td>성별</td> <td> <input type="text" name="sex" /> </td> </tr> <tr> <td>주소</td> <td> <input type="text" name="addr" /> </td> </tr> <tr> <td colspan="2"> <input type="button" value="추가" onclick="fn_add()" /> <input type="button" value="수정" onclick="fn_mod()" /> <input type="button" value="삭제" onclick="fn_del()" /> </td> </tr> </table> </body> </html>
728x90'파이썬' 카테고리의 다른 글
nodejs, Vue (0) 2022.06.20 vuejs, nodejs, mysql (0) 2022.06.17 Python Flask CORS ,Crawling (0) 2022.06.14 Flask에서 Ajax ,axios예제 (0) 2022.06.13 pymysql -22.06.08-22.06.09 (0) 2022.06.09