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

import selenium.webdriver as selWeb

import openpyxl

from openpyxl.styles import Color, PatternFill

import time

import mysql.connector

from mysql.connector import Error, errorcode

import sys

from bs4 import BeautifulSoup

import datetime

import pprint as ppr

import re

import pymongo_stu

import Chat_pie

import os

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

class DB:

    # 생성자

    def __init__(self):

        self.user_Info = {'id': None, 'pw': None}

        self.database_conn_info = {

            'DB_ID': 'root',

            'DB_PW': '1234',

            'DB_SRV_IP': '127.0.0.1',

            'DB_name': 'saramin',

        }


    """

    func (1)

    MySQL server에 접근 

    """

    def F_db_connect(self):

        try: # 접근시도

            conn = mysql.connector.connect(

                user = self.database_conn_info['DB_ID'],        # user id

                password = self.database_conn_info['DB_PW'],    # user pw

                host = self.database_conn_info['DB_SRV_IP'],    # server ip

                database = self.database_conn_info['DB_name'])  # database


        except Error as err:

            if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:

                print ("접근 계정이 잘못된 것 같습니다.")

            elif err.errno == errorcode.ER_BAD_DB_ERROR:

                print ("해당 DB가 존재하지 않습니다.")

            else:

                print (err)

            sys.exit(1)

        else:

            print ("DB에 정상적으로 접근 되었습니다.")

            cursor = conn.cursor()

            try:

                sql = "SELECT * FROM `INFO`"

                cursor.execute(sql)

            except Error as err:

                if err.errno == errorcode.ER_NO_SYSTEM_TABLE_ACCESS_FOR_SYSTEM_TABLE:

                    print ("해당 Database에 table이 존재하지 않습니다.")

                else:

                    print (err)

                sys.exit(1)

            else:

                t_info = cursor.fetchone()

                self.user_Info['id'], self.user_Info['pw'] = t_info

                cursor.close()

                conn.close()


    """

        func (2)

        회사 이름 적재 

    """

    def F_table_data_insert(self, data_list):

        try: # 접근시도

            conn = mysql.connector.connect(

                user = self.database_conn_info['DB_ID'],        # user id

                password = self.database_conn_info['DB_PW'],    # user pw

                host = self.database_conn_info['DB_SRV_IP'],    # server ip

                database = self.database_conn_info['DB_name'])  # database

        except Error as err:

            if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:

                print ("접근 계정이 잘못된 것 같습니다.")

            elif err.errno == errorcode.ER_BAD_DB_ERROR:

                print ("해당 DB가 존재하지 않습니다.")

            else:

                print (err)

            sys.exit(1)

        else:

            print ("DB에 정상적으로 접근 되었습니다.")

            cursor = conn.cursor()

            sql = "INSERT INTO `cor_info` (c_name) VALUES (%s)"


            for i in data_list:

                try:

                    cursor.execute(sql, (i,))

                except Error as err:

                    if err.errno == errorcode.ER_INSERT_INFO:

                        print ("데이터 삽입이 이루어지지 못했습니다.")

                    else:

                        print (err)

                else:

                    print ("데이터 삽입 성공")


            conn.commit()

            cursor.close()

            conn.close()


class XL:

    # 생성자

    def __init__(self):

        # 디렉토리 이동

        self.current_work_dir = os.chdir("C:\\Users\\sleep\\Desktop\\cor_list")

        self.time_info = datetime.datetime.now().strftime("%Y-%m-%d")

        # self.readWb = openpyxl.load_workbook()

        self.wb = openpyxl.Workbook() #  workbook

        self.ws = None # worksheet

        self.wbRead = None

        self.xlIndx = [['c', 4], ['D', 4], ['E', 4], ['F', 4], ['G', 4], ['H', 4]]

        self.xlTag = ['회사이름', '내용', '조건1', '조건2', '위치', '마감일']

        self.me_support_cor_list = list() # 내가 지원한 회사 정보


    # func (1)

    """

    {'회사이름': '(주)지금컴퍼니', '조건1': '2년 up', '조건2': '고졸↑', '위치': '서울 송파구'}

    c_info_data => [ { ... } ]

    엑셀 적재 부분

    """

    def sheetSetting(self, c_info_data):

        # matplotlib을 사용하여 그래프

        label_data = {'경력무관': 0,

                      '신입': 0,

                      '신입 · 경력': 0,

                      '경력자': 0}

        # 엑셀에 데이터를 적재하는 부분]

        self.ws = self.wb.create_sheet(title=self.time_info)  # worksheet

        print ("sheet가 정상적으로 생성 되었습니다.")

        # 셀에 열너비 ========================================================

        self.ws.column_dimensions["C"].width = 28.9 # 회사이름

        self.ws.column_dimensions["D"].width = 60.1 # 내용

        self.ws.column_dimensions["E"].width = 14.7 # 조건1

        self.ws.column_dimensions["F"].width = 13.9 # 조건2

        self.ws.column_dimensions["G"].width = 17.9 # 위치

        self.ws.column_dimensions["H"].width = 11.0 # 마감일

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

        for i, j in zip(self.xlIndx, self.xlTag):

            self.ws[i[0] + str(i[1])] = j; i[1] += 1


        t_num_i = ['B', 5]

        cnt = 1

        for e in c_info_data:

            for k, i in zip(e.keys(), self.xlIndx):

                self.ws[t_num_i[0] + str(t_num_i[1])] = cnt; # 번호

                self.ws[i[0]+str(i[1])] = e[k]


                if k == '조건1':

                    if e[k] == "경력무관":

                        self.ws[self.xlIndx[0][0] + str(self.xlIndx[0][1])].fill = \

                            PatternFill(patternType='solid', fgColor=Color('ff5e67'))

                        label_data["경력무관"] += 1

                    elif e[k] == "신입":

                        self.ws[self.xlIndx[0][0] + str(self.xlIndx[0][1])].fill = \

                            PatternFill(patternType='solid', fgColor=Color('b4eeb4'))

                        label_data["신입"] += 1

                    elif e[k] == "신입 · 경력":

                        self.ws[self.xlIndx[0][0] + str(self.xlIndx[0][1])].fill = \

                            PatternFill(patternType='solid', fgColor=Color('efc253'))

                        label_data["신입 · 경력"] += 1

                    else:

                        self.ws[self.xlIndx[0][0] + str(self.xlIndx[0][1])].fill = \

                            PatternFill(patternType='solid', fgColor=Color('969696'))

                        label_data["경력자"] += 1


            for tmp in self.xlIndx:

                tmp[1] += 1

            cnt += 1

            t_num_i[1] += 1


        # 데이터 적재 후 저장

        self.wb.save("today_{}.xlsx".format(datetime.datetime.now().strftime("%M")))

        # 그래프 출력 함수

        Chat_pie.pie_chart(label_data)


    '''

    def readXlfile(self):

        for xf in os.listdir():

            fname, fexf = os.path.splitext(xf)

            """

            fname : 확장자를 제외한 파일 이름/ fexf : 파일 확장자

            """

            if fexf == ".xlsx":

                # 엑셀 파일 read

                self.wbRead = openpyxl.load_workbook(filename=xf)

                tmp_filter = re.compile(pattern='(\d{4})-(\d{2})-(\d{2}')

                for s in self.wbRead.sheetnames:

                    if tmp_filter.search(s):

                        print (s)

    '''

class STU01(XL, DB, pymongo_stu.MongoDBstu):

    def __init__(self):

        XL.__init__(self) # 부모 클래스 초기화

        DB.__init__(self) # 부모 클래스 초기화

        pymongo_stu.MongoDBstu.__init__(self) # 부모 클래스 초기화

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

        self.target_url = "https://www.saramin.co.kr/zf_user/"

        self.chromDriver_path = "C:\\Users\\sleep\\Desktop\\chrom_driver\\chromedriver.exe"

        self.selHandler = None

        self.html = None

        self.saramin_data = list() # 사람인에 지원한 회사 리스트

        """

        날짜, 시간, 회사, 지원

        """

        self.day_filter = re.compile("(\d{4})-(\d{2})-(\d{2})")

        self.time_filter = re.compile("(\d{2}):(\d{2}):(\d{2})")

    """

    func (2)

    """

    def F_web_requests(self):

        """ 사람인 사이트에 접근 시도 """

        self.selHandler = selWeb.Chrome(executable_path=self.chromDriver_path)

        self.selHandler.get(url=self.target_url)

        time.sleep(2)

        assert "사람인" in self.selHandler.title

        self.selHandler.find_element_by_id('login_person_id').send_keys(self.user_Info['id'])

        self.selHandler.find_element_by_id('login_person_pwd').send_keys(self.user_Info['pw'])

        self.selHandler.find_element_by_xpath('//*[@id="login_frm"]/fieldset/div/button').click()

        time.sleep(2)

        """ 

        전체 스크린 

        : 전체 스크린을 하지 않으면 아바타서치 버튼이 활성화가 안됨

        """

        self.selHandler.fullscreen_window()

        # 아바타 서치 : a_tag

        time.sleep(2)

        self.selHandler.find_element_by_link_text('아바타서치').click()

        time.sleep(2)


        self.selHandler.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        temp = self.selHandler.page_source

        self.html = BeautifulSoup(temp, "html.parser")


        lis_avatar = self.html.find("div", {"class":"list_avatar"})

        data_list = lis_avatar.find_all("ul", {"class":"info_list"})

        date_list = lis_avatar.select("div.date > span") # 날짜 정보

        self.selHandler.close()  # selenium 닫기

        """

        데이터 조회

            "회사이름":None, # 구글

            "내용":None,    # 서울아산병원 DeepBrain 연구실 및 회사 연구원 채용

            "조건1":None,   # 신입, 경력

            "조건2":None,   # 대학

            "위치":None     # 서울

        """

        for v, d in zip(data_list, date_list):

            t_insert = {"회사이름":None, "내용":None, "조건1":None,

                        "조건2":None, "위치":None, "마감날짜":None}

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

            # 1. 회사명

            c_name = v.select_one("li.company_name.avatar_list > a")

            c_name = c_name.string

            t_insert["회사이름"] = c_name

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

            # 2. 내용

            c_text = v.select_one("li.recruit_name > a")

            c_text = c_text.string

            t_insert["내용"] = c_text

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

            # 3.

            t = v.select("li.recruit_sector > a > span")

            t_0 = str(t[0].string)

            if '↑' in t_0:

                t_0 = t_0.replace('↑', ' up')

            t_1 = str(t[1].string)

            if '↑' in t_1:

                t_1 = t_1.replace('↑', ' up')

            t_insert["조건1"] = t_0  # ex) 신입 - 1. 빨/ 2. 노/ 3. 초

            t_insert["조건2"] = t_1  # ex) 대학교(4년)

            t_insert["위치"] = t[2].string   # ex) 서울 강남구

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

            # 4. 마감날짜

            t_insert["마감날짜"] = d.string

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

            # print("{0} :  {1}".format(indx+1, c_name))

            self.saramin_data.append(t_insert)


    """

    func (4)

    """

    def F_data_check(self):

        for indx, valu in enumerate(self.saramin_data):

            print (indx+1, ": ", valu)

        self.sheetSetting(self.saramin_data)


    """

    func (5)

    : 지원 list (Saram IN)

    """

    def F_saramin_supp_list(self):

        """ 사람인 사이트에 접근 시도 """

        self.selHandler = selWeb.Chrome(executable_path=self.chromDriver_path)

        self.selHandler.get(url=self.target_url)

        time.sleep(2)

        assert "사람인" in self.selHandler.title

        self.selHandler.find_element_by_id('login_person_id').send_keys(self.user_Info['id'])

        self.selHandler.find_element_by_id('login_person_pwd').send_keys(self.user_Info['pw'])

        self.selHandler.find_element_by_xpath('//*[@id="login_frm"]/fieldset/div/button').click()

        time.sleep(2)


        self.selHandler.find_element_by_link_text("지원현황").click()

        print ("지원현황 리스트를 확인 중 입니다.")

        time.sleep(2) # 2초 딜레이

        # 처음 페이지 ===============================================================

        t_html = self.selHandler.page_source

        html = BeautifulSoup(t_html, "html.parser")

        list_v = html.select_one("#applyStatusList > tbody")

        # 날짜/ 시간 정보

        info_day = list_v.select("tr > td.apply_date_row")

        info_day = [re.sub("[\n,\r,\t, ,]", "", i.text) for i in info_day]

        # 회사 이름

        cor_name = list_v.select("tr > td.apply_comp > a")

        cor_name = [e.attrs['title'] for e in cor_name]

        # 지원 내역

        info_sup = list_v.select("tr > td.apply_comp_cont > strong > a")

        info_sup = [e.attrs['title'] for e in info_sup]


        for d, c, s in zip(info_day, cor_name, info_sup):

            tmp_data = {"날짜":None, "시간":None, "회사":None, "지원":None}

            d_result = self.day_filter.search(d)

            t_result = self.time_filter.search(d)

            if d_result and t_result:

                # 날짜 정보

                indx = d_result.span()

                result_day = d[indx[0]:indx[1]]

                # 시간 정보

                indx = t_result.span()

                result_time = d[indx[0]:indx[1]]

                """

                    날짜, 시간, 회사, 지원

                """

                tmp_data['날짜'] = result_day

                tmp_data['시간'] = result_time

                tmp_data['회사'] = c

                tmp_data['지원'] = s

                self.saramin_data.append(tmp_data) # 데이터 적재

                # print (result_day, result_time, c, s)

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

        page_list = self.selHandler.find_elements_by_css_selector("#content > div > div.manage_list_wrap > div.page_nation > a")

        for p in page_list:

            p.click() # 페이지 클릭

            t_html = self.selHandler.page_source

            html = BeautifulSoup(t_html, "html.parser")

            list_v = html.select_one("#applyStatusList > tbody")

            # 날짜/ 시간 정보

            info_day = list_v.select("tr > td.apply_date_row")

            info_day = [re.sub("[\n,\r,\t, ,]", "", i.text) for i in info_day]

            # 회사 이름

            cor_name = list_v.select("tr > td.apply_comp > a")

            cor_name = [e.attrs['title'] for e in cor_name]

            # 지원 내역

            info_sup = list_v.select("tr > td.apply_comp_cont > strong > a")

            info_sup = [e.attrs['title'] for e in info_sup]


            for d, c, s in zip(info_day, cor_name, info_sup):

                tmp_data = {"날짜": None, "시간": None, "회사": None, "지원": None}

                d_result = self.day_filter.search(d)

                t_result = self.time_filter.search(d)

                if d_result and t_result:

                    # 날짜 정보

                    indx = d_result.span()

                    result_day = d[indx[0]:indx[1]]

                    # 시간 정보

                    indx = t_result.span()

                    result_time = d[indx[0]:indx[1]]

                    """

                        날짜, 시간, 회사, 지원

                    """

                    tmp_data['날짜'] = result_day

                    tmp_data['시간'] = result_time

                    tmp_data['회사'] = c

                    tmp_data['지원'] = s

                    self.saramin_data.append(tmp_data)  # 데이터 적재

                    # print(result_day, result_time, c, s)

            time.sleep(2)

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

        """

        데이터 출력

        """

        for i, u in enumerate(self.saramin_data):

            print ("{} :  {}".format(i+1, u))


        """

        MongoDB에 데이터 적재

        """

        self.mongodb_insert(element=self.saramin_data)


    # 소멸자

    # def __del__(self):

    #     self.wb.save("today.xlsx")


def main():

    sNode = STU01()        # 객체생성

    sNode.F_db_connect()   # 사람인 로그인 계정

    """

        내게 추천하는 회사 정보를 보시겠습니까? 

        본다 (Y) / 안본다 (N)

    """

    sNode.F_web_requests() # 사람인 사이트 요청

    sNode.F_data_check()

    """

        사람인 사이트에서 지원환 회사 정보들

    """

    # sNode.F_saramin_supp_list()


if __name__ == "__main__":

    main()



'언어 > python' 카테고리의 다른 글

python selenium  (0) 2018.11.15
hexcolor 사이트 python 크롤링  (0) 2018.11.06
python mysql  (0) 2018.11.04
간단한 주말 프로젝트  (0) 2018.11.03
카라바오 컵 파이썬 크롤링  (0) 2018.11.01