데이터 구조는 아래와 같다
## 데이터 전체 구조
data_structure={
'투자사 이름':'',
'투자 기업수':'',
'총 투자 횟수':'',
'선호 투자 단계':'',
'주요 투자분야':[ # 중복값 때문에 리스트로 변경
{
'category':'',
'count':''
}
],
'스타트업이 첫 투자':'',
'창업 3년미만기업':''
}
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
추가 설명 (아주 아주 짜증났던 부분)