파이썬
Python Flask CORS ,Crawling
AIN99
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