간단한 주말 프로젝트
# =======================================
from selenium import webdriver
from bs4 import BeautifulSoup
import mysql.connector
from mysql.connector import errorcode
import sys
import time
from bs4 import BeautifulSoup
# =======================================
class DBmysql:
# 생성자
def __init__(self):
self.conn_info = {
'user':'root', # user id
'password':'1234', # user pw
'host':'127.0.0.1', # mysql server ip address
'database':'college'
}
self.conn = None
self.cursor = None
# func (1) : 데이터 베이스 생성 > 테이블 생성
def serverConn(self):
try:
self.conn = mysql.connector.connect(
user=self.conn_info['user'],
password=self.conn_info['password'],
host=self.conn_info['host']
)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print ("계정 정보가 잘못된것 같습니다.")
else:
print (err)
sys.exit(1)
print ("[1] DB server connect success ... !!!")
self.cursor = self.conn.cursor()
# 데이터 베이스 생성
try:
sql = "CREATE DATABASE {}".format(self.conn_info['database'])
self.cursor.execute(sql)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_DB_CREATE_EXISTS:
print ("Database 생성 에러")
else:
print (err)
sys.exit(1)
else: # 데이터 베이스 생성 성공
print ("[2] 데이터 베이스 생성 성공")
try: # 데이터 베이스 접근 시도
self.cursor.execute('USE college')
except:
print ("DB 접근 실패")
else:
"""
c_name : 대학이름
l_name : 지역이름
"""
sql = "CREATE TABLE college_info (" \
" c_name varchar(30) PRIMARY KEY," \
" l_name varchar(30)" \
")"
try: # 테이블 생성 시도
self.cursor.execute(sql)
except:
print ("테이블 생성 시도 실패")
else:
print ("테이블 생성 성공")
self.conn.close()
def dataInsert(self, insrtv):
try:
# DB 접근
self.conn = mysql.connector.connect(
user=self.conn_info['user'], # user id
password=self.conn_info['password'], # user pw
host=self.conn_info['host'], # DB server ip address
database= self.conn_info['database'] # Database name
)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print ("접근 계정의 정보(id or pw)가 잘못된 것 같습니다.")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print ("접근 하고자 하는 DB 정보가 잘못된 것 같습니다.")
else:
print (err)
sys.exit(1)
else:
print ("DB 접근 성공 ...")
sql = "INSERT INTO `college_info`(c_name, l_name) VALUES (%s, %s)"
self.cursor = self.conn.cursor() # 객체 생성
for k, v in insrtv.items():
for i in v:
self.cursor.execute(sql, (i, k))
print ("DB 적재 성공 ...")
self.conn.commit() # 이 부분을 안하면 DB에 반영이 안된다.
class STU(DBmysql):
def __init__(self):
DBmysql.__init__(self) # 부모 클래스 초기화
self.webDriver = None
self.html = None
self.bsObj = None
self.local_colleges = {
"경기도":list(),
"강원도":list(),
"충청도":list(),
"전라도":list(),
"경상도":list(),
"제주도":list()
}
# func (1)
def seleniumDriv(self):
self.webDriver = \
webdriver.Chrome("C:\\Users\\sleep\\Desktop\\chrom_driver\\chromedriver.exe")
self.webDriver.get("https://www.naver.com/")
time.sleep(2) # 2 seconds ...
self.webDriver.find_element_by_id('query').send_keys("전국대학교")
time.sleep(2) # 2 seconds ...
self.webDriver.find_element_by_class_name("ico_search_submit").click()
'''
경기도 : //*[@id="main_pack"]/div[2]/div/div[2]/div[1]/ul/li[1]/ul/li[3]/a
강원도 : //*[@id="main_pack"]/div[2]/div/div[2]/div[1]/ul/li[1]/ul/li[4]/a
충청도 : //*[@id="main_pack"]/div[2]/div/div[2]/div[1]/ul/li[1]/ul/li[5]/a
전라도 : //*[@id="main_pack"]/div[1]/div/div[2]/div[1]/ul/li[1]/ul/li[6]/a
경상도 : //*[@id="main_pack"]/div[1]/div/div[2]/div[1]/ul/li[1]/ul/li[7]/a
제주도 : //*[@id="main_pack"]/div[1]/div/div[2]/div[1]/ul/li[1]/ul/li[8]/a
'''
local_dict = {
"경기도":[2, 3], "강원도":[2, 4], "충청도":[2, 5],
"전라도":[1, 6], "경상도":[1, 7], "제주도":[1, 8]
}
for k, v in local_dict.items():
btn = \
'//*[@id="main_pack"]/div[{}]/div/div[2]/div[1]/ul/li[1]/ul/li[{}]/a'.\
format(v[0], v[1])
self.webDriver.find_element_by_xpath(btn).click()
print ("current url: {}".format(self.webDriver.current_url))
self.html = self.webDriver.page_source
self.bsObj = BeautifulSoup(self.html, "html.parser")
time.sleep(2) # 2 seconds
element = self.bsObj.select("ul.lst_txt.no_dot > li > a")
for i in element:
print (i.text)
self.local_colleges[k].append(i.text)
time.sleep(2) # 2 seconds
self.dataInsert(self.local_colleges) # function call
def main():
node = STU() # 객체 생성
node.serverConn() # 테이블 생성
node.seleniumDriv() # 크롤링 데이터 수집
if __name__ == "__main__":
main()
=====================================================================================
from flask import Flask, request, render_template
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
user = "root",
password = "1234",
db = "college")
app = Flask(__name__)
@app.route("/")
def RootURL():
cursor = conn.cursor() # 객체 생성
sql = "SELECT * FROM college_info"
cursor.execute(sql)
results = cursor.fetchall()
return render_template('index.html', results=results)
if __name__ == "__main__":
app.run(host='0.0.0.0',
port=5555,
debug=True)
=====================================================================================