1. “혁신의 숲”에서 우리가 가져와야할 첫번째 데이터 - “Portfolio Data”

데이터 구조는 아래와 같다

## 데이터 전체 구조
data_structure={
    '투자사 이름':'',
    '투자 기업수':'',
    '총 투자 횟수':'',
    '선호 투자 단계':'',
    '주요 투자분야':[  # 중복값 때문에 리스트로 변경
        {
            'category':'',
            'count':''
         }
    ],
    '스타트업이 첫  투자':'',
    '창업 3년미만기업':''
}

2. 코드

2-1 ) get_company_details 함수 코드

첫 화면에서 아이템을 누른 상태에서 , 가져올 항목들 모두 크롤링 하고, 이전 버튼 눌러서 초기 화면으로 돌아가는 것까지의 함수이다.

# 현재 화면에서 가져올 항목들 모두 크롤링 하고, 이전 버튼 눌러서 초기 화면으로 돌아가는 것까지의 함수
def get_company_details():
    data={}
    try:
        # 투자사 이름
        # name_elements = driver.find_elements(By.CSS_SELECTOR, '#__next > main > div.css-7i90wo > div.css-1lboeqe > div > div > div:nth-child(1) > div.css-1vy2s1v > h1 > span')
        name_elements = driver.find_elements(By.XPATH, '//*[@id="__next"]/main/div[2]/div[1]/div/div/div[1]/div[2]/h1/span')
        for element in name_elements:
            data['투자사 이름'] = element.text
        
        #투자 기업수
        # invest_elements = driver.find_elements(By.CSS_SELECTOR, '#rightWrap > div:nth-child(2) > div.css-1ya8xf7 > dl > div:nth-child(1) > dd')
        invest_elements = driver.find_elements(By.XPATH,'//*[@id="rightWrap"]/div[2]/div[2]/dl/div[1]/dd')
        for element in invest_elements:
            data['투자 기업수'] = element.text

        #총 투자 횟수
        # total_count_elements = driver.find_elements(By.CSS_SELECTOR, '#rightWrap > div:nth-child(2) > div.css-1ya8xf7 > dl > div:nth-child(2) > dd')
        total_count_elements = driver.find_elements(By.XPATH,'//*[@id="rightWrap"]/div[2]/div[2]/dl/div[2]/dd')
        for element in total_count_elements:
            data['총 투자 횟수'] = element.text
        
        #선호 투자 단계
        # stages_elements = driver.find_elements(By.CSS_SELECTOR, '#rightWrap > div:nth-child(2) > div.css-1ya8xf7 > dl > div:nth-child(3) > dd')
        stages_elements = driver.find_elements(By.XPATH,'//*[@id="rightWrap"]/div[2]/div[2]/dl/div[3]/dd')
        for element in stages_elements:
            data['선호 투자 단계'] = element.text

        #주요 투자분야
        data['주요 투자분야']=[]
        for div_count in range(1,3):
            ie=1
            while True:
                # 요소가 있는지 먼저 점검
                elements = driver.find_elements(By.XPATH,f'//*[@id="investor6"]/div/div[1]/div/div[2]/div[1]/div[2]/div/div[{div_count}]/table/tbody/tr[{ie}]/td[2]/span')
                if not elements:  # 끝에 도달한 경우
                    break

                # category
                category_elements= driver.find_elements(By.XPATH,f'//*[@id="investor6"]/div/div[1]/div/div[2]/div[1]/div[2]/div/div[{div_count}]/table/tbody/tr[{ie}]/td[2]/span')
                for element in category_elements:
                    category=element.text

                # 투자 횟수
                count_elements= driver.find_elements(By.XPATH,f'//*[@id="investor6"]/div/div[1]/div/div[2]/div[1]/div[2]/div/div[{div_count}]/table/tbody/tr[{ie}]/td[3]/span')
                for element in count_elements:
                    count=element.text
                # 딕셔너리 생성
                new_entry = {'category': category, 'count': count}

                # data['주요 투자분야'] 리스트에 딕셔너리 추가
                data['주요 투자분야'].append(new_entry)
                ie += 1
                        

        
        #스타트업이 첫  투자
        first_startup_elements = driver.find_elements(By.XPATH, '//*[@id="investor2"]/div/div/div[1]/div[2]/div/div[5]/p/em')
        for element in first_startup_elements:
            data['스타트업이 첫  투자'] = element.text
        
        #창업 3년미만기업
        under3_elements = driver.find_elements(By.XPATH, '//*[@id="investor2"]/div/div/div[1]/div[2]/div/div[7]/p/em')
        for element in under3_elements:
            data['창업 3년미만기업'] = element.text

        results.append(data)
        # 잘 되었는지 result배열 확인 (한 세트 수집시마다)
        print(results)
        
        # 이전으로 돌아가는 버튼 누르는 코드 작성!
        driver.back()
        time.sleep(3)
        return
        
        
    except Exception as e:
        print(e)
    finally:
        return
        driver.quit()

2-2) 로그인(시작 지점)

# *** [START] 페이지 이동(전체 페이지 반복문임)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

item_count = 18# 항목 # 테스트용 20
page_count=3# 페이징 

# 로그인 : [1-85]는 다연 숙대 계정
# 1. 로그인 버튼 누르기
login_button_xpath =f'//*[@id="__next"]/header/div[1]/div/ul/li[1]/a'
login_button=WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, login_button_xpath)))
login_button.click()
# 2. 아이디 비번 입력
# 아이디 비밀번호 입력 필드 찾기
username_input = driver.find_element(By.XPATH, '//*[@id="__next"]/main/div[2]/div/div/form/div[1]/input')
password_input = driver.find_element(By.XPATH, '//*[@id="__next"]/main/div[2]/div/div/form/div[2]/input')
# 아이디와 비밀번호 입력
username_input.send_keys("[email protected]")
password_input.send_keys("Dayeon65!")
# 엔터키 누르기
password_input.submit()
# 투자자 화면으로 이동하는 것까지
driver.get('<https://www.innoforest.co.kr/dataroom/investor?page=16>')

2-3) 전체 루프

# 전체 실행 코드
while True:
    # 1-1.다음 아이템을 "찾는" try-catch
    try:
        # 한 페이지를 모두 읽어서 다음 페이지로 넘겨야 하는 경우의 try-catch
        try:
            # 📍 item 돌아가며 클릭해 내부 페이지로 이동
            print("******** "+str(item_count)+"번째 항목 *************")
            next_item_xpath = f'//*[@id="__next"]/main/div[1]/div[2]/div/article/table/tbody/tr[{item_count}]/td[1]'
            next_item = WebDriverWait(driver, 3).until(EC.element_to_be_clickable((By.XPATH, next_item_xpath)))
        except TimeoutException:
            # 📍 next_item이 없다면 == 끝까지 내려왔다면  > 페이징을 한다

            # a. 페이징 5번째까지 완료했을 경우 옆의 화살표(>) 누르기
						# 조건문이 2개인 이유 (아래 1️⃣ 에서 설명함)
            if(page_count==7):
                print("7 ) 페이징 5번째까지 완료했을 경우 옆의 화살표 누르기") # 테스트용 
                next_page_button_xpath='//*[@id="__next"]/main/div/div[2]/div/article[2]/div[3]/div[8]/a'
                next_page_button=WebDriverWait(driver, 3).until(EC.element_to_be_clickable((By.XPATH, next_page_button_xpath)))
                next_page_button.click()
                page_count=3
                time.sleep(3)
            elif(page_count==5):
                print("5 ) 페이징 5번째까지 완료했을 경우 옆의 화살표 누르기") # 테스트용 
                next_page_button_xpath='//*[@id="__next"]/main/div/div[2]/div/article[2]/div[3]/div[6]/a'
                next_page_button=WebDriverWait(driver, 3).until(EC.element_to_be_clickable((By.XPATH, next_page_button_xpath)))
                next_page_button.click()
                page_count=3
                time.sleep(3)

            # b. 다음 페이지로 넘어가기 (== 그냥 다음 숫자 페이지 선택)
            else:
                print("다음 페이지로 넘어가기") # 테스트용
                # 다음 페이지로 넘어가기
                page_count+=1 # 테스트용
                next_page_xpath=f'//*[@id="__next"]/main/div/div[2]/div/article[2]/div[3]/div[{page_count}]/span'
                next_page = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, next_page_xpath)))
                next_page.click() 
                time.sleep(3)
            # 새로운 페이지 이므로 item_count 재설정하고 next_item_css 재설정
            item_count = 1 
            next_item_xpath = f'//*[@id="__next"]/main/div[1]/div[2]/div/article/table/tbody/tr[{item_count}]/td[1]'
            next_item = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, next_item_xpath)))
            

        # 1-2. 다음 아이템을 "선택" click 
        next_item.click()
        time.sleep(5)
				# 아래 popup_button 이 필요한 경우(아래 2️⃣ 에 정리)
        # popup_button=WebDriverWait(driver, 3).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="__next"]/main/div[2]/div[5]/div/div[3]/button')))
        # popup_button.click()
        get_company_details()
        item_count += 1

        time.sleep(5)
        # 1-3. 한 아이템을 크롤링 할때마다 매번 엑셀로 저장
        excel_name = "innoforest_database0801ver13"
        data_frame = pd.DataFrame(results)
        # 전처리 (% 지우기)
        # data_frame['스타트업이 첫  투자'] = data_frame['스타트업이 첫  투자'].str.replace('%', '')
        # if( data_frame['창업 3년미만기업']):
        # data_frame['창업 3년미만기업'] = data_frame['창업 3년미만기업'].str.replace('%', '')
        data_frame.to_excel('{}.xlsx'.format(excel_name),sheet_name='{}'.format(excel_name),startrow=0,header=True)
        print("DATA_FRAME")
        data_frame_list = data_frame.to_dict(orient='records')
        print(data_frame_list)

        # if page_count==5 and item_count == 5: # 100개 카운트
        #     break
    
    # 아이템이 발견되지 않을때
    except NoSuchElementException: 
            print("NoSuchElementException")
            break

추가 설명 (아주 아주 짜증났던 부분)