언어/python

간단한 주말 프로젝트

파아랑새 2018. 11. 3. 14:44

# =======================================

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)




=====================================================================================

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        {% for row in results %}
            <tr>
                <td>{{ row }}<br /></td>
            </tr>
        {% endfor %}
    </div>
</body>
</html>