ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python Flask CORS ,Crawling
    파이썬 2022. 6. 14. 18:26
    728x90

    Python에서 Flask를 사용하는 경우 CORS(Cross Origin Resource Sharing) 설정이 필요할 수 있습니다. 예를들어 다른 도메인이나 로컬 환경에서 자바스크립트로 api 등을 호출하는 경우 브라우저에서 동일 출처 위반의 에러가 나타날 수 있습니다. 이를 해결하려면 어떻게 할까요?

    이때 CORS를 설정할 수 있습니다. CORS는 자바스크립트를 사용한 api 등의 리소스 호출시 동일 출처(같은 호스트네임)가 아니더라도 정상적으로 사용 가능하도록 도와주는 방법입니다.

     

    http://localhost:5000/  이렇게 접근하면 접근을 하지 못한다. 그래서 cors설정을 통해 접근할 수 있게 한다.

    =>가지고 오지 못함

    =>CORS에러 

    cmd에 설치하고

    from flask_cors.extension import CORS
    
    app = Flask(__name__,static_url_path='')
    CORS(app)

    이렇게 써주기


    크롤링 하기 

    day14의 myrequest.py실행하고 ...

    import requests
    
    from bs4 import BeautifulSoup
    
    htmls =requests.get("http://127.0.0.1:5000/")
    print(htmls.text)
    
    soup = BeautifulSoup(htmls.text, "html.parser")
    print("---------------------------------------")
    print(soup)
    print("---------------------------------------")
    print(soup.find_all("tr"))
    
    trs =soup.find_all("tr")
    
    for idx,tr in enumerate(trs):
        if idx >0:
            tds =tr.find_all("td")
            print(tds[1].text,tds[3].text)

    select 방식 

    trs2 =soup.select('tr')
    for idx,tr in enumerate(trs2):
        if idx >0:
            tds =tr.select("td")
            print(tds[1].text,tds[3].text)


    웹크롤링하여 db에 넣기 

    import requests
    from bs4 import BeautifulSoup
    import datetime
    import pymysql
    
    conn = pymysql.connect(host='localhost', user='root', password='python',
                           db='python',port=3305, charset='utf8')
    curs = conn.cursor()
    
    now = datetime.datetime.now()
    ymd = now.strftime("%Y%m%d.%H%M")
    print(ymd)
    
    
    htmls = requests.get('https://vip.mk.co.kr/newSt/rate/item_all.php?koskok=KOSDAQ&orderBy=dd')
    #https://vip.mk.co.kr/newSt/rate/item_all.php?koskok=KOSDAQ&orderBy=dd
    #https://vip.mk.co.kr/newSt/rate/item_all.php
    
    htmls.encoding = "euc-kr"
    
    soup = BeautifulSoup(htmls.text, "html.parser")
    
    st2s = soup.select(".st2")
    
    for st in st2s:
        s_name = st.text
        s_code = st.select("a")[0]['title']
        price = st.parent.select("td")[1].text.replace(",","")
        
        print(s_name,s_code,price,ymd)
        sql = f"""insert into stock (s_code,s_name,price,ymd) 
            values ('{s_code}','{s_name}','{price}','{ymd}')"""
    
        print("sql",sql)
        cnt = curs.execute(sql)
        print("cnt",cnt)
    
    conn.commit()
    curs.close() 
    conn.close()


    Selenium 모듈을 이용하는 방법 (동적 크롤링)

    크롬 정보와 맞게 다운로드 

    from selenium import webdriver
    
    # Webdriver 실행
    browser = webdriver.Chrome()
    browser.get('http://127.0.0.1:5000/')
    
    trs = browser.find_elements_by_css_selector('#tb > tr')
    
    for tr in trs:
        tds = tr.find_elements_by_css_selector("td")
        print(tds[1].text,tds[3].text)

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    # Webdriver 실행
    browser = webdriver.Chrome()
    browser.get('http://127.0.0.1:5000/')
    
    trs = browser.find_elements(by=By.CSS_SELECTOR, value = "#tb > tr")
    
    
    for tr in trs :
        tds = tr.find_elements(by=By.CSS_SELECTOR, value = "td")
        print(tds[1].text, tds[3].text)

    =>하지만 이런식으로 쓰는것이 좋음

     


    import pymysql
    
    class DaoMango:
        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,m_name,menu):
            sql = f"""insert into mangoplate (m_name,menu) 
                    values ('{m_name}','{menu}')"""
                    
            print("sql",sql)
            
            cnt = self.curs.execute(sql)
            self.conn.commit()
            return cnt
    
        
        def __del__(self):
            self.curs.close()
            self.conn.close()
        
    if __name__ == '__main__':
        de = DaoMango()
        cnt = de.myinsert('1','1')
        print(cnt)
    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.mymango_dao import DaoMango
    
    form_class = uic.loadUiType("mymango_gui.ui")[0]
    
    class MainClass(QMainWindow, form_class):
        def __init__(self) :
            QMainWindow.__init__(self)
            self.browser = webdriver.Chrome()
            self.browser.get("https://www.mangoplate.com/search/%EB%8C%80%EC%A0%84%20%EC%98%A4%EB%A5%98%EB%8F%99")
            self.dm = DaoMango()
            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):
            figs = self.browser.find_elements(by=By.CSS_SELECTOR, value='figcaption')
            for fig in figs:
                try:
                    m_name = fig.find_elements(by=By.CSS_SELECTOR, value='a')[0].text
                    if m_name != "":
                    
                        menu = fig.find_elements(by=By.CSS_SELECTOR, value='.etc')[0].find_elements(by=By.CSS_SELECTOR, value='span')[0].text
                        print(":",m_name,":",menu)
                    
                        cnt = self.dm.myinsert(m_name, menu)
                        print(cnt)
                except:
                    print("error:")
                
        
            
    if __name__ == "__main__" :
        app = QApplication(sys.argv) 
        window = MainClass() 
        app.exec_()
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    # 102.0.5005.63
     
    browser = webdriver.Chrome()
    browser.get("https://www.mangoplate.com/search/%EB%8C%80%EC%A0%84%20%EC%98%A4%EB%A5%98%EB%8F%99")
    
     
    trs = browser.find_elements(by=By.CSS_SELECTOR, value='#tb > tr')
    
    for tr in trs:
        tds = tr.find_elements(by=By.CSS_SELECTOR, value='td')
        print(tds[1].text,"\t",tds[3].text)

     

    728x90

    '파이썬' 카테고리의 다른 글

    vuejs, nodejs, mysql  (0) 2022.06.17
    Crawling 2 , fast  (8) 2022.06.16
    Flask에서 Ajax ,axios예제  (0) 2022.06.13
    pymysql -22.06.08-22.06.09  (0) 2022.06.09
    오목게임 만들기-22.06.03~22.06.07  (0) 2022.06.07
Designed by Tistory.