class MainExample:
    def __init__(self):
        # Selenium headless
        self.crawl = Crawl(delay=20, telegram_notify=False, gui=True)
        self.aws = Resource()
        self.mysql = MySQL()

    @context_manager
    def transaction(self, keyword, control_instances):
        # Base page, 생략된 결과를 포함하여 검색
        self.crawl.fetch('https://www.google.co.kr/search?q={}&filter=0'.format(keyword))

        # 페이지 탐색
        self.navigate_page(5)

        # AWS 'Auxiliary' 인스턴스 실행
        self.aws.ec2_on_off(control_instances)

    def navigate_page(self, max_page):
        # paginate pattern
        # nav > tbody > tr > td.cur > span
        # nav > tbody > tr > td:nth-child([next]) > a > span
        cur_page = None
        for _ in range(max_page):
            # <a> 태그를 가진 Selenium Web Element 들의 객체 리스트
            a_tags_elements = self.crawl.chrome.browser.find_elements_by_css_selector('#rso div.rc h3.r a')

            # <a> 태그 추출
            a_tags = [a.get_attribute('href') for a in a_tags_elements]

            # 현재 페이지 데이터베이스 저장
            self.mysql.upload_page_lists(a_tags)

            # 현재 페이지 찾기
            paginate = self.crawl.chrome.browser.find_elements_by_css_selector('#nav > tbody > tr > td')
            for i, e in enumerate(paginate):
                if e.get_attribute('class') == 'cur':
                    cur_page = i
                    break

            # 다음 페이지 없음
            try:
                next_element = paginate[cur_page + 1].find_element_by_css_selector('a')
                next_page = next_element.get_attribute('href')
            except NoSuchElementException:
                break

            # 다음 페이지 요청
            self.crawl.fetch(next_page)