from selenium import webdriver
import chromedriver_autoinstaller
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import csv
from selenium.common.exceptions import NoSuchElementException

list_result = []


for page_num in range(1, 3): # 1부터 n-1페이지까지
   
    # 브라우저 접속
    driver = webdriver.Chrome('')

    time.sleep(1.5)

    for i in range(1, 21):
       
        # 행 변수 추출

        # 기업명
        c_name = driver.find_elements(By.CSS_SELECTOR, f'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(12) > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child({i}) > td:nth-child(1) > a > font')
        var1 = c_name[0].text

        # 상장일
        date = driver.find_elements(By.CSS_SELECTOR, f'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(12) > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child({i}) > td:nth-child(2)')
        var2 = date[0].text

        # 현재가
        price_now = driver.find_elements(By.CSS_SELECTOR, f'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(12) > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child({i}) > td:nth-child(3)')
        var3 = price_now[0].text

        # 공모가
        public_off = driver.find_elements(By.CSS_SELECTOR, f'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(12) > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child({i}) > td:nth-child(5)')
        var4 = public_off[0].text

        # 시초가
        price_start = driver.find_elements(By.CSS_SELECTOR, f'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(12) > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child({i}) > td:nth-child(7)')
        var5 = price_start[0].text

        # 첫날종가
        price_first_end = driver.find_elements(By.CSS_SELECTOR, f'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(12) > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child({i}) > td:nth-child(9)')
        var6 = price_first_end[0].text
       
        # 상세페이지 진입
        page_in = driver.find_elements(By.CSS_SELECTOR, f'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(12) > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child({i}) > td:nth-child(1) > a > font')
        page_in[0].click()
       
        time.sleep(1)
       
        # 청약 경쟁률
        try:
            comp_1 = driver.find_elements(By.CSS_SELECTOR, 'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(6) > tbody > tr:nth-child(3) > td:nth-child(4)')
            if comp_1:
                var7 = comp_1[0].text
            else:
                var7 = None  # comp_1이 비어있는 경우
        except NoSuchElementException:
            var7 = None  # comp_1을 찾지 못하는 경우
       
        # 수요예측 경쟁률
        try:
            comp_2 = driver.find_elements(By.CSS_SELECTOR, 'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(17) > tbody > tr:nth-child(2) > td:nth-child(3)')
            if comp_2:
                var8 = comp_2[0].text
            else:
                var8 = None
        except NoSuchElementException:
            var8 = None  
           
        # 업종
        try:
            comp_3 = driver.find_elements(By.CSS_SELECTOR, 'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(3) > tbody > tr:nth-child(3) > td:nth-child(2)')
            if comp_3:
                var9 = comp_3[0].text
            else:
                var9 = None  
        except NoSuchElementException:
            var9 = None  
           
        # 종목코드
        code = driver.find_elements(By.CSS_SELECTOR, 'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(3) > tbody > tr:nth-child(2) > td:nth-child(4)')
        var10 = code[0].text
       
        # 신주모집 비율
        try:
            ratio = driver.find_elements(By.CSS_SELECTOR, 'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(6) > tbody > tr:nth-child(2) > td:nth-child(2)')
            if ratio:
                var11 = ratio[0].text
            else:
                var11 = None  
        except NoSuchElementException:
            var11 = None  
           
        # 공모 후 주식수
        try:
            num1 = driver.find_elements(By.CSS_SELECTOR, 'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(37) > tbody > tr:nth-child(1) > td > table > tbody > tr > td > span > font:nth-child(13) > table > tbody > tr:nth-child(38) > td:nth-child(3) > font')
            if num1:
                var12 = num1[0].text
            else:
                var12 = None  
        except NoSuchElementException:
            var12 = None  
           
        # 유통 가능 물량
        try:
            num2 = driver.find_elements(By.CSS_SELECTOR, 'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(37) > tbody > tr:nth-child(1) > td > table > tbody > tr > td > span > font:nth-child(13) > table > tbody > tr:nth-child(37) > td:nth-child(4) > font')
            if num2:
                var13 = num2[0].text
            else:
                var13 = None
        except NoSuchElementException:
            var13 = None  
           
        # 공모금액
        num3 = driver.find_elements(By.CSS_SELECTOR, 'body > table:nth-child(9) > tbody > tr > td > table:nth-child(2) > tbody > tr > td:nth-child(1) > table:nth-child(6) > tbody > tr:nth-child(4) > td:nth-child(4)')
        var14 = num3[0].text

        # 하나의 행으로 저장해 result에 행을 쌓기
        list_1 = [var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14]
        list_result.append(list_1)
       
        # 상세페이지 탈출
        driver.get(f'https://www.38.co.kr/html/fund/index.htm?o=nw&page={page_num}')
       
        time.sleep(1)
       
       

# CSV 파일에 데이터 쓰기
csv_file_path = 'IPO_yield.csv'

with open(csv_file_path, 'w', newline='', encoding='utf-8-sig') as csvfile: # utf-8-sig : 엑셀에서 한글 깨짐 방지
    csv_writer = csv.writer(csvfile)
   
    # 헤더 작성
    header = ['기업명', '상장일', '현재가', '공모가', '시초가', '첫날종가', '청약경쟁률', '수요예측 경쟁률', '업종', '종목코드', '신주모집 비율', '공모 후 주식수', '유통가능물량', '공모금액']
    csv_writer.writerow(header)

    # 데이터 작성
    for row in list_result:
        csv_writer.writerow(row)

print(f'Data saved to {csv_file_path}')