ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Crawling 2 , fast
    파이썬 2022. 6. 16. 09:57
    728x90

    <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
Designed by Tistory.